web-dev-qa-db-ja.com

CPU周波数のスケーリングが2.80 Ghzで止まり、ダウンしない

Ubuntu 16.04 LTSをgnomeデスクトップで使用しています。ガバナーを「オンデマンド」に設定しましたが、CPUは依然として最高周波数で動作します。

私は多くのことを試しましたが、2.80 Ghzで何時間も動かなくなりました。 「scaling_max_freq」と「scaling_min_freq」は同じことを示しています:2801000

1
erenesto

これらの手順 で問題を解決しました

K/X/Ubuntuまたは別のDebianベースのマシンでは、周波数スケーリングを機能させるためにcpufrequtils(Sudo apt-get install cpufrequtils)をインストールしようとするだけです。それがあなたのためにそうするなら、あなたは以下の正しいモジュールを見つけてロードする部分を通過する必要はありません。スケーリングガバナーの構成に関するセクションに進んでください。

カーネルバージョン

カーネルバージョンが少なくとも2.6.12であることを確認して、言及されるすべての可能なガバナーを利用します。すべての周波数スケーリングは、ユーザースペースガバナーではなく、カーネルモジュールで行われます。

BIOSでサポートを有効にする

BIOSに入り、CPUでCool'n'Quiet(AMD)またはSpeedStep(Intel)が有効になっていることを確認します。一部のBIOSにはオプションがありません。オプションが見つからない場合は、おそらくデフォルトで有効になっています。残念ながら、BIOSにはオプションがありますが、完全に別の名前としてリストされています。その場合は、BIOSのマニュアルで詳細を確認してください。

ユーザースペースのCPUスケーリングプログラムを削除します

プロセッサの周波数を調整するために実行できるユーザー空間プログラムがいくつかあります。これらを必要としないように、カーネルでCPUをスケーリングします。もしあれば、今すぐ削除します。特定の状況で役立つ可能性があるため、これらを調べることをお勧めします。この記事では、カーネルモジュールを使用したスケーリングのみを扱います。

Sudo apt-get remove powernowd cpudyn cpufreqd powersaved speedfreqd

CPU用のモジュールをインストールします

システムをインストールすると、デフォルトでCPUが検出され、スケーリングに必要なモジュールがすでに実行されている可能性が非常に高くなります。以下は、使用しているプロセッサのタイプを識別するのに役立つコマンドです。

cat /proc/cpuinfo

これを知ったら、どのカーネルモジュールをロードする必要があるかがわかります。ロードされているカーネルモジュールを確認するコマンドを次に示します。

lsmod

以下は、CPUの説明と、使用しているプロセッサに基づいてカーネルモジュールをロードするために使用されるコマンドです。上記のlsmodからの出力を見て、以下の「modprobe」という単語の後にモジュール名を使用して、すでにモジュールがロードされているかどうかを確認します。その場合は、次のステップに進んでください。そうでない場合は、見つけたCPU情報を使用して、ロードする必要があるモジュールを見つけます。次に、コマンドを実行してロードします。

CPU:PIII-MまたはP4(推定2モジュールタイプなし)。

Sudo modprobe speedstep-ich

または

Sudo modprobe speedstep-smi

CPU:Intel Core Duo、Intel Core2 DuoまたはQuad、またはIntel PentiumM。これは、後のカーネルのacpi-cpufreqモジュールにマージされました。

Sudo modprobe speedstep-centrino

CPU:Intel Celeron、Xeon、およびPentium 4プロセッサー

Sudo modprobe p4_clockmod

CPU:AMD K6。ソケットタイプ:ソケット7

Sudo modprobe powernow-k6

CPU:AMD Sempron/Athlon/MP(K7)。ソケットタイプ:A、スロットA.

Sudo modprobe powernow-k7

CPU:AMD Duron/Sempron/Athlon/Opteron 64(K8)。ソケットタイプ:754、939、940、S1(638)、AM2(940)、F(1207)。

Sudo modprobe powernow-k8

CPU:VIA CentaurHauls *またはTransmeta GenuineTMx86 *

Sudo modprobe longhaul

これらのいずれかが機能しない場合の最後の手段として、ACPIの一般的なものを試すことができます。 2.6.20以降のspeedstep-centrinoのような後のカーネルでは、より多くのドライバーがこのモジュールに移動されています。

Sudo modprobe acpi-cpufreq

スケーリングモジュールの挿入

CPU周波数モジュールがロードされたので、スケーリングモジュールを挿入できます。使用可能なスケーリングモジュールを確認するには、このコマンドを使用できます(Bashシェルを使用)。

ls /lib/modules/$(uname -r)/kernel/drivers/cpufreq

これらのモジュールがある場合は、すでに実行されている可能性があります。次のコマンドを試してください。

lsmod | grep freq

