簡體   English   中英

使用多個線程寫入多個文件時如何解決I / O瓶頸

[英]How to work around I/O bottleneck when writing to multiple files using multiple threads

我目前有一個多線程程序,可對網站進行爬網並將其文本寫入文件。 在CPU方面,我可以一次運行大量線程,但很快I / O成為瓶頸。 我當時以為我可以讓每個線程都寫入一個數組阻塞隊列,但是我知道我將產生比可用的32GB RAM更多的內存。 有沒有一種方法可以將Array達到一定大小后轉儲到文本文件中,以便釋放空間? 還是有其他方法可以解決我丟失的I / O問題?

讓我們來看看有一個SATA 2控制器,它允許以每秒300 MB的速度寫入數據。 現在有一個問題,我們假想的計算機的Internet連接帶寬是多少。 我知道以太網適配器支持的生產中的最后最大帶寬是每秒1 GB。 但是我認為這樣的Internet連接帶寬非常昂貴(我什至懷疑某些商用主機是否支持它)。 我認為每秒300 MB的Internet連接就足夠了。 讓我們的計算機擁有這樣的一個。

結果是

      Input (300 MB/s);

      Writing (300 MB/s).

繼續:如果要下載Internet,則必須增加連接和磁盤以及磁盤控制器。 否則,300 MB / s看起來不錯。 而且線程對您沒有幫助。 CPU和內存也與我們的問題無關。

我不會運行大量的線程。 我將在特定系統上分析不同數量的線程,直到找到提供最大吞吐量的讀取器線程數量。 我懷疑這個數字會很小。 基本上,您只希望在等待其他服務器響應時足以讓CPU繁忙。

對於要寫入的每個物理驅動器,我都會有一個寫入線程。 使用具有有限大小的BlockingQueue將讀取線程連接到編寫器線程; 如果讀取器離磁盤太遠,則會限制其活動。

我想這是磁盤I / O的瓶頸,因為繞過這么多文件,是嗎? 您能否一次寫入整個文件-爬網站點,將緩沖區添加到緩沖區集合,然后將緩沖區集合排隊到一個文件寫入線程? 順序寫入將提高磁盤性能,是嗎? 如果無法對整個站點進行緩沖,那么您可以在每個站點收集足夠的緩沖實例以使磁盤值得寫入時(我不知道,例如,當收集的總數超過64K時),然后將其從寫線程中排隊並開始執行。收集一組新的緩沖區。

改善多文件寫入延遲的簡單方法-獲取SSD。

使用更少的線程! 他們買的錢不多。 整個問題在一端是網絡綁定的,而在另一端是磁盤綁定的。 確實根本不涉及太多CPU。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM