8

システムは Linux (Gentoo x64)、コードは C++ です。デーモン アプリケーションがあり、その複数のインスタンスが同じマシンで実行されています。アプリケーション自体がマルチスレッド化されています。しばらくの間、パフォーマンスに奇妙な遅延が見られました。

デバッグコードをいくつか入れた後、デーモンのいくつかのインスタンスが文字通り同時にブロックするという奇妙なことを思いつきました。これは、何らかの外部の理由または何かが原因であるとされています。簡単に言うと、次のようなシーケンスがあります。

  1. ログ時間 ( t1 )
  2. ロックミューテックス
  3. C++ std::list::push_back()/を呼び出しますpop_back() (つまり、非常に単純な数学)
  4. ミューテックスのロックを解除
  5. ログ時間 ( t2 )

ときどき、いくつかの独立した (!) プロセスで実行されている上記のシーケンスが、ステップ 2 (またはステップ 4 の確率) で、ステップ 3 の計算に関して非常に長い時間 (たとえば、0.5 - 1.0 秒) ブロックすることがはっきりとわかります。 )。証拠として、すべてのプロセスのログのt2が文字通り同じであることがわかります(数マイクロ秒で異なります)。プロセスの一部のスレッドが比較的異なる時間にセクションに入るように見えます ( t1の 0.5 から 1 秒の差がはっきりとわかります)、ミューテックスをロックし、ロックに不当な時間を費やしたとされる同じ時間にロックを解除しますログによると(t2 - t1差)。私には不気味に見えます。

この問題が発生することは比較的まれで、中程度の負荷がかかった状態で 5 ~ 10 分程度の頻度で発生します。テスト内で NTP タイム シフトはログに記録されません (これが実際の私の最初のアイデアでした)。NTP の場合、実際のサービスの遅延は発生せず、ログに誤った時刻が記録されるだけです。

どこから始めればよいですか?スケジューラーのチューニングを開始しますか? Linux でマルチスレッド プロセス全体を理論的にブロックできるものは何ですか?

4

1 に答える 1

1

次のコマンドでプログラムを実行します。

valgrind --tool=helgrind ./your_program

あなたはあなたが期待するより多くの問題を見つけるでしょう。

Valgrind(Helgrind)は、スレッド化されたアプリケーションの詳細なシナリオを提供します。現在、デプロイメントの前に必須です。

于 2013-02-15T18:35:58.957 に答える