torutkのブログ

ソフトウェア・エンジニアのブログ

RHEL6でマルチスレッドプログラムが遅くなった

以前RHEL5で開発したプログラムをRHEL6で動かしたときに、処理が遅くなったという問題が生じたので関連情報をメモ。

遅くなったのは、主にバックグラウンド処理(非UI処理)で、GUI操作で遅いという問題は挙がっていませんでした。top等でその状況をみるとCPU使用率が高いという点がRHEL5との違いです。

RHEL6で変わったこと

OSの中核機能たるスケジューリングがかなり変わっていますね。初めて知りました。

ticklessとは、100Hz-1000Hzの周期的な割り込み(tick)によってタスクの切り替えやCPU使用時間などのアカウンティングをしていたものを、周期的な割り込みをやめて、必要な都度タイマー割り込みを発生させる(ワンショットタイマーを随時設定するようなイメージでしょうか?)ということになっているようです。

マルチスレッド、遅い、についての情報

  • Cステートの制御はBIOSで無効にしてもLinuxカーネルに含まれるintel_idleドライバがBIOSと無関係にCステートの制御を行う
  • intel_idleドライバを無効にする(acpi_idleドライバを使う)設定

intel_idle.max_cstate=0
processor.max_cstate=n ※ nは0から3の値を入れる

intel_idle.max_cstate=0を設定すると、intel_idleドライバを無効にします(Cステートの最大を0にする意ではない)。