2011-01-25 31 views
8

我正在開發一個在讀取日誌文件和在磁盤中寫入派生結果非常密集的C++應用程序(在Linux框中運行)。我想知道哪些是優化這些應用程序的最佳實踐:哪些是高清數據密集讀寫的最佳實踐?

  • 哪些操作系統調整可以提高性能?
  • 哪種編程模式可以提高IO吞吐量?
  • 是預處理數據(轉換爲二進制數據,壓縮數據等)一個有用的措施?
  • 組塊/緩衝數據是否有助於提升性能?
  • 我應該注意哪些硬件功能?
  • 哪些實踐最適合在這些應用程序中進行性能分析和測量?
  • (表達我在這裏失蹤的關注)

是否有一個良好的閱讀,哪兒能找到這種基礎,所以我可以適應現有的訣竅我的問題呢?

感謝

+0

數據保存在緩存和寫儘可能少,它太慢了。 – BlackBear 2011-01-25 14:57:01

回答

6

壓縮當然可以有很大的幫助,比調整操作系統要簡單得多。請查看Boost.IOStreams庫中的gzipbzip2支持。儘管如此,這會對處理器產生影響。

測量這些作業開始於time命令。如果系統時間與用戶時間相比非常高,那麼您的程序會花費大量時間進行系統調用。如果掛鐘(「真實」)時間與系統和用戶時間相比較高,則它正在等待磁盤或網絡。 top命令顯示該程序的CPU使用率顯着低於100%,這也是I/O瓶頸的一個標誌。

+0

通過duing`zcat bigfile.gz | ourprogram` vs`ourprorogram nos 2011-01-25 18:22:40

2

獲取有關您要寫入/讀取的卷的信息,並創建與卷的特性相匹配的緩衝區。例如10 * clusterSize。

緩衝幫助了很多,這樣可以最大限度地減少寫作量。

3

1)檢查你的磁盤的扇區大小。
2)確保磁盤被整理。
3)爲了提高緩存局部性(緩存由操作系統執行,許多硬盤也有內置緩存),讀取「本地」數據。
4)連續寫入數據。

對於寫入性能,緩存內存中的數據塊直到達到扇區大小的倍數,然後啓動異步寫入磁盤。不要覆蓋當前正在寫入的數據,直到確定數據已被寫入(即同步寫入)。雙緩衝或三重緩衝可以在這裏幫助。

爲了獲得最佳讀取性能,您可以雙重讀取緩衝區。因此,讓我們說你在讀取時緩存16K塊。將第一個16K從磁盤讀入塊1.啓動對塊2中的第二個16K的異步讀取。開始工作塊1.當完成塊1同步時,讀取塊2,並開始異步讀取到塊1中第3個16K塊放入塊1.現在在塊2上工作。完成第3個16K塊的讀取同步後,啓動第4個16K的異步讀入塊2,並在塊1上工作。沖洗並重復,直到處理完所有數據。

如前所述,你必須閱讀的時間就越少會失去從磁盤讀取,因此很可能是值得一讀的壓縮數據和花費的CPU時間擴大讀上每個塊的數據就越少。在寫入之前同等壓縮塊會節省磁盤時間。無論這是否勝利,取決於您對數據處理的CPU密集程度。

此外,如果在塊的處理是不對稱的(即處理塊1能夠採取的3倍,只要處理塊2)然後考慮三重或多種緩衝劑進行讀取。

2

由於這是這裏所說的,你應該檢查塊的大小。你用stat系列功能來做到這一點。 在struct stat中,此信息位於st_blksize字段中。

第二件事是功能posix_fadvise(),它給出建議OS約分頁。你告訴系統你將如何使用文件(甚至文件的片段)。您可以在手冊頁上找到更多信息。

+0

posix_fadvise()我不知道這個 - 謝謝你! :d – 2011-01-25 16:49:33

0

在Windows,用CreateFile()用FILE_FLAG_SEQUENTIAL_SCAN和/或FILE_FLAG_NO_BUFFERING而不是fopen()函數 - 至少在寫這篇立即返回,而不是等待數據刷新到磁盤