概要
Thinkpad x280(core i5 8250U)、Ubuntuの組み合わせでは電力制限のしきい値が低く設定されているため、高負荷処理時にCPU動作周波数が激減してしまう。いわゆるサーマルスロットリングが原因で発生している事象の模様。
海外のフォーラムを見ると、これを解決(実際は緩和)するスクリプトが公開されていたので、使い方を紹介する。
20181219追記
結局以下だけでは緩和にしかならなかったので、以下の対策プラス、biosでハイパースレッディングを切ることにした。これでcpuをどれだけ回しても安定して全コア、ターボブーストの最大クロックである3.4GHzを出し続けられる!!
事象の確認
高負荷処理を行うと、PCの速度が急激に遅くなっているように見えたため、以下の方法で事象を確認した。
1. CPU使用率を100%にする
以下のコマンドを打つことで、1スレッドのCPU使用率を100%にすることができる。今回は4コア8スレッドなので、8回入力した。
yes > /dev/null &
2. CPUの動作周波数を見る
以下のコマンドを打ち、1秒おきにCPUの動作周波数を確認する。
今回のCPUは Intel(R) Core(TM) i5-8250U なので、動作周波数は通常1.60GHz、ターボブースト時は3.4GHzになることが期待される。
watch -n 1 fgrep Hz /proc/cpuinfo
3. 実際の周波数の変化を確認する
高負荷の処理を行う際に、CPU動作周波数が一時的に3.4GHzまで上昇しするが、すぐに動作周波数が100MHz前後まで低下する(図1)。この際PCはほぼフリーズしたような挙動を示す。100MHz前後に低下したまま、しばらく(10〜20秒程度)待つと、CPU動作周波数が徐々に上昇していき、1分ほどで2.7Ghz程度まで動作周波数が上昇し、まともに使える状態まで回復する。(図2)
やけにPCが遅いと思ったら、こんな挙動をしていたのか・・・。
コンパイルのたびに毎回フリーズされては叶わない、ということで対策を講じる。
不具合の対策
先人が対策スクリプトを公開してくれていたので、これを参考に対策を行った。
以下の対策を行うことで、CPU動作周波数が極端に低下することはなくなった。
1. アプリケーションの導入
以下コマンドをうち、まずはアプリケーションを導入する。
sudo apt install git build-essential python3-dev libdbus-glib-1-dev libgirepository1.0-dev libcairo2-dev python3-venv git clone https://github.com/erpalma/lenovo-throttling-fix.git sudo ./lenovo-throttling-fix/install.sh
2. 設定の変更
以下の通りのコマンドをうち、詳細設定を変更する。
私はバッテリ使用時でも高いパフォーマンスが必要なため、バッテリ使用時の制限を緩和した。
sudo gedit /etc/lenovo_fix.conf
変更内容は以下の通り。
## Settings to apply while connected to Battery power [BATTERY] # Update the registers every this many seconds Update_Rate_s: 10 # Max package power for time window #1 PL1_Tdp_W: 44 # Time window #1 duration PL1_Duration_s: 28 # Max package power for time window #2 PL2_Tdp_W: 44 # Time window #2 duration PL2_Duration_S: 0.002 # Max allowed temperature before throttling Trip_Temp_C: 95 # Set cTDP to normal=0, down=1 or up=2 (EXPERIMENTAL) cTDP: 0 ## Settings to apply while connected to AC power [AC] # Update the registers every this many seconds Update_Rate_s: 5 # Max package power for time window #1 PL1_Tdp_W: 44 # Time window #1 duration PL1_Duration_s: 28 # Max package power for time window #2 PL2_Tdp_W: 44 # Time window #2 duration PL2_Duration_S: 0.002 # Max allowed temperature before throttling Trip_Temp_C: 95 # Set HWP energy performance hints to 'performance' on high load (EXPERIMENTAL) HWP_Mode: False # Set cTDP to normal=0, down=1 or up=2 (EXPERIMENTAL) cTDP: 0
追加設定 CPUの低電圧化
#以下はそれぞの機器によっても設定が異なるため、実行していることを理解して、自己責任で実施すること。
#私の環境ではうまく動いているが、保証はしない。
このアプリケーションは、CPUの低電圧化(Undervolting)の設定にも対応しているので、低電圧化も実施した。
CPUの消費電力は電圧の二乗に比例するため、動作電圧を下げることのメリットは大きい。
sudo gedit /etc/lenovo_fix.conf
変更内容は以下の通り。
[UNDERVOLT.BATTERY] # CPU core voltage offset (mV) CORE: -110 # Integrated GPU voltage offset (mV) GPU: 0 # CPU cache voltage offset (mV) CACHE: -110 # System Agent voltage offset (mV) UNCORE: -50 # Analog I/O voltage offset (mV) ANALOGIO: 0 [UNDERVOLT.AC] # CPU core voltage offset (mV) CORE: -110 # Integrated GPU voltage offset (mV) GPU: 0 # CPU cache voltage offset (mV) CACHE: -110 # System Agent voltage offset (mV) UNCORE: -50 # Analog I/O voltage offset (mV) ANALOGIO: 0