やや大きなマシン (32 コア、256 GB RAM) で作成したマルチスレッド プログラムのプロファイルを作成しようとしています。実行ごとに、プログラムのパフォーマンスが大幅に (70 ~ 80%) 変わる可能性があることに気付きました。プログラムのパフォーマンスにおけるこの巨大な差異の原因を見つけることはできないようですが、多数の実行で「時間」ユーティリティの結果を分析することによって、非自発的なコンテキスト スイッチの数が、プログラムのパフォーマンス (明らかに、コンテキスト スイッチが少ないほどパフォーマンスが向上し、その逆も同様です)。
このコンテキスト切り替えの原因を特定する良い方法はありますか? 犯人を発見できれば、問題を解決できるかもしれません。ただし、使用できるツールにはいくつかの特定の制限があります。まず、マシンのルート権限を持っていないため、そのような権限を必要とするツールはありません。第 2 に、これはかなり古いカーネル (RHEL5、カーネル 2.6.18) であるため、標準的な perf-event の一部が存在しない可能性があります。とにかく、このコンテキスト切り替えの原因をより深く掘り下げる方法についての提案は大歓迎です。
アップデート:私は自分のプログラムを別の (そして小さい) マシンでテストすることにしました。もう一方のマシンは、8Gb の RAM を搭載した 4 コア (ハイパースヘディング付き) の Linux ボックスで、カーネルははるかに新しいものです --- 他のマシンでは 3.2.0 対 2.6.18 です。新しいマシンでは、バイモーダル パフォーマンス プロファイルを再現できません。これは、問題がハードウェアの問題 (コメントで示唆されているように) によるものか、カーネルレベルでの特に病理学的なケースが原因であり、その後修正されたものであると私に信じさせます。私の現在の最良の仮説は、新しいマシンには完全に公平なスケジューラ (CFS) を備えたカーネルがあり、古いマシンには含まれていないという事実の結果である可能性があるというものです。新しいマシン用に古いカーネル バージョンを再コンパイルすることなく、この仮説をテストする (新しいマシンに別の/古いスケジューラを使用するように指示する) 方法はありますか?