4

我有一個AWS實例。我想運行一堆任務,一些內存和CPU密集型。理想情況下,我想計算每個任務的時間信息。如果我以串行方式運行它,它會計算準確的時間信息,但速度很慢。如果我並行運行它們,整個事情會更快,但是單獨的任務會更慢,正如牆壁時間和線程CPU時間所報告的那樣。如何避免長時間運行的並行和併發Haskell計算中的性能下降

這種放緩隨着線程的數量增加至CPU的

粗略的檢查與ghc-events-analyze數量和+RTS -s表明減速的來源是(勿庸置疑)GC暫停。使用RTS選項顯示+RTS -qg -qb -qa -A256m(禁用並行GC,禁用負載平衡GC,禁用線程遷移以及增加GC分配區域)改善了這一點,但並未完全消除它。

我正在使用forkIO運行線程,但是除了打印進度信息之外,線程是獨立且純粹的。我使用parallel-io來管理正在運行的線程的數量,但是當我簡要地嘗試了一種更傳統的方法時,我需要一個固定的線程池和一個任務隊列,但我仍然遇到了這個問題。

有關如何調試的任何建議?

編輯:

@jberryman要求一個例子。每個任務看起來像下面的代碼

computation params = do 
    !x <- force params 
    print $ "Starting computation on " ++ show params 
    t1 <- getCPUTime 
    !y <- fmap force $ do $ 
    ...some work with x ... 
    t2 <- getCPUTime 
    print $ "Finished computation on " ++ show params 
    return (t2 - t1, y) 
+0

你可以發佈一些代碼,表現出這個問題?我很難理解第一段中的含義。 「計算時間信息」 – jberryman

+1

而你用'-threaded'編譯並用'-N'運行?顯示該問題的實際可執行程序是我期待的 – jberryman

+0

是的。事實上,'-N'參數是我改變的唯一的東西。我無法提供實際的代碼。我會看看我能不能建立一個MWE,但我沒有希望。 –

回答

2

由於任務都是獨立的,並且您使用的是AWS實例(這可能是Linux的),你會使用forkProcess可能有更好的結果。這樣,每個進程都有自己的GC池,當進程退出時它將被釋放,並且父進程不必擔心爲子進程保留多於進程ID並等待它們死亡。

相關問題