2015-07-21 22 views
1

不知道這是這個問題的最佳標題,但在這裏。爲什麼多個過程變慢?

通過python/Qt我啓動了一個可執行文件的多個進程。每個進程都將大塊文件(〜20GB)分塊寫入磁盤。我發現第一個啓動過程始終是最後一個完成並且持續很多,比其他過程長得多(儘管具有相同數量的寫入)。

性能監視器顯示該進程仍在使用預期數量的RAM(〜1GB),但進程中的磁盤活動已經減慢爲緩慢。

爲什麼會發生這種情況?就好像第一個進程以某種方式啓動了其他進程阻止的'磁盤訪問',然後在其他進程結束後不能恢復...

操作系統(windows)會導致這種情況嗎?我能做些什麼來緩解這種情況?

+0

我會研究存儲介質的連續寫入速度,並比較保存該數據量的時間。由於內部緩存,硬盤驅動器可以快速接收短暫的突發數據,但大型文件(順序寫入)至少需要一定的時間。我懷疑,通過多進程寫入磁盤,可以獲得更好的寫入性能。在我看來,多個進程的開銷,以及在文件流之間切換來寫入,性能反而會更糟糕。 – Aaron

回答

2

如果您真的有資源可以更快地解決問題,那麼並行性(任何類型)只會導致加速。

Before thinking of optimizing your program,你應該仔細分析是什麼導致它運行(主觀)慢 - bottleneck

儘管我對你的程序有什麼樣的瓶頸一無所知,但它向磁盤寫入大量數據的事實是一個很好的暗示,它可能是I/O bound

當一個程序是I/O限制,傳統的單機並行化技術(線程,多進程)比沒用糟糕- 他們實際上傷害了性能,特別是如果你正在處理一個旋轉盤。發生這種情況是因爲一旦有多個進程在不同的地方訪問磁盤,硬盤驅動器頭必須在這些進程之間seek

您的操作系統的I/O scheduler可能會影響一旦您有多個進程訪問I/O以及進程如何分配磁盤訪問,性能會變慢。你可以考慮切換你的操作系統,但只有當這些多個進程是需要擺在首位。


有了這樣說,什麼可以你變得更好(I/O)性能?

  • 獲得更好的磁盤(或SSD)
  • 獲取多個磁盤(每個進程之一)
  • 獲取多個機器
0

沒有保證,而I/O調度的公平性。您所描述的內容看起來相當簡單:I/O調度程序無論是否有意爲新進程提供支持。由於您的磁盤已分出,因此處理完成的順序不受您的控制。由於多個進程的並行訪問,您很可能會在搜索時浪費大量磁盤帶寬。

TL; DR:您的期望是沒有根據的。當I/O,特別是虛擬內存系統飽和時,會發生任何事情。事實如此。