Cpufreqディレクトリにリストされているモジュールのほとんどまたはすべてが表示されたら、完了です。次のセクションに進みます。ここにない場合、モジュールをロードするコマンドがあります。

Sudo modprobe cpufreq_conservative cpufreq_ondemand cpufreq_powersave cpufreq_stats cpufreq_userspace freq_table

ロードされたので、ブート時にロードする必要があります。 K/X/UbuntuなどのDebianベースのシステムでこれを行うには、/ etc/modulesファイルに次の行を追加します。 RedHat(/etc/modules.conf?)のような他のディストリビューションのどこに置くかを確認する必要があります。 CPUのモジュール(上記で見つけた)の名前を忘れずにここに入力して、ブート時にロードされるようにしてください。これは、ブート時にロードされない場合のみです。最初に見たときにlsmodで見つからなかった場合、自動的にロードされませんでした。

cpufreq_conservative
cpufreq_ondemand
cpufreq_powersave
cpufreq_stats
cpufreq_userspace
freq_table

スケーリングモジュールの構成

ロードされたので、ガバナーを構成できます。最初に、使用するガバナーを選択する必要があります。以下は、ガバナーとそれぞれの仕組みのリストです。ニーズに最も合うものを決定できます。ガバナーのモジュールがロードされている場合、それを使用できます。 lsmodコマンドを使用すると、ロードされているモジュールを確認できることを忘れないでください。コマンドは、K/X/Ubuntuの世界のように、以下のSudoで実行されます。必要に応じて、ルートに切り替えて、Sudo sh -c ""なしで同じコマンドを実行できます。

使用可能なガバナーを表示するには。

Sudo cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors

オンデマンドガバナー-現在の使用状況に応じてCPU周波数を設定します。これを行うには、CPUが非常に迅速に周波数を切り替える機能を備えている必要があります。これは、短時間で多くの作業(高負荷)を実行し、残りの時間はあまり処理しない(低負荷)システムに適しています。

Sudo sh -c "echo ondemand > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor"

オンデマンドガバナーの構成オプション

sampling_rate-これはマイクロ秒(100万分の1秒)で測定されます。これは、CPU使用率をカーネルが調べて、周波数について何をするかを決定する頻度です。通常、これは「10000」以上の値に設定されます。サンプリングレートを1秒に設定する場合は、次の例のように1000000に設定します。

Sudo sh -c "echo 1000000 > /sys/devices/system/cpu/cpu0/cpufreq/ondemand/sampling_rate"

show_sampling_rate_(min | max)-これは、「sampling_rate」に設定できるサンプリングレートの最小値と最大値です。マイクロ秒も信じています。後のカーネルでこれを取り除くことについての議論を見てきましたが、将来それが存在することを期待しないでください。両方を表示するには、次のようにします。

Sudo cat /sys/devices/system/cpu/cpu0/cpufreq/ondemand/sampling_rate_min  
Sudo cat /sys/devices/system/cpu/cpu0/cpufreq/ondemand  /sampling_rate_max

up_threshold-これは、「sampling_rate」のサンプリング間の平均CPU使用量が、カーネルが周波数を上げるべきかどうかを決定するために必要なものを定義します。たとえば、デフォルト値の「80」に設定されている場合、チェック間隔の間、CPUの使用率は平均で80%を超えてから、CPU周波数を上げる必要があると判断する必要があります。これを20%のような低い値に設定するには、次のようにします。

Sudo sh -c "echo 20 > /sys/devices/system/cpu/cpu0/cpufreq/ondemand/up_threshold"  

ignore_Nice_load-このパラメーターは、「0」または「1」の値を取ります。 「0」(デフォルト)に設定すると、すべてのプロセスが「CPU使用率」値にカウントされます。 「1」に設定すると、「Nice」値で実行されるプロセスは、全体的な使用量計算にカウントされません(したがって無視されます)。これは、ラップトップでCPUを集中的に使用する計算を実行する場合に便利です。完了までにかかる時間を気にせずに「いい」ことができ、CPU周波数を上げるかどうかの決定プロセスに参加できないようにします。これをオンにするには、次を実行します。

Sudo sh -c "echo 1 > /sys/devices/system/cpu/cpu0/cpufreq/ondemand/ignore_Nice_load"  

保守的なガバナー-CPU周波数は、システムの現在の負荷に基づいてスケーリングされます。オンデマンドに似ています。違いは、CPUに負荷がかかった瞬間に最大速度にジャンプするのではなく、CPU速度を適切に増減することです。これは、バッテリー駆動の環境で最適に使用されます。

Sudo sh -c "echo conservative > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor"  

保守的なガバナー構成オプション

