2014-01-06 33 views
0

我需要在Linux(CentOS)下的Java和C++程序之間傳輸大量的數據。性能是首要關注的問題。 什麼是最佳選擇? RAMDisk(/ dev/shm /)還是本地套接字?IPC:Ramdisk V.S. socket

+1

你有沒有運行任何測試? –

+1

/dev/shm不是ramdisk,ramdisk是一塊被視爲磁盤驅動器的內存。/dev/shm是共享內存。 – paxdiablo

+0

OK,/ dev/shm不是RAM磁盤,但它非常相似 - 至少有類似的性能。 我的情況是有16個客戶端會生成大量小文件(小於1MB)並將這些文件發送到服務器(客戶端和服務器位於同一主機中)。數據總量將約爲1TB。 如果我使用IPC的/ dev/shm,這些文件將被寫入一個子文件夾中,當文件夾大於100MB時,客戶端將創建另一個文件夾並將新數據文件寫入新文件夾。當文件夾已滿(超過100MB)時,客戶端將通知服務器進行處理。 – avhacker

回答

1

套接字是最快的,因爲在完成發送數據之前,另一端可以開始處理數據(在單獨的cpu內核上)。假設你發送了100KB的數據,另一端只要收到幾千字節就可以開始處理。到所有100KB已發送時,它可能已經完成處理90KB或其附近,所以它只剩下10KB。

雖然有了RAM盤,但你必須先寫整個100KB纔可以,即使開始處理數據。假設兩端都需要執行大致相同的工作量,那麼使用套接字比使用內存磁盤快10倍。

可能需要1毫秒才能將100KB寫入RAM磁盤,然後1毫秒來處理它。使用套接字時,發送數據需要1毫秒,但在發送所有數據後僅需0.1毫秒即可完成處理。

發送的數據量越大,套接字的性能增益越大。 10秒後寫入所有數據,並在發送完所有數據後再處理0.1毫秒。

但是,RAM磁盤更容易使用。套接字使用數據流,在編寫代碼和調試/測試方面更耗費時間。

此外,不要以爲你需要一個RAM磁盤。根據操作系統配置如何將100MB寫入旋轉磁盤硬盤驅動器,可能只需將其寫入RAM高速緩存,然後將其放在硬盤驅動器上即可。您可以立即從臨時RAM緩存中讀取它,而無需等待將數據寫入HDD。在做出性能假設之前總是測試。不要認爲硬盤比RAM慢,因爲它可能會爲你默默地進行優化。

我正在輸入這個mac,就像CentOS那樣的UNIX,目前有大約8GB的RAM專用於保存它猜測我將在不久的將來某個時間點閱讀的文件的副本。我不必手動創建RAM磁盤,只需將它們放入啓發式RAM即可。 CentOS也做同樣的事情,你必須測試它看看它實際上有多快。

但套接字絕對是最快的選擇,因爲您不需要編寫所有的數據來開始處理它。

+0

不一定,您可以將共享內存劃分爲塊。如果您分享的內容之一是讀寫指針(當然,使用跨進程信號保護),您甚至可以像套接字一樣執行此操作。 – paxdiablo

+0

@paxdiablo true。皮膚有很多種方法去皮膚。我假設「RAM Disk」意味着在RAM中創建一個ext文件系統並掛載它,然後寫入整個數據塊並提供到另一個進程的路徑,這是發送數據的簡單而有效的方式,不想花時間學習更復雜的方法。 –