Definir limites de GPU no Ubuntu 17.04 não funciona mais

1

Eu estava usando o Ubuntu MATE 16.04 antes, mas recentemente mudei para o 17.04 porque ele veio com o thermald atualizado e eu assumi que ele iria consertar bugs assim para mim. Eu tive problemas com o thermal no Ubuntu 16.04 semelhante a um descrito lá, mas considerando que ele foi corrigido no thermald (1.5.4-3) e o Ubuntu 17.04 veio com a versão atualizada por padrão, eu assumi que funcionaria melhor para mim em geral, com possível fixo todo o sistema também. Então eu instalei o 17.04, tentei, tudo deu certo então migrei completamente.
Depois de um tempo, porém, eu encontrei um problema muito estranho com o sistema ignorando completamente os limites de CPU definidos. Em 16.04 só aconteceu comigo quando GPU Intel estava tentando trabalhar em freqüência ligada ao estado de funcionamento da CPU que era maior do que os limites. Por exemplo, se eu correr:

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

Esta é minha saída:

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

Então, se eu quiser que meu processador trabalhe em 1500MHz max, e não ultrapasse esse nível, isso significa que o GPU precisa estar limitado a 800MHz e nunca subir mais, porque eles estão interligados, já que é integrado ao GPU. na CPU.
No Ubuntu 16.04, o que fiz foi definir manualmente os limites da GPU escrevendo para /sys/kernel/debug/dri/1/i915_max_freq value. Eu quero ser o limite máximo que minha GPU pode usar. Quando limito a CPU para 1500MHz, também corro:

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

E minha GPU permanecerá no alcance, sem interferir nas freqüências de trabalho da CPU.
No Ubuntu 17.04, no entanto, após as configurações, a GPU ainda vai até 1100MHz, o que torna qualquer processador de CPU inútil e com limites insuficientes.

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

Como você pode ver, o limite está definido e no lugar. Agora verificamos 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

Podemos ver que a frequência atual e real está no máximo de 1100MHz.
Isso também aumenta o limite de ignorância da freqüência do CPU, porque a CPU não pode diminuir se a GPU for tão alta:

~$ 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).

Como você pode ver, a política varia de 1.50 GHz a 1.50GHz, mas é aumentada para o máximo por causa da GPU.

Depois de fechar a aplicação gráfica:

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
[...]

A GPU está de volta ao mínimo e a CPU agora trabalha com os limites atribuídos:

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).

Pergunta: Como eu faço com que a GPU da Intel siga o limite definido no Ubuntu 17.04, para que ela pare de mexer com o limite da minha CPU, e por que ela ignora limites que funcionavam em 16.04?

Atualização: Depois de procurar por perto, encontrei essa coisa:

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%]  

O que é esse "RPS" e pode ser o motivo pelo qual a GPU "aumenta" ao máximo ignorando os limites definidos?

    
por Ethuil UI 29.06.2017 / 18:43

1 resposta

0

Encontrei a solução e a causa do meu problema - foi o aumento do RPS que estava ignorando o limite de frequência definido pelo gpu.
Em vez de definir limite via / sys / kernel / debug / dri / 1 / i915_max_freq , mudei para configuração em / sys / class / drm / card1 , parâmetros gt_max_freq_mhz e gt_boost_freq_mhz . Depois que você definir o limite em i915_max_freq , ele não limitará a frequência de boost, portanto, quando as solicitações do sistema forem aumentadas, ele aumentará para o limite especificado em gt_boost_freq_mhz , ignorando o que você definiu. > Ao executar:

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

Eu defino limites para valores normais e aumentados, e o sistema não pressiona mais o limite passado da GPU, o que significa que o limite de CPU não será afetado no meu caso.

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
[...]

Etapas para aplicar esta solução:

1) Leia a tabela em / sys / kernel / debug / dri / 0 / i915_ring_freq_table (ou / sys / kernel / debug / dri / 1 / i915_ring_freq_table em alguns casos:

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

Encontre a frequência da CPU que está dentro do limite de CPU que você quer e procure a freqüência da GPU ligada a ela, será o limite que você precisa definir na GPU.

2) Defina o limite para a frequência da GPU gravando em gt_max_freq_mhz e gt_boost_freq_mhz localizado em / sys / class / drm / card0 (pode ser cardX dependendo da situação, verifique manualmente se necessário):

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

Por exemplo:

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

3) Verifique se os limites foram atingidos (altere 0 para seu valor X se você usou cardX:

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

Seus valores max soft e boost agora devem ser modificados para o que você definiu.
Esteja ciente de que limitar a frequência da GPU pode reduzir seu desempenho no OpenGL.

Se você não quiser usar a primeira solução, tente a alternativa abaixo.

Há outra solução alternativa possível que não funciona para mim devido à limitação do BIOS, mas que pode estar funcionando para outra pessoa, o que limita o limite de potência do pacote, como sugerido por @spandruvada da Intel no github thermald issue thread.

Primeiro você vê o valor atual lendo / 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

Então você tenta alterar o valor limite executando:

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

Por exemplo, no meu caso, eu tinha 35000000 como valor inicial e quero alterá-lo para 30000000 :

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

Se você obtiver "No data available" depois de tentar gravar nele, ele será desativado (o que pode ser verificado lendo / sys / class / powercap / intel-rapl / intel-rapl: 0 / ativado , será 0 se estiver desativado) ou está bloqueado pelo BIOS. Se você não pode habilitá-lo escrevendo 1 para a opção "enable", verifique o dmesg para a mensagem de erro (depois de tentar escrever em constraint_0_power_limit_uw :

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

Se você vir "bloqueado pela BIOS", precisará ativá-lo na BIOS manualmente, se não puder fazer isso, não poderá controlá-lo e esse método não é para você. Pelo que entendi, se você ativou e ativou, o thermald deve ajustar esses valores automaticamente, sem a necessidade de alterá-los manualmente.

Problema no github com essa sugestão
Se você quiser usar este método manualmente, mais alguns detalhes sobre isso aqui.

    
por Ethuil UI 29.06.2017 / 23:22