しかし、最近、「オンデマンド」がI / O操作によって引き起こされるCPU負荷を「アイドル」として認識するという1つの欠点があることに気付きました。 これはどういう意味ですか? これは、I / O操作でプロセッサをロードするとき、プロセッサの周波数がしばしば低いレベルに留まることを意味し、システムがiowaitの悪名高いLinuxのバグに悩まされている場合に問題を引き起こします。
このオンデマンド動作に対処するには、2つの方法があります。
最初のオプションは、プロセッサの省電力モードを無効にすることです。 たとえば、それを含むスクリプトを修正します。 これは、「ondemand」という非常に論理的な名前で隠されており、/etc/init.dにあります。 このファイルの行を修正する場合
echo -n ondemand > $CPUFREQ
に
echo -n performance > $CPUFREQ
、プロセッサは常に最大周波数で動作します。
2番目のオプションは、iowaitを無視しない「オンデマンド」モードを有効にすることです。 これは、
/sys/devices/system/cpu/cpufreq/ondemand/io_is_busy
のオプションによって制御されます。 これを行うために、小さなinitスクリプトを作成しました。
#! /bin/sh ### BEGIN INIT INFO # Provides: io-is-busy # Required-Start: $ondemand # Required-Stop: # Default-Start: 2 3 4 5 # Default-Stop: # Short-Description: makes "ondemand" frequency governor to respect iowait load ### END INIT INFO case "$1" in start) start-stop-daemon --start --background --exec /etc/init.d/io-is-busy -- background ;; background) sleep 65 # waiting till ondemand finish its' work echo 1 > /sys/devices/system/cpu/cpufreq/ondemand/io_is_busy ;; restart|reload|force-reload) echo "Error: argument '$1' not supported" >&2 exit 3 ;; stop) echo 0 > /sys/devices/system/cpu/cpufreq/ondemand/io_is_busy ;; *) echo "Usage: $0 start|stop" >&2 exit 3 ;; esac
その後、スクリプトは
/etc/init.d/io-is-busy
ファイルに保存され、実行可能になり、コマンド
sudo update-rc.d io-is-busy defaults 99 99
システムに登録されます。
それだけです さて、プロセッサ負荷のI / O操作が増加すると、周波数は自動的に最大に上昇します。