web-dev-qa-db-ja.com

Ubuntu 17.04でIntel GPUの制限を設定しても機能しなくなりました

以前はUbuntu MATE 16.04を使用していましたが、最新のThermaldが付属していたため、最近17.04に切り替えました。バグを修正すると思われました like this Ubuntu 16.04でThermald(1.5.4-3)で修正されたと言われ、Ubuntu 17.04にはデフォルトで更新バージョンが付属していると考えられていることを考えると、Ubuntu 16.04でThermaldに問題がありました。全体的に、システム全体で修正される可能性もあります。だから、17.04をインストールし、試してみたが、すべてうまくいったので、完全に移行した。
しばらくすると、設定されたCPU制限を完全に無視するシステムで非常に奇妙な問題が発生しました。 16.04で、Intel GPUがCPUの動作状態に関係する周波数で動作しようとしていたとき、それは限界よりも高かっただけでした。たとえば、次を実行すると:

Sudo cat /sys/kernel/debug/dri/1/i915_ring_freq_table

これは私の出力です:

GPU freq (MHz)  Effective CPU freq (MHz)    Effective Ring freq (MHz)
650             800                         0
700             800                         0
750             1400                        0
800             1500                        0
850             1600                        0
900             1600                        0
950             1700                        0
1000            1800                        0
1050            1900                        0
1100            2000                        0

したがって、CPUを最大1500MHzで動作させ、それよりも高くならないようにするには、GPUを800MHzに制限する必要があり、CPUに統合されたGPUであるため、同じように高くなることはありません。
Ubuntu 16.04では、/sys/kernel/debug/dri/1/i915_max_freq値に書き込むことでGPUの制限を手動で設定し、GPUが使用できる最大制限にしたいと考えていました。 CPUを1500MHzに制限すると、次も実行されます。

echo 800 | Sudo tee /sys/kernel/debug/dri/1/i915_max_freq  

また、CPUの動作周波数を乱すことなく、私のGPUは範囲内に留まります。
ただし、Ubuntu 17.04では、設定制限の後、GPUは1100MHzまで動作するため、CPU制限が無意味になり、プロセッサが過熱します。

~$ Sudo cat /sys/kernel/debug/dri/1/i915_max_freq
800

あなたが見ることができるように、制限が設定され、所定の位置にあります。次にfrequency_infoを確認します。

~$ Sudo cat /sys/kernel/debug/dri/1/i915_frequency_info
PM IER=0x00000070 IMR=0xffffff8f ISR=0x00000000 IIR=0x00000000, MASK=0x0000002a
pm_intr_keep: 0x00000004
GT_PERF_STATUS: 0x000016cb
Render p-state ratio: 22
Render p-state VID: 203
Render p-state limit: 255
RPSTAT1: 0x00041610
RPMODECTL: 0x00000d92
RPINCLIMIT: 0x000019fa
RPDECLIMIT: 0x00003a98
RPNSWREQ: 1100MHz
CAGF: 1100MHz
RP CUR UP EI: 7165 (9171us)
RP CUR UP: 7006 (8967us)
RP PREV UP: 6725 (8608us)
Up threshold: 85%
RP CUR DOWN EI: 1314 (1681us)
RP CUR DOWN: 1315 (1683us)
RP PREV DOWN: 23741 (30388us)
Down threshold: 60%
Lowest (RPN) frequency: 650MHz
Nominal (RP1) frequency: 650MHz
Max non-overclocked (RP0) frequency: 1100MHz
Max overclocked frequency: 1100MHz
Current freq: 1100 MHz
Actual freq: 1100 MHz
Idle freq: 650 MHz
Min freq: 650 MHz
Boost freq: 1100 MHz
Max freq: 1100 MHz
efficient (RPe) frequency: 650 MHz
Current CD clock frequency: 400000 kHz
Max CD clock frequency: 400000 kHz
Max pixel clock frequency: 360000 kHz

現在の周波数と実際の周波数が最大1100MHzであることがわかります。
GPUが高くなるとCPUを低くすることができないため、これは制限を無視してCPU周波数を上げます。

