Web パフォーマンスの常習者として、システム パフォーマンスを改善し、Web アプリケーションを高速化する方法を常に探しています。そして今日は、CPU 周波数スケーリングの魔法と、CPU 周波数スケーリングを無効にしてシステムをフル CPU 速度で実行するための実用的なガイドを紹介します。
CPU 周波数スケーリングを無効にする方法に入る前に、CPU スロットリングとは何かを理解しましょう。
CPU周波数スケーリングとは?
カーネル v. 2.6.18 (CentOS) および 2.6.32 (Ubuntu) 以降、動的 CPU 周波数スケーリング (別名 CPU スロットリング) と呼ばれる新機能が導入されました。
この CPU 周波数スケーリングにより、プロセッサは最大許容周波数よりも低い周波数で実行できます。これは電力消費を抑えるためだけに行われますが、これの欠点は、CPU 速度をフルに活用できないことです。
CPU の実行速度を確認するにはどうすればよいですか?
以下に示すように、このコマンドを実行します。
grep -E '^model name|^cpu MHz' /proc/cpuinfo
出力は次のようになります:
[[email protected]:~]grep -E '^model name|^cpu MHz' /proc/cpuinfo model name : Intel(R) Xeon(R) CPU E3-1240 V2 @ 3.40GHz cpu MHz : 1600.000 model name : Intel(R) Xeon(R) CPU E3-1240 V2 @ 3.40GHz cpu MHz : 1600.000 model name : Intel(R) Xeon(R) CPU E3-1240 V2 @ 3.40GHz cpu MHz : 1600.000 model name : Intel(R) Xeon(R) CPU E3-1240 V2 @ 3.40GHz cpu MHz : 1600.000 model name : Intel(R) Xeon(R) CPU E3-1240 V2 @ 3.40GHz cpu MHz : 1600.000 model name : Intel(R) Xeon(R) CPU E3-1240 V2 @ 3.40GHz cpu MHz : 1600.000 model name : Intel(R) Xeon(R) CPU E3-1240 V2 @ 3.40GHz cpu MHz : 1600.000 model name : Intel(R) Xeon(R) CPU E3-1240 V2 @ 3.40GHz cpu MHz : 1600.000
ご覧のとおり、元の CPU 速度は 3.40 Ghz ですが、Mhz での実行中の CPU 速度は約 1600 です。CPU は合計速度の半分で実行されています。
これは、cpufrequtils / cpupoweruitls と呼ばれるクールな CPU パッケージでも実現できます
CentOS/Debian に cpupowerutils をインストール
yum install cpupowerutils -y
Ubuntu/Debian に cpupowerutils をインストール
apt-get install cpufrequtils
このコマンドを実行すると、CPU の最小速度と最大速度などの詳細が表示されます。
cpupower frequency-info
予想される出力は次のようになります:
[[email protected]:~]cpupower frequency-info analyzing CPU 0: driver: intel_pstate CPUs which run at the same hardware frequency: 0 CPUs which need to have their frequency coordinated by software: 0 maximum transition latency: Cannot determine or is not supported. hardware limits: 1.60 GHz - 3.80 GHz available cpufreq governors: performance powersave current policy: frequency should be within 1.60 GHz and 3.80 GHz. The governor "powersave" may decide which speed to use within this range. current CPU frequency: 1.60 GHz (asserted by call to hardware) boost state support: Supported: yes Active: yes 3600 MHz max turbo 4 active cores 3700 MHz max turbo 3 active cores 3800 MHz max turbo 2 active cores 3800 MHz max turbo 1 active cores
Linux (RedHat および Ubuntu) で CPU 周波数スケーリングを無効にする
最も一般的な Linux プラットフォームで CPU 周波数スケーリングを無効にする方法を見てみましょう。
CentOS / RHEL ユーザー向け
次のコマンドを使用して、CPU 周波数を利用可能な最大速度に変更しましょう:
cpupower frequency-set -g performance
CPU の実行速度に変化があるかどうかをもう一度見てみましょう:
[[email protected]:~]grep -E '^model name|^cpu MHz' /proc/cpuinfo model name : Intel(R) Xeon(R) CPU E3-1240 V2 @ 3.40GHz cpu MHz : 3497.218 model name : Intel(R) Xeon(R) CPU E3-1240 V2 @ 3.40GHz cpu MHz : 3392.296 model name : Intel(R) Xeon(R) CPU E3-1240 V2 @ 3.40GHz cpu MHz : 3397.742 model name : Intel(R) Xeon(R) CPU E3-1240 V2 @ 3.40GHz cpu MHz : 2283.578 model name : Intel(R) Xeon(R) CPU E3-1240 V2 @ 3.40GHz cpu MHz : 3457.640 model name : Intel(R) Xeon(R) CPU E3-1240 V2 @ 3.40GHz cpu MHz : 2133.234 model name : Intel(R) Xeon(R) CPU E3-1240 V2 @ 3.40GHz cpu MHz : 1600.257 model name : Intel(R) Xeon(R) CPU E3-1240 V2 @ 3.40GHz cpu MHz : 3740.265 [[email protected]:~]
前のコマンドでわかるように、CPU は必要なときに以前よりも高い速度で実行されています。
手動で行う別の方法は、次のコマンドを実行して、すべての CPU の CPU ガバナーを「オンデマンド」モードから「パフォーマンス」モードに変更することです:
for CPUFREQ in /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor; do [ -f $CPUFREQ ] || continue; echo -n performance > $CPUFREQ; done
システムで CPU 速度を制御するデーモンが実行されている場合は、それらを停止して、システムをフル CPU 速度 (cpuspeed、cpufreqd、または powerd) で実行します。
service cpuspeed stop
Ubuntu / Debian ユーザー向け
このファイルを編集し、存在しない場合は作成してください:
nano -w /etc/default/cpufrequtils
内部に次の行を追加します:
GOVERNOR="performance"
CTRL + X を押して保存し、Y を押します。
次のステップ:オンデマンド デーモンを無効にして、サーバーの再起動後に変更内容が失われないようにし、次のコマンドを実行します:
update-rc.d ondemand disable
それで全部です。次のコマンドで設定をもう一度確認してください:
cpufreq-info
結論
CPU をフルスピードで実行すると、アプリケーションのパフォーマンスが大幅に向上します。最近のほとんどの CPU はすでに非常に優れた CPU 冷却システムを備えているため、これは問題にはならないはずですが、これが余分な電力消費や CPU の過熱を引き起こさないように注意してください。ご覧のとおり、RedHat ベースと Debian ベースのディストリビューションの両方で、CPU 周波数スケーリングを簡単に無効にすることができます。これについて問題や質問がある場合はお知らせください。
さらに読む:
- cpufreq を使用した Linux での CPU 周波数のスケーリング
- ArchLinux CPU 周波数スケーリング ドキュメント
- RedHat CPUFreq ガバナーのドキュメント