ある Linux カーネルで実行した場合と別の Linux カーネルで実行した場合で、パフォーマンスが大幅に低下する、レイテンシーの影響を受けやすい「パイプライン」スタイルのプログラムがいくつかあります。特に、2.6.9 CentOS 4.x (RHEL4) カーネルではパフォーマンスが向上し、CentOS 5.x (RHEL5) の 2.6.18 カーネルではパフォーマンスが低下します。
「パイプライン」プログラムとは、複数のスレッドを持つプログラムを意味します。複数のスレッドが共有データで動作します。各スレッド間にキューがあります。したがって、スレッド A はデータを取得し、Qab にプッシュし、スレッド B は Qab からプルし、何らかの処理を行ってから Qbc にプッシュし、スレッド C は Qbc からプルします。最初のデータはネットワークからのものです (サードパーティによって生成されます)。
基本的に、データを受信してから最後のスレッドがタスクを実行するまでの時間を測定します。私たちのアプリケーションでは、CentOS 4 から CentOS 5 に移行すると、20 から 50 マイクロ秒の増加が見られます。
アプリケーションのプロファイリングにいくつかの方法を使用しましたが、CentOS 5 で追加されたレイテンシはキュー操作 (特にポッピング) によるものであることがわかりました。
ただし、タスクセットを使用してプログラムを使用可能なコアのサブセットにバインドすることにより、CentOS 5 でのパフォーマンスを向上させることができます (CentOS 4 と同じになります)。
そのため、CentOS 4 と 5 の間で、(おそらくカーネルに) いくつかの変更があり、スレッドが異なる方法でスケジュールされるようになりました (この違いは、アプリケーションにとって最適ではありません)。
この問題はタスクセット (または sched_setaffinity() を介したコード) で「解決」できますが、私の好みは、これを行う必要がないことです。バージョン間でデフォルトが変更された、ある種のカーネル チューナブル (またはチューナブルのコレクション) があることを願っています。
誰でもこれを経験したことがありますか?おそらく、さらに調査すべき領域がいくつかありますか?
更新:この特定のケースでは、問題はサーバー ベンダー (Dell) からの BIOS 更新によって解決されました。私はこれでかなり長い間髪を伸ばしました。基本に戻って、ベンダーの BIOS アップデートを確認するまでは。疑わしいことに、更新プログラムの 1 つに「最大パフォーマンス モードでパフォーマンスを向上させる」などの記述がありました。BIOS をアップグレードすると、CentOS 5 の方が高速でした。一般的に言えば、特に私のキュー テストと実際の運用実行では高速でした。