2011-08-23 77 views
3

我有一個在網絡上寫入大量數據的進程。假設它在機器A上運行,並通過NFS在機器B上轉儲大約70-80GB的文件。在進程1完成並退出後,我的進程2運行機器A並通過NFS從機器B獲取此文件。整個週期的瓶頸在於寫入和讀取這個龐大的數據文件。我怎樣才能減少這個I/O時間?我能否以某種方式將數據加載到內存中,即使在進程1退出後也可以使用進程2?如何避免物理磁盤I/O

我很欣賞這方面的想法。謝謝。

編輯:由於進程2'直接從網絡讀取'數據,最好是 先在本地複製數據,然後從本地磁盤讀取數據? 我的意思是將 (讀通過網絡時間)>(CP到本地硬盤)+(從本地磁盤讀取)

+1

爲什麼不把文件保存在機器A上? – Justin

+2

您可以將數據直接從流程1傳輸到流程2嗎? –

+0

你爲什麼把它存儲在B上? – RedX

回答

1

答案顯然是爲了減少網絡寫道 - 這似乎可以隨時保存你的指數規模,提高可靠性 - 將任何文件複製到另一臺機器似乎沒有意義,只能將其複製回來,所以爲了更準確地回答您的問題,我們需要更多信息。

2

如果要將數據加載到內存中,則需要70-80 GB的RAM。

最好的方法是將本地存儲(硬盤驅動器)連接到系統A以將本地文件保留。

0
  1. 您可以使用RAM磁盤作爲存儲
  2. NFS是緩慢的。嘗試使用替代方法將數據傳輸到另一臺PC。對於示例 - TCP/IP流。
  3. 另一個解決方案 - 您可以使用內存數據庫(TimesTen的樣品)
0

使用tmpfs利用內存(臨時)文件。

使用mbuffernetcat簡單地從一個端口到另一中繼而不存儲的中間流,但仍允許流以變化的速度進行:

MACHINE1:8001 - >機2:8002 - > machine3: 8003

在機2配置更像工作:

netcat -l -p 8002 | mbuffer -m 2G | netcat machine3 8003 

這將異體最多2臺數據需要緩衝。如果緩衝區填滿100%,machine2將剛剛開始阻止來自machine1的讀取,延遲輸出流而不失敗。

當MACHINE1已完成傳輸,直到mbuffer耗盡

1

有很多網絡和IO開銷,這種方法的第二netcat將呆在身邊。所以你可能無法進一步減少延遲。

  1. 由於文件超過80 GB,創建處理1將寫入和過程2可以從中讀取MMAP - 沒有涉及,僅使用計算機網絡 - 但仍然IO開銷是不可避免的。
  2. 更快:兩個進程可以同時運行,並且您可以擁有信號燈或其他信號機制,其中進程1可以指示進程2文件已準備好被讀取。最快的方法:讓進程1創建共享內存並與進程2共享。只要達到了限制(可以加載到內存中的最大數據塊,根據您的RAM大小),讓進程1的信號進程2數據可以被讀取和處理 - 只有當文件/數據實際上可以通過塊而不是80GB的一大塊來處理時,這種解決方案纔是可行的。
+0

共享內存大小有一個上限。我認爲默認是32MB。有沒有辦法通過我的應用程序來增加它? – user900563

+0

您可以通過'ipcs -l'查看限制,您可以通過'/ etc/sysctl.conf'更改限制。設置'kernel.shmmax = '並執行'sysctl -p'。您只能以root身份執行此操作。儘管'_sysctl()'可以從你的應用程序中實現,但是這個函數的使用已經被棄用了。 – Arun

1

無論你使用mmap還是普通read/write應該沒有什麼區別;無論哪種方式,一切都通過文件系統緩存/緩衝區發生。最大的問題是NFS。唯一可以提高效率的方法是將中間數據本地存儲在機器A上,而不是通過網絡將其發送到機器B,然後再將機器B再次拉回。

+0

這是一個很好的觀點。有沒有可以用作本地存儲的安全裝載?我可能沒有寫'cwd'的權限.. – user900563

+0

使用'shm_open'。 –