Замедлите всего один процесс, чтобы регулировать температуру процессора

9
  1. У меня есть программа. Когда он работает, температура процессора повышается с 50 до 80 градусов Цельсия, что является моей главной заботой.

    Я могу контролировать частоту процессора, чтобы замедлить его, но замедляются и другие процессы, чего я не хочу.

    Можно ли замедлить определенный процесс, не влияя на другие процессы, чтобы охлаждать процессор?

    Моя ОС - Ubuntu 10.10.

  2. Я попытался установить приоритет процесса nice -n 15 myprogram, и не уверен, что это будет работать. Процессор 77 градусов по Цельсию.

    niceУстанавливает ли только относительный приоритет процесса относительно других процессов? Т.е., если другие процессы не работают, будет ли этот запущенный процесс работать быстро? Я бы хотел, чтобы процесс работал медленно.

Тим
источник
1
Что делает этот процесс: тяжелый ввод / вывод? Тяжелые расчеты на основном процессоре? Тяжелые вычисления на GPU (видеокарте) (обычно, но не ограничиваясь программами, которые рассчитывают изображения)?
Жиль "ТАК ... перестать быть злым"
Программа pdf2djvu, конвертирующая файл pdf в djvu. Это тяжелый ввод-вывод или тяжелый процессор или тяжелый графический процессор? У вас есть разные способы для разных случаев?
Тим
4
80º очень очень высоко. Я живу в жарком месте Испании, и максимальная температура моего процессора составляет ~ 60º. Откройте компьютер, почистите все детали и поменяйте кулеры. Я думаю, что вы не используете процессор.
Руфо Эль Магуфо
Попробуйте сделать оба.
стрибика
80 ° на самом деле высокая, но не считается экстремальной в зависимости от модели процессора. большинство процессоров поддерживают до 90 ° C без проблем
Kiwy

Ответы:

16

CPULimit это именно то, что вам нужно. Вы запускаете программу, затем запускаете cpulimit для имени программы или PID, указывая, какой процент вы хотите ограничить.

Следующая команда ограничивает процесс с PID 7777 до 5% загрузки процессора.

cpulimit -p 7777 -l 5

В качестве альтернативы вы можете использовать имя исполняемого файла:

cpulimit -e myprogram -l 5

Или абсолютный путь к исполняемому файлу:

cpulimit -P /path/to/myprogram -l 5

Обратите внимание на процент от всех ядер; так что если у вас есть 4 ядра, вы можете использовать 400%.

laebshade
источник
1
Спасибо! (1) Используется ли CPULimit только для уже запущенного процесса? Не используется при отправке программы на запуск? (2) фиксирует ли он процент использования ЦП процессом или устанавливает верхний предел для процесса и позволяет его использованию колебаться между 0 и этим пределом в соответствии с другими процессами? (3) Я также обнаружил, что после использования CPULimit в процессе, Ctrl + C не может отменить выполнение, потому что оно скоро вернется к автоматическому запуску. Интересно, почему?
Тим
2
Небольшое предупреждение о CPULimit: он использует SIGSTOP / SIGCONT, чтобы ограничить количество процессорного времени, используемого процессом (процессы, превышающие целевое использование CPU, останавливаются; по прошествии достаточного времени процесс отправляет SIGCONT и возобновляет выполнение). Однако в редких случаях сигналы могут мешать системным вызовам, см. Руководство к библиотеке GNU C. Поскольку CPULimit отправляет эти сигналы много раз в секунду, существует большая вероятность прерывания. Не большая проблема для запуска pdftk на рабочем столе, хотя.
Риккардо Мурри
8

Вы можете арендовать запущенный процесс, чтобы придать ему более или менее приоритетный характер (так называемое «хорошее значение»). Обратите внимание, что шкала приоритетов UNIX несколько нелогична: отрицательные значения означают, что процесс предпочтительнее параллельных процессов, т. Е. Имеет приоритет «больше».

Таким образом, вы можете попытаться «замедлить» ваш процесс, используя его PID через:

# lower priority of a process
renice +1 "PID"

Каждый раз, когда вы запускаете это, процесс "nice value" увеличивается на 1; Вы можете использовать целочисленные значения, кроме, +1конечно.

Команда nice позволяет запустить процесс с корректировкой значения +10 nice (измените это с помощью опции -n). Например:

# start a CPU-intensive task with low priority
nice ./cpu-hog

Однако «хорошее значение» влияет только на то, насколько планировщик предпочитает запускать определенный процесс над другими в системе: если ваш компьютер в основном работает на холостом ходу, повышение «хорошего значения» одного отдельного процесса не остановит этот процесс от принятия 100%. ЦПУ. Я цитирую на man-странице getpriority (2) : (Акцент сделан мной)