freq_step-これは、CPU freqがスムーズに増減する割合のステップを示します。デフォルトでは、CPU周波数は最大CPU周波数の5%単位で増加します。この値を0から100の間の任意の値に変更できます。「0」は負荷に関係なくCPUを効果的にロックしますが、理論的には「100」は「オンデマンド」ガバナーと同じように動作します。たとえば、10%刻みで上下させるには、次のようにします。

Sudo sh -c "echo 10 > /sys/devices/system/cpu/cpu1/cpufreq/conservative/freq_step"  

down_threshold-これは、「オンデマンド」ガバナーで見られる「up_threshold」と同じですが、反対方向です。たとえば、デフォルト値の「20」に設定すると、サンプル間でCPU使用率を20%未満にする必要がある場合に、周波数を下げることができます。たとえば、ダウンしきい値を30%に設定するには、次のようにします。

Sudo sh -c "echo 30 > /sys/devices/system/cpu/cpu0/cpufreq/conservative/down_threshold"

sampling_rate-ondemandと同じです。 sampling_rate_(min | max)-ondemandと同じです。 up_threshold-ondemandと同じです。 ignore_Nice_load-ondemandと同じです。

パフォーマンスガバナー-CPUは負荷に関係なく最大周波数で実行されます。このモジュールは実行中のモジュールにリストされていない可能性がありますが、まだ利用可能です。私の推測では、K/X/Ubuntuのカーネルに組み込まれています。あなたも同じです。

Sudo sh -c "echo performance > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor"

省電力ガバナー-CPUは負荷に関係なく最小周波数で実行されます。

Sudo sh -c "echo powersave > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor"

CPUに関するCpufreqの統計

Cpufreqモジュールは、CPUに関する統計をリストします。これらは、プロセッサの現在の周波数や、CPUがスケーリングできる利用可能な周波数などを見つけるのに役立ちます。以下をご覧ください。

cpuinfo_cur_freq-CPUの現在の周波数を表示します。 「cat/proc/cpuinfo」を実行して、これを見つけることもできます。

Sudo cat /sys/devices/system/cpu/*/cpufreq/cpuinfo_cur_freq

cpuinfo_max_freq-CPUがスケーリングできる最大周波数を表示します。

Sudo cat /sys/devices/system/cpu/*/cpufreq/cpuinfo_max_freq

cpuinfo_min_freq-CPUがスケーリングできる最小周波数を表示します。

Sudo cat /sys/devices/system/cpu/*/cpufreq/cpuinfo_min_freq

scaling_available_frequencies-CPUがスケーリング可能なすべての利用可能な周波数を表示します。

Sudo cat /sys/devices/system/cpu/*/cpufreq/scaling_available_frequencies

scaling_cur_freq-CPUが現在スケーリングされている使用可能な周波数を表示します。

Sudo cat /sys/devices/system/cpu/*/cpufreq/scaling_cur_freq

scaling_driver-CPUが使用しているcpufreqドライバーを表示します。

Sudo cat /sys/devices/system/cpu/*/cpufreq/scaling_driver

scaling_max_freq-CPUがスケーリングできる最大周波数を設定します。上記のscaling_available_frequenciesからの出力を見てください。次に、これらの数値(周波数)の1つを選択して、CPUのスケーリングが許可される最大周波数に設定できます。たとえば、scaling_available_frequenciesからのCPU出力が2000000 1800000 1000000だった場合、これを1800000に設定できます。したがって、CPUがスケーリングすると、2000000ではなく最大1800000になります。これを設定する方法の例は次のとおりです。

Sudo sh -c "echo 1800000 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq"

scaling_min_freq-scaling_max_freqと同じですが、CPUが下に行かないように値を設定します。例えば。

Sudo sh -c "echo 1800000 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq"

再起動時にcpufreqの設定を保持する

これまでに行った設定はすべて/ sys仮想ファイルシステムにあるため、再起動後は保存されません。リブート時にこれらの設定を行う方法はいくつかあります。

最初の方法は、実行していた行を/etc/rc.localに置くことです。ルートはブート時にrc.localを実行するため、各行の前にSudoを実行する必要はありません。 rc.localは、ondemandガバナーとup_thresholdを20%に設定する次の例のようになります。 CPUのモジュールとcpufreqスケーリングモジュールがブート時にもロードされるように設定されていることを忘れないでください。

echo ondemand > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor  
echo 20 > /sys/devices/system/cpu/cpu0/cpufreq/ondemand/up_threshold

再起動時に設定を維持する2番目の方法は、sysfsutils(Sudo apt-get install sysfsutils)をインストールすることです。その後、次の行を/etc/sysfs.confに追加して、/etc/rc.confの例と同じことを行うことができます。

devices/system/cpu/cpu0/cpufreq/scaling_governor=ondemand   
devices/system/cpu/cpu0/cpufreq/ondemand/up_threshold=20
2
erenesto