我有一個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)
你可以發佈一些代碼,表現出這個問題?我很難理解第一段中的含義。 「計算時間信息」 – jberryman
而你用'-threaded'編譯並用'-N'運行?顯示該問題的實際可執行程序是我期待的 – jberryman
是的。事實上,'-N'參數是我改變的唯一的東西。我無法提供實際的代碼。我會看看我能不能建立一個MWE,但我沒有希望。 –