システムはLinux(Gentoo x64)です。コードはC++です。私はデーモンアプリケーションを持っていますが、そのいくつかのインスタンスは同じマシン上で実行されます。アプリケーションはマルチスレッド化されています。しばらくの間、私はそのパフォーマンスに奇妙な遅れを見てきました。独立したマルチスレッドプロセスは同時にブロックします
デーモンのいくつかのインスタンスが何らかの外的要因などによって文字通り同時にブロックされた場合、デバッグコードを記述した後、私は奇妙なことを思いつきました。それはすべてがシンプルに置くために、私はこのような配列を有する:
- ログ時刻(T1)
- ロックミューテックス
- コールC++
std::list::push_back()
/pop_back()
(すなわち、非常に単純な数学) - ロック解除ミューテックス
- ログ時間(T2)
私は、時々、ステップ3の数学に関して実際に過度の時間(例えば、0.5〜1.0)のために、いくつかの独立した(!)プロセスで実行されている上記のシーケンスがステップ2(またはステップ4のprobaby)秒)。証拠として、私はすべてのプロセスのログにのt2が文字通り同じであることを見ています(数マイクロ秒で違います)。プロセスのいくつかのスレッドが比較的異なる時間にセクションに入るようです(私は明らかにt1の0.5-1秒の差を見ることができます)、ミューテックスをロックして、不当な時間を費やして同じ時間にロックを解除しますログに従ったロック(t2 - t1の違い)。私にはうんざりしています。
中程度の負荷で約1〜5分ほどで、問題の症状は比較的まれです。 NTPタイムシフトはテスト内に記録されません(これは実際に私の最初のアイデアでした)。それがNTPの場合は、サービスの遅延が発生することはなく、ログには間違った時間しかありません。
どこから始めますか?スケジューラのチューニングを開始しますか?理論上、Linuxのマルチスレッドプロセス全体をブロックすることはできますか?あなたが期待するより多くの問題を発見します
valgrind --tool=helgrind ./your_program
:
したがって、mutexはスレッドによって共有されるリソースを保護します。ブロック動作を見たときにスレッド数は分かりますか?つまり、その瞬間に大量のスレッドがすべてターンを待っている場合、これは奇妙ではないかもしれません。また、リソースへのアクセスに時間の大きな変動性がある理由はありますか? – nckturner
これが起こると、システムのメモリ圧を監視することができます。 push_backは仮想割り当てを引き起こす可能性のある割り当てを実行することができ、システム上のコミット総額がすでに高くなっている場合に遅れが生じる可能性があります。 – nanda
このシーケンスは何と呼ばれていますか?どのくらいの頻度で実行されますか? – ethrbunny