Вопрос или проблема
Ранее я использовал Ubuntu MATE 16.04, но недавно перешёл на 17.04, потому что она поставлялась с обновлённым thermald, и я предположил, что это исправит ошибки как эта для меня. У меня были проблемы с thermald в Ubuntu 16.04, аналогичные описанным там, но учитывая, что говорилось, что это было исправлено в thermald (1.5.4-3), и Ubuntu 17.04 поставлялась с обновлённой версией по умолчанию, я предположил, что в целом она будет работать лучше для меня, с возможным исправлением по всей системе. Поэтому я установил 17.04, попробовал, всё работало хорошо, и я полностью мигрировал.
Однако через некоторое время я столкнулся с очень странной проблемой: система полностью игнорировала установленные ограничения CPU. В 16.04 это происходило только тогда, когда GPU Intel пытался работать на частоте, связанной с рабочим состоянием CPU, которая была выше установленных ограничений. Например, если я запущу:
sudo cat /sys/kernel/debug/dri/1/i915_ring_freq_table
Вот мой вывод:
Частота GPU (МГц) Эффективная частота CPU (МГц) Эффективная частота Ring (МГц)
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 работал на максимуме 1500 МГц и не превышал эту частоту, это означает, что GPU необходимо ограничить до 800 МГц и никогда не превышать её, так как они связаны, поскольку это интегрированный GPU в CPU.
В Ubuntu 16.04 я вручную устанавливал ограничения GPU, записывая в /sys/kernel/debug/dri/1/i915_max_freq
значение, которое я хотел, чтобы было максимальным пределом частоты для моего GPU. Когда я ограничивал CPU до 1500 МГц, я также выполнял:
echo 800 | sudo tee /sys/kernel/debug/dri/1/i915_max_freq
И мой GPU оставался в пределах диапазона, не мешая рабочим частотам CPU.
Однако в Ubuntu 17.04, после установки ограничений, GPU всё равно повышается до 1100 МГц, что делает любые ограничения 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
Соотношение p-state для рендеринга: 22
VID p-state для рендеринга: 203
Лимит p-state для рендеринга: 255
RPSTAT1: 0x00041610
RPMODECTL: 0x00000d92
RPINCLIMIT: 0x000019fa
RPDECLIMIT: 0x00003a98
RPNSWREQ: 1100МГц
CAGF: 1100МГц
RP CUR UP EI: 7165 (9171us)
RP CUR UP: 7006 (8967us)
RP PREV UP: 6725 (8608us)
Порог повышения: 85%
RP CUR DOWN EI: 1314 (1681us)
RP CUR DOWN: 1315 (1683us)
RP PREV DOWN: 23741 (30388us)
Порог снижения: 60%
Минимальная (RPN) частота: 650МГц
Номинальная (RP1) частота: 650МГц
Максимальная частота без разгона (RP0): 1100МГц
Максимальная частота с разгоном: 1100МГц
Текущая частота: 1100 МГц
Фактическая частота: 1100 МГц
Частота вхолостую: 650 МГц
Минимальная частота: 650 МГц
Частота ускорения: 1100 МГц
Максимальная частота: 1100 МГц
Эффективная (RPe) частота: 650 МГц
Текущая частота тактового сигнала CD: 400000 кГц
Максимальная частота тактового сигнала CD: 400000 кГц
Максимальная частота пикселя: 360000 кГц
Мы видим, что текущая и фактическая частота на полных максимумах – 1100 МГц.
Это также увеличивает частоту CPU, игнорируя лимит, потому что CPU не может снизиться, если GPU поднимается так высоко:
~$ sudo cpufreq-info
cpufrequtils 008: cpufreq-info (C) Dominik Brodowski 2004-2009
Сообщите об ошибках и неполадках по адресу [email protected], пожалуйста.
анализируя CPU 0:
драйвер: intel_pstate
CPUs, работающие на одной аппаратной частоте: 0
CPUs, частота которых должна согласовываться программно: 0
максимальная задержка переключения: 0.97 мс.
аппаратные ограничения: 800 МГц - 2.00 ГГц
доступные режимы работы cpufreq: производительность, энергосбережение
текущая политика: частота должна находиться в пределах от 1.50 ГГц до 1.50 ГГц.
Губернатор "энергосбережение" может решать, какую скорость использовать
в этом диапазоне.
текущая частота CPU 2.00 ГГц (подтверждена вызовом к аппаратуре).
анализируя CPU 1:
драйвер: intel_pstate
CPUs, работающие на одной аппаратной частоте: 1
CPUs, частота которых должна согласовываться программно: 1
максимальная задержка переключения: 0.97 мс.
аппаратные ограничения: 800 МГц - 2.00 ГГц
доступные режимы работы cpufreq: производительность, энергосбережение
текущая политика: частота должна находиться в пределах от 1.50 ГГц до 1.50 ГГц.
Губернатор "энергосбережение" может решать, какую скорость использовать
в этом диапазоне.
текущая частота CPU 2.00 ГГц (подтверждена вызовом к аппаратуре).
Как видите, политика находится в диапазоне от 1.50 ГГц до 1.50 ГГц, но она увеличена до максимума из-за GPU.
После того, как мы завершаем графическое приложение:
sudo cat /sys/kernel/debug/dri/1/i915_frequency_info
PM IER=0x00000070 IMR=0xffffff8f ISR=0x00000000 IIR=0x00000000,
[...]
CAGF: 650МГц
[...]
Минимальная (RPN) частота: 650МГц
Номинальная (RP1) частота: 650МГц
Максимальная частота без разгона (RP0): 1100МГц
Максимальная частота с разгоном: 1100МГц
Текущая частота: 650 МГц
Фактическая частота: 650 МГц
Частота вхолостую: 650 МГц
Минимальная частота: 650 МГц
Частота ускорения: 1100 МГц
Максимальная частота: 1100 МГц
[...]
GPU вернулись к минимуму, и CPU теперь работает в пределах установленных ограничений:
sudo cpufreq-info
cpufrequtils 008: cpufreq-info (C) Dominik Brodowski 2004-2009
Сообщите об ошибках и неполадках по адресу [email protected], пожалуйста.
анализируя CPU 0:
драйвер: intel_pstate
CPUs, работающие на одной аппаратной частоте: 0
CPUs, частота которых должна согласовываться программно: 0
максимальная задержка переключения: 0.97 мс.
аппаратные ограничения: 800 МГц - 2.00 ГГц
доступные режимы работы cpufreq: производительность, энергосбережение
текущая политика: частота должна находиться в пределах от 1.50 ГГц до 1.50 ГГц.
Губернатор "энергосбережение" может решать, какую скорость использовать
в этом диапазоне.
текущая частота CPU 1.12 ГГц (подтверждена вызовом к аппаратуре).
анализируя CPU 1:
драйвер: intel_pstate
CPUs, работающие на одной аппаратной частоте: 1
CPUs, частота которых должна согласовываться программно: 1
максимальная задержка переключения: 0.97 мс.
аппаратные ограничения: 800 МГц - 2.00 ГГц
доступные режимы работы cpufreq: производительность, энергосбережение
текущая политика: частота должна находиться в пределах от 1.50 ГГц до 1.50 ГГц.
Губернатор "энергосбережение" может решать, какую скорость использовать
в этом диапазоне.
текущая частота CPU 1.49 ГГц (подтверждена вызовом к аппаратуре).
Вопрос: как заставить GPU Intel следовать установленному ограничению в Ubuntu 17.04, чтобы он прекратил вмешиваться в ограничение моего CPU, и почему он игнорирует ограничения, которые работали в 16.04?
Обновление: После некоторых изысканий я нашёл следующую информацию:
sudo cat /sys/kernel/debug/dri/0/i915_rps_boost_info
RPS включен? 1
GPU занят? да [1 запрос]
CPU ожидает? 0
Запрашиваемая частота 650
мин жёсткий:650, мягкий:650; макс мягкий:700, жёсткий:1100
бездействие:650, эффективный:650, ускорение:1100
Xorg [1221]: 591 ускорений
Ускорения ядра (анонимные): 8
Автокалибровка RPS (текущая "низкопотребляющая" оконная):
Ср. увеличение: 0% [выше порога? 95%]
Ср. снижение: 0% [ниже порога? 85%]
Что такое “RPS”, и может ли это быть причиной того, что GPU “ускоряется” до максимума, игнорируя установленные ограничения?
Я нашёл решение и причину своей проблемы – это оказался RPS-ускорение, которое игнорировало установленный предел частоты GPU.
Вместо того чтобы устанавливать лимит через /sys/kernel/debug/dri/1/i915_max_freq, я переключился на установку его в /sys/class/drm/card1, параметры gt_max_freq_mhz и gt_boost_freq_mhz. После того как вы установите предел в i915_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 включен? 1
GPU занят? да [32 запроса]
CPU ожидает? 0
Запрашиваемая частота 800
мин жёсткий:650, мягкий:650; макс мягкий:800, жёсткий:1100
бездействие:650, эффективный:650, ускорение: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) Установите предел для частоты GPU, записывая в gt_max_freq_mhz и gt_boost_freq_mhz, расположенные в /sys/class/drm/card0 (может быть cardX в зависимости от ситуации, проверьте вручную, если необходимо):
echo [предел_частоты_GPU] | 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) Проверьте, прошли ли ограничения (измените 0 на ваше значение X, если вы использовали cardX):
sudo cat /sys/kernel/debug/dri/0/i915_rps_boost_info
Ваши максимальные мягкие и ускоренные значения теперь должны быть изменены на то, что вы установили.
Имейте в виду, что ограничение частоты GPU может снизить вашу производительность OpenGL.
Если вы не хотите использовать первое решение, вы можете попробовать альтернативное ниже.
Существует ещё одно возможное альтернативное решение, которое не сработало для меня из-за ограничений BIOS, но может подойти кому-то другому, это ограничение предела мощности пакета, как было предложено @spandruvada из intel в теме о проблеме thermald на github.
Сначала вы видите текущее значение, прочитав /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 [сниженное_значение_мощности] | 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, будет 0, если оно отключено), или оно заблокировано BIOS. Если вы не можете включить его, записав 1 в опцию “enable”, проверьте dmesg на предмет сообщения об ошибке (после попытки записи в constraint_0_power_limit_uw:
dmesg | grep powercap
[29580.025164] powercap intel-rapl:0: пакет заблокирован BIOS, только мониторинг
Если вы видите “заблокировано BIOS”, вам нужно будет включить это вручную в BIOS, если вы не можете это сделать, значит, вы не можете управлять этим, и этот метод не для вас. Насколько я понимаю, если у вас это включено и работает, thermald должен автоматически настраивать эти значения для вас, без необходимости их изменения вручную.
Вопрос на github с этим предложением
Если вы хотите использовать этот метод вручную, более подробную информацию об этом здесь.
Я использую intel_gpu_frequency
, предоставляемый: intel-gpu-tools
intel_gpu_frequency -i
для блокировки частоты на минимуме
или используя 800 МГц в качестве примера
intel_gpu_frequency -s 800
для блокировки частоты на абсолютном значении (МГц)
Вот страницы man Ubuntu для программы:
https://manpages.ubuntu.com/manpages/xenial/man1/intel_gpu_frequency.1.html
На момент Ubuntu 24.04:
Дополнительная сложность: я заметил, что номер карты переключается между 0 и 1 от загрузки к загрузке на более или менее случайной основе; так что вы не можете жестко задать значение нуля или одного.
“0” в параметре “gt0” является “TILE” (что бы это ни значило), согласно источникам драйвера. У карт может быть больше чем одна из них, видимо. Если ваш CPU имеет плитки, вы, вероятно, знаете, что это такое и сколько у вас есть, так что отрегулируйте цикл “j” соответственно. У меня одна плитка.
#!/bin/bash
echo Ограничение частоты GPU
gpuLimit=650
for (( i=0; i<=1; i++ ))
do
if test -d /sys/class/drm/card$i/gt; then
for (( j=0; j<4; j++ ))
do
if test -f /sys/class/drm/card$i/gt/gt$j/rps_min_freq_mhz; then
echo "Установка Card$i gt$j"
echo $gpuLimit > /sys/class/drm/card$i/gt/gt$j/rps_max_freq_mhz
echo $gpuLimit > /sys/class/drm/card$i/gt/gt$j/rps_boost_freq_mhz
fi
done
fi
done
Ответ или решение
Чтобы ограничить частоты встроенного графического процессора Intel в Ubuntu 17.04, вам нужно учитывать изменения в работе системы управления энергией и частотами, которые произошли с переходом с Ubuntu 16.04 на 17.04. Ваша основная проблема заключается в том, что в Ubuntu 16.04 вы смогли установить ограничения через файл /sys/kernel/debug/dri/1/i915_max_freq
, но в более новой версии эти изменения игнорируются.
1. Причины проблемы
При переходе на Ubuntu 17.04 система использует механизм управления частотами, называемый RPS (Render Power States). Это нововведение влияет на то, как GPU и CPU взаимодействуют друг с другом в плане регулирования частот. RPS позволяет интегрированному GPU автоматически подстраивать свою производительность в зависимости от текущих требований нагрузки, что может привести к превышению установленных вами ограничений.
2. Решение проблемы
Вместо использования файла /sys/kernel/debug/dri/1/i915_max_freq
для установки предела частот, вам нужно будет настроить ограничения напрямую через файлы, находящиеся в /sys/class/drm/cardX/
. (где X
— номер вашего графического устройства, который может быть 0 или 1):
Шаги для установки ограничений:
-
Определите частоты GPU:
Откройте файл с частотами для вашего устройства и найдите нужные значения:sudo cat /sys/kernel/debug/dri/0/i915_ring_freq_table
-
Установите ограничения на частоты GPU:
После того как вы определили подходящие параметры, вы можете установить максимальные и бустовые частоты следующим образом:echo 800 | sudo tee /sys/class/drm/card0/gt_max_freq_mhz echo 800 | sudo tee /sys/class/drm/card0/gt_boost_freq_mhz
-
Проверьте изменения:
После установки лимитов убедитесь, что они применены:sudo cat /sys/kernel/debug/dri/0/i915_rps_boost_info
Убедитесь, что значения
max soft
иboost
соответствуют заданному вами лимиту.
3. Дополнительные альтернативы
Если описанный выше метод не работает из-за ограничений BIOS, вы можете рассмотреть возможность ограничения мощности процессора с помощью Intel RAPL (Running Average Power Limit). Это делается так:
-
Проверьте текущее значение ограничения:
sudo cat /sys/class/powercap/intel-rapl/intel-rapl:0/constraint_0_power_limit_uw
-
Измените значение ограничения питания:
echo 30000000 | sudo tee /sys/class/powercap/intel-rapl/intel-rapl:0/constraint_0_power_limit_uw
Заключение
С учетом всего вышеописанного, важно помнить, что регулирование частот GPU и CPU не всегда может быть под контролем пользователя, в зависимости от настройки системы и BIOS. Поскольку изменения могут влиять на производительность системы, убедитесь, что ограничения заданы так, чтобы не снижать критически важную производительность графических приложений. Этот подход должен решить вашу первоначальную задачу по ограничению частот и предотвратить перегрев процессора.