Linux では、プロセス コンテキストの切り替えを特定するために私が見つけた最も信頼できる方法は、次のコマンドを使用することです。
pidstat -hluwrt | grep "processname"
「tid」列 (#3) は「gettid()」と同じであるため、開発者は、CPU とコンテキストの切り替えを使用しているスレッドを直接関連付けることができます。プログラムが gettid() 値を吐き出すためにスレッドが生成されたときに、printf("%lul",gettid())を実行することをお勧めします。
プロセス コマンド ラインの前の最後の 2 列は、1 秒あたりの「cswtch/s」(自発的) および「nvcswtch/s」(非自発的) コンテキスト スイッチ カウントです。
「cswtch/s」が高い (1000 秒) 場合、プロセスは「ウェイク」と「スリープ」を過度に循環しています。スレッドを提供するために何らかの種類のバッファを検討して、より長い起動時間とスリープ時間を許可することをお勧めします。例: バッファがいっぱいでない場合、スレッドはより長くスリープ状態になります。バッファーがいっぱいになると、スレッドはバッファーが空になるまで起動されます。
「nvswtch/s」が高い (1000 の) 場合、これはシステムの負荷が高く、個々のスレッドが CPU 時間を競合している兆候です。サーバーの負荷、サーバー上のアクティブなプロセスとスレッドの量を調査することをお勧めします。「top」または「htop」はあなたの友人です。
次のスクリプトは、プロセスのスレッド化をデバッグ/最適化するのに役立ちます (20 秒ごとに出力します)。
stdbuf -oL pidstat -hluwrt 20 | stdbuf -oL grep -e "processname" -e "^#"
gettid のドキュメント: (ドキュメントはこちら)
pidstat のドキュメント: (ドキュメントはこちら)
stdbuf のドキュメント: (ドキュメントはこちら)