Ubuntuのオンデマンドおよびiowaitプロセッサの周波数制御ポリシー

Ubuntuの最新バージョンでは、オンデマンドプロセッサ周波数制御ポリシーはデフォルトで有効になっています。 このことは、プロセッサの負荷が小さいときにプロセッサの周波数を可能な限り低く設定するため、省エネの観点から非常に便利です。



しかし、最近、「オンデマンド」が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操作が増加すると、周波数は自動的に最大に上昇します。



All Articles