Thinkpad x280,UbuntuのCPUクロックの低下(サーマルスロットリング)対策 x1 carbonも同様

概要

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が遅いと思ったら、こんな挙動をしていたのか・・・。
コンパイルのたびに毎回フリーズされては叶わない、ということで対策を講じる。

f:id:t_nkb:20181215213208p:plain
(図1)CPU動作周波数が全スレッド100Mhz台に低下している

f:id:t_nkb:20181215213210p:plain
(図2)しばらくすると2.7GHz前後で安定する

不具合の対策

先人が対策スクリプトを公開してくれていたので、これを参考に対策を行った。
以下の対策を行うことで、CPU動作周波数が極端に低下することはなくなった。

github.com

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