~$ Sudo cpufreq-info 
cpufrequtils 008: cpufreq-info (C) Dominik Brodowski 2004-2009
Report errors and bugs to [email protected], please.
analyzing CPU 0:
  driver: intel_pstate
  CPUs which run at the same hardware frequency: 0
  CPUs which need to have their frequency coordinated by software: 0
  maximum transition latency: 0.97 ms.
  hardware limits: 800 MHz - 2.00 GHz
  available cpufreq governors: performance, powersave
  current policy: frequency should be within 1.50 GHz and 1.50 GHz.
                  The governor "powersave" may decide which speed to use
                  within this range.
  current CPU frequency is 2.00 GHz (asserted by call to hardware).
analyzing CPU 1:
  driver: intel_pstate
  CPUs which run at the same hardware frequency: 1
  CPUs which need to have their frequency coordinated by software: 1
  maximum transition latency: 0.97 ms.
  hardware limits: 800 MHz - 2.00 GHz
  available cpufreq governors: performance, powersave
  current policy: frequency should be within 1.50 GHz and 1.50 GHz.
                  The governor "powersave" may decide which speed to use
                  within this range.
  current CPU frequency is 2.00 GHz (asserted by call to hardware).

ご覧のように、ポリシーは1.50 GHz〜1.50GHzの範囲ですが、GPUのため最大に引き上げられています。

グラフィカルアプリケーションを閉じた後:

Sudo cat /sys/kernel/debug/dri/1/i915_frequency_info
PM IER=0x00000070 IMR=0xffffff8f ISR=0x00000000 IIR=0x00000000,
[...]
CAGF: 650MHz
[...]
Lowest (RPN) frequency: 650MHz
Nominal (RP1) frequency: 650MHz
Max non-overclocked (RP0) frequency: 1100MHz
Max overclocked frequency: 1100MHz
Current freq: 650 MHz
Actual freq: 650 MHz
Idle freq: 650 MHz
Min freq: 650 MHz
Boost freq: 1100 MHz
Max freq: 1100 MHz
[...]

GPUは最小に戻り、CPUは割り当てられた制限で動作するようになりました。

Sudo cpufreq-info 
cpufrequtils 008: cpufreq-info (C) Dominik Brodowski 2004-2009
Report errors and bugs to [email protected], please.
analyzing CPU 0:
  driver: intel_pstate
  CPUs which run at the same hardware frequency: 0
  CPUs which need to have their frequency coordinated by software: 0
  maximum transition latency: 0.97 ms.
  hardware limits: 800 MHz - 2.00 GHz
  available cpufreq governors: performance, powersave
  current policy: frequency should be within 1.50 GHz and 1.50 GHz.
                  The governor "powersave" may decide which speed to use
                  within this range.
  current CPU frequency is 1.12 GHz (asserted by call to hardware).
analyzing CPU 1:
  driver: intel_pstate
  CPUs which run at the same hardware frequency: 1
  CPUs which need to have their frequency coordinated by software: 1
  maximum transition latency: 0.97 ms.
  hardware limits: 800 MHz - 2.00 GHz
  available cpufreq governors: performance, powersave
  current policy: frequency should be within 1.50 GHz and 1.50 GHz.
                  The governor "powersave" may decide which speed to use
                  within this range.
  current CPU frequency is 1.49 GHz (asserted by call to hardware).

質問:インテルGPUをUbuntu 17.04で設定された制限に従うようにするにはどうすればよいですか?CPU制限を台無しにしないようにし、16.04で機能した制限を無視するのはなぜですか?

更新:突っついた後、私はこのことを見つけました:

Sudo cat /sys/kernel/debug/dri/0/i915_rps_boost_info
RPS enabled? 1
GPU busy? yes [1 requests]
CPU waiting? 0
Frequency requested 650
  min hard:650, soft:650; max soft:700, hard:1100
  idle:650, efficient:650, boost:1100
Xorg [1221]: 591 boosts
Kernel (anonymous) boosts: 8
RPS Autotuning (current "low power" window):
  Avg. up: 0% [above threshold? 95%]
  Avg. down: 0% [below threshold? 85%]  

この「RPS」とは何ですか?また、GPUが設定された制限を無視して最大値に「ブースト」する理由になりますか?

1
Ethuil UI

