0

2 つのスレッドがあり、1 つは TCP 接続を受け入れて要求を処理します。処理が完了すると、ツリー内のレコードに DELETE フラグがマークされます。別のスレッドが基本的にこのツリーで gc を実行しています。DELETE フラグが設定されている場合は、大きな for ループでツリーを横断し、ノードを削除します。各反復内には、この gc スレッドが CPU を使いすぎないようにするためだけに pthread_yield() があります。

問題は、このツリーが非常に大きい場合、gc スレッドが CPU を使いすぎて、TCP スレッドの select() と epol.wait(0) が戻るのに時間がかかりすぎることです。 .

ここで、大きな for ループを小さなループに分割して、前回の実行で終了したところから gc を開始するようにすると、CPU ホギングの問題は発生しなくなりました。

何故ですか?

スレッド切り替え統計をプログラムでログ/監視するために使用できる API はありますか? Linux ボックスには、valgrind も gcc コンパイラもありません。

4

0 に答える 0