Степень, в которой их относительные значения влияют на планирование процессов, варьируется в разных системах Unix, а в Linux - в разных версиях ядра. Начиная с ядра 2.6.23, в Linux был принят алгоритм, обеспечивающий гораздо более сильный эффект относительных различий в хороших значениях. Это приводит к тому, что очень низкие приятные значения (+19) действительно обеспечивают мало процессорного времени для процесса всякий раз, когда в системе есть какая-либо другая более высокая приоритетная нагрузка.

Причина этого кроется в том, как процессы запускаются в ядре, подобном UNIX: каждый раз, когда ядро ​​решает запустить процесс, этот процесс полностью контролирует ядро ​​процессора в течение определенного (фиксированного и короткого) промежутка времени. «Хорошее значение» может влиять на то, как часто планировщик ядра желает выделить временной интервал для процесса, но вы не можете изменить тот факт, что после планирования процесс будет работать без перерыва в течение фиксированного периода времени.

Следовательно, если не замедлять работу процессора, невозможно замедлить процесс, если в системе нет других процессов, которые могут бороться за доступ к процессору.

Риккардо Мурри
источник
Спасибо! Можно ли замедлить процесс от начала до конца независимо от других процессов?
Тим
@ Я не думаю, что то, о чем ты просишь, возможно; Я обновил ответ с более подробной информацией. Надеюсь, что это делает это более ясным.
Риккардо Мурри
1
Другой ответ предложил CPULimit, который, кажется, делает невозможное.
Тим
Ах, я не знал о CPULimit - он определенно заполняет пробел в моем наборе инструментов UNIX.
Риккардо Мурри
niceне сделаю ничего, чтобы ваш процессор остыл. Он не предназначен для такой работы.
Кен Шарп
4

cgroups были созданы именно по этой причине.

http://www.kernel.org/doc/Documentation/cgroups/ http://www.serverwatch.com/tutorials/article.php/3921001/Setting-Up-Linux-Cgroups.htm

Чтобы ознакомиться с ними, требуется некоторое время, и я считаю, что для их настройки вам нужен root-доступ, но все это можно записать в сценарии. Более новые Ubuntus имеют файл .conf, так что вам не нужно писать свой собственный скрипт. Я не уверен насчет 10.10.

Хорошее место для начала в этом ответе: https://askubuntu.com/a/94743/170177

Обратите внимание, что cgroups все еще находится в активной разработке, поэтому некоторые функции могут быть недоступны в вашем текущем ядре.

Использование cgroups cpu.shares не делает ничего, что не подойдет хорошее значение. Звучит так, будто вы действительно хотите задушить процессы, что определенно можно сделать.

Вам нужно будет использовать один или два сценария и / или отредактировать /etc/cgconfig.conf, чтобы определить нужные параметры.

В частности, вы хотите отредактировать значения cpu.cfs_period_us и cpu.cfs_quota_us . Процесс будет разрешено работать в течение cpu.cfs_quota_us микросекунд на cpu.cfs_period_us микросекунд.

Например:

Если cpu.cfs_period_us = 50000 и cpu.cfs_quota_us = 10000, процесс получит максимум 20% времени ЦП, независимо от того, что еще происходит.

На этом скриншоте я дал процессу 2% процессорного времени:

2% процессорного времени

Что касается процесса, он работает на 100%.

Настройки cpu.shares, с другой стороны, могут и будут использовать 100% времени простоя ЦП.

В этом похожем примере я дал процесс cpu.shares = 100 (из 1024):

cpu.shares

Как вы можете видеть, процесс все еще занимает все время простоя процессора.

Ссылки:

http://manpages.ubuntu.com/manpages/precise/man5/cgconfig.conf.5.html http://kennystechtalk.blogspot.co.uk/2015/04/throttling-cpu-usage-with-linux-cgroups .html

Кен Шарп
источник
Примечание: systemdвсе немного по-другому. Например, в Ubuntu Trusty, похоже, есть две службы для управления cgroups. Я обновлю, когда узнаю больше.
Кен Шарп
Но вы можете изменить максимальный процент процессора, когда процесс уже запущен, как renice?
Марко Сулла
reniceне меняет объем используемого процессора, он просто меняет приоритет процесса в планировщике. cgroups может изменить ограничение ЦП в любое время. С тех пор как этот ответ был опубликован, в cgroups были добавлены всевозможные настройки, и он очень мощный
Кен Шарп
renice does not change the amount of CPU usesЯ знаю это;) Я только что опубликовал в качестве примера программы, которая меняет вещи во время выполнения. Спасибо за ваш ответ, я попробую cgroups.
Марко Сулла