解決策と問題の原因が見つかりました-設定されたGPU周波数制限を無視していたのはRPSブーストでした。
/ sys/kernel/debug/dri/1/i915_max_freqで制限を設定する代わりに、/ sys/class/drm/card1、パラメーターgt_max_freq_mhzおよびgt_boost_freq_mhzi915_max_freqで制限を設定した後、ブースト周波数は制限されないため、システム要求がブーストすると、gt_boost_freq_mhz、設定を無視します。
実行:

echo 800 | Sudo tee /sys/class/drm/card1/gt_max_freq_mhz   
echo 800 | Sudo tee /sys/class/drm/card1/gt_boost_freq_mhz  

通常の値とブーストされた値の両方に制限を設定すると、システムはGPUを制限を超えてプッシュしなくなります。つまり、私の場合でもCPU制限は影響を受けません。

Sudo cat /sys/kernel/debug/dri/1/i915_rps_boost_info
RPS enabled? 1
GPU busy? yes [32 requests]
CPU waiting? 0
Frequency requested 800
  min hard:650, soft:650; max soft:800, hard:1100
  idle:650, efficient:650, boost:800
[...]

このソリューションを適用する手順:

1)/ sys/kernel/debug/dri/0/i915_ring_freq_table(または/ sys/kernelでテーブルを読み取る/ debug/dri/1/i915_ring_freq_table場合によっては:

Sudo cat /sys/kernel/debug/dri/0/i915_ring_freq_table  

必要なCPU制限を満たしているCPU周波数を見つけて、それに関連付けられているGPU周波数を探します。GPUで設定する必要がある制限です。

2)gt_max_freq_mhzおよびgt_boost_freq_mhzに書き込むことにより、GPU周波数の制限を設定しますat/ sys/class/drm/card0cardXに依存状況に応じて、必要に応じて手動で確認してください):

echo [GPU_frequency_limit] | Sudo tee /sys/class/drm/cardX/gt_max_freq_mhz /sys/class/drm/cardX/gt_boost_freq_mhz

例えば:

echo 800 | Sudo tee /sys/class/drm/card0/gt_max_freq_mhz /sys/class/drm/card0/gt_boost_freq_mhz

3)制限が下がったかどうかを確認します(cardXを使用した場合は、X値に0を変更します:

Sudo cat /sys/kernel/debug/dri/0/i915_rps_boost_info

max softおよびboostの値は、設定した値に変更する必要があります。 。
GPUの周波数を制限すると、OpenGLのパフォーマンスが低下する可能性があることに注意してください。


最初の解決策を使用したくない場合は、以下から代替案を試すことができます。

BIOSの制限のために機能しない別の解決策がありますが、他の誰かのために機能する可能性があります。これは、github thermald issue threadのintelの@spandruvadaによって提案されたように、パッケージの電力制限を制限しています。

最初に、/ sys/class/powercap/intel-rapl/intel-rapl:0/constraint_0_power_limit_uwを読み取ることで現在の値が表示されます。

Sudo cat /sys/class/powercap/intel-rapl/intel-rapl:0/constraint_0_power_limit_uw

次に、次を実行して制限値を変更しようとします。

echo [reduced_power_value] | Sudo tee /sys/class/powercap/intel-rapl/intel-rapl:0/constraint_0_power_limit_uw

たとえば、私の場合、初期値として35000000があり、それを30000000

echo 30000000 | Sudo tee /sys/class/powercap/intel-rapl/intel-rapl:0/constraint_0_power_limit_uw

書き込みを試みた後に「利用可能なデータがありません」というメッセージが表示された場合は、単に無効になっています(/ sys/class/powercap/intel-rapl/intel-raplで確認できます) :0/enabled、無効になっている場合)、またはBIOSによってロックされています。 1を「enable」オプションに書き込んでも有効にできない場合は、エラーメッセージのdmesgを確認してください(constraint_0_power_limit_uw

dmesg | grep powercap
[29580.025164] powercap intel-rapl:0: package locked by BIOS, monitoring only

「BIOSによってロックされています」と表示された場合は、BIOSで手動で有効にする必要があります。これができない場合は、制御できず、この方法は使用できません。私が理解していることから、あなたがそれを有効にして動作している場合、thermaldはそれらの値を手動で変更することなく自動的に調整する必要があります。

この提案でgithubでの問題
このメソッドを手動で使用する場合は、詳細をいくつか説明します here。

0
Ethuil UI