4

私はAWSインスタンスを持っています。私は仕事の束、いくつかのメモリとCPUの集中を実行したいと思います。理想的には、各タスクのタイミング情報を計算したいと思います。私がそれらを連続して実行すると、正確なタイミング情報が計算されますが、遅いです。私がそれらを並行して実行すると、全体の処理は速くなりますが、壁の時間とスレッドのCPU時間の両方によって報告されるように、個々のタスクは遅くなります。長時間実行の並列Haskell計算と並列Haskell計算でのパフォーマンス低下を回避する方法

この減速増加スレッドの数は、ghc-events-analyze+RTS -s付きのCPU

大まかな検査の数まで増加させるように減速のソースは(当然)GCの一時停止であることを示唆しています。 RTSオプションを使用すると、+RTS -qg -qb -qa -A256m(パラレルGCを無効にし、ロードバランシングGCを無効にし、スレッドの移行を無効にしてGC割り当て領域を増やす)ことで改善されますが、完全に排除するわけではありません。

私はforkIOを使用してスレッドを実行していますが、スレッドは印刷の進捗情報とは別に独立しており、純粋です。私はparallel-ioを使用して実行中のスレッドの数を管理していますが、スレッドとタスクキューの固定プールを持っている従来のアプローチを簡単に試してみましたが、まだこの問題がありました。

どのようにデバッグするのですか?

編集:

@jberrymanが例を求めました。各タスクは、タスクはすべて独立しており、あなたが(おそらくLinuxの場合)AWSインスタンスにしているので、あなたはおそらくforkProcessを使用して、より良い結果を持っています以下のコード

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

のように見えます。この方法では、各プロセスには独自のGCプールがあり、プロセスが終了すると解放され、プロセスIDを超えるプロセスIDを保持し、それらが終了するのを待つ必要はありません。

関連する問題