Хотелось бы поговорить о гувернантках, но будем обсуждать губернаторов. (governors).
🔤 🔤 🔤 🔤 🔤 🔤 🔤
Сейчас практически везде идет борьба за экологию, поэтому производители пытаются делать процы «зелеными». Есть нагрузка - частоту поднимают, нет нагрузки - частоту снижают и сразу падает тепловыделение и энергопотребление.
ㅤ
Так вот, управляют частотой/производительностью/энергопотреблением специальные алгоритмы, которые называются governors. Чтобы было проще выбирать, их наштамповали несколько видов:
К сожалению не все губеры доступны для вашей системы. Список доступных можно посмотреть так:
Вот, у меня на ноуте доступны только два: performance schedutil
Используемый в настоящее время:
Обратите внимание, governor задается для каждого ядра отдельно.
Ну, и для чего это нужно. Иногда бывают процелюбивые задачи. (кодирование видео и аудио, конверсия фоток, многопоточная компрессия, шифрование...)
И пофигу на электроэнергию и тепловыделение, лишь бы быстрее закончилась. Тогда можно на время выполнения задачи изменить governor.
Делается это простым скриптом:
Если все делать в ручном режиме. Поменять governor для всех ядер можно командой:
здесь
Такая установка проживет до перезагрузки. Если требуется постоянные настройки - можно поставить в
Продолжение следует.
🛠 #cpu #performance #frequency #governor
—
💬 Bashdays 📲 MAX 🌐 LF 🔵 Blog
Сейчас практически везде идет борьба за экологию, поэтому производители пытаются делать процы «зелеными». Есть нагрузка - частоту поднимают, нет нагрузки - частоту снижают и сразу падает тепловыделение и энергопотребление.
ㅤ
Так вот, управляют частотой/производительностью/энергопотреблением специальные алгоритмы, которые называются governors. Чтобы было проще выбирать, их наштамповали несколько видов:
performance — максимальная производительность (Ну, почти максимальная)powersave — максимальное энергосбережениеondemand — быстрое изменение частоты от нагрузкиconservative — медленное изменение частоты от нагрузкиschedutil — интеграция с планировщиком ядра LinuxК сожалению не все губеры доступны для вашей системы. Список доступных можно посмотреть так:
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors
Вот, у меня на ноуте доступны только два: performance schedutil
Используемый в настоящее время:
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
Обратите внимание, governor задается для каждого ядра отдельно.
Ну, и для чего это нужно. Иногда бывают процелюбивые задачи. (кодирование видео и аудио, конверсия фоток, многопоточная компрессия, шифрование...)
И пофигу на электроэнергию и тепловыделение, лишь бы быстрее закончилась. Тогда можно на время выполнения задачи изменить governor.
Делается это простым скриптом:
#!/bin/bash
declare -a KEEP_GOVERNOR
declare DIR_PREFIX=/sys/devices/system/cpu
declare SET_GOVERNOR='performance'
declare -i NPROC=$(nproc) # число ядер (процессоров)
declare -i PRESENT=0
#Проверка поддержки governor системой
for G in $(cat "$DIR_PREFIX/cpu0/cpufreq/scaling_available_governors");do
if [[ "$SET_GOVERNOR" == "$G" ]];then
PRESENT=1
break
fi
done
if !((PRESENT));then
echo GOVERNOR $SET_GOVERNOR not supported.
printf "Available governors : "
cat "$DIR_PREFIX/cpu0/cpufreq/scaling_available_governors"
exit 1
fi
# Keep current setting
I=NPROC
while ((I--));do
KEEP_GOVERNOR[$I]=$(cat "$DIR_PREFIX/cpu${I}/cpufreq/scaling_governor")
done
# Set (Для установки требуются привилегии)
I=NPROC
while ((I--));do
echo "$SET_GOVERNOR">"$DIR_PREFIX/cpu${I}/cpufreq/scaling_governor"
done
#Здесь ВАШ код
sleep 10
##############
# Restore settings
I=NPROC
while ((I--));do
echo "${KEEP_GOVERNOR[$I]}">"$DIR_PREFIX/cpu${I}/cpufreq/scaling_governor"
done
Если все делать в ручном режиме. Поменять governor для всех ядер можно командой:
sudo echo performance| sudo tee /sys/devices/system/cpu/cpu{0..1}/cpufreq/scaling_governorздесь
performance - задаваемый governor{0..1} - описание числа процессоров (ядер). Для шестнадцати {0..15}.Такая установка проживет до перезагрузки. Если требуется постоянные настройки - можно поставить в
cron @reboot, прописать в grub или воспользоваться специальными утилитами.Продолжение следует.
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Здесь я рассказал, как просто управлять производительностью сервера с помощью governors.
🔤 🔤 🔤 🔤 🔤 🔤 🔤
ㅤ
Но есть еще один способ: Прямое управление частотой.
Дело в том, что governor задает только скорость нарастания и убывания частоты, в зависимости от нагрузки. Сами частоты заданы в файлах:
Но и пределы частоты тоже можно менять.
Правда на некоторых процессорах их нельзя менять произвольно, их список может быть жестко задан. Обычно список допустимых частот описан в файле
(это для нулевого ядра)
У меня на ноуте, например, 1350000 1200000 1000000
Посмотреть частоты можно здесь:
👆 Надеюсь, всем понятно, что разогнать проц данным способом не получится.
Таким образом, командой типа:
Любой governor превращается в performance. Пути к файлам я опустил, и на всякий случай напомню, что частоты задаются для каждого ядра отдельно.
Кстати, повышать частоты требуется не всегда.
Приведу пример:
У меня работает роутер на мини-PC. Если использовать его только как роутер - нагрузка максимум 5%.
Я поставил туда торрент-качалку. А она может загрузить проц, даже если использовать
Теперь мини-PC холодный, даже если прикидывается сервером и работает на 100% (В полку).
Код для установки максимальной производительности получается несколько проще, чем с governor:
Всем стабильных серваков!
🛠 #cpu #performance #frequency #governor
—
💬 Bashdays 📲 MAX 🌐 LF 🔵 Blog
ㅤ
Но есть еще один способ: Прямое управление частотой.
Дело в том, что governor задает только скорость нарастания и убывания частоты, в зависимости от нагрузки. Сами частоты заданы в файлах:
/sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freqscaling_cur_freqscaling_max_freqНо и пределы частоты тоже можно менять.
Правда на некоторых процессорах их нельзя менять произвольно, их список может быть жестко задан. Обычно список допустимых частот описан в файле
/sys/devices/system/cpu/cpu0/cpufreq/scaling_available_frequencies(это для нулевого ядра)
У меня на ноуте, например, 1350000 1200000 1000000
Посмотреть частоты можно здесь:
cpuinfo_min_freq - минимальная частота ядраcpuinfo_cur_freq - текущаяcpuinfo_max_freq - максимальная👆 Надеюсь, всем понятно, что разогнать проц данным способом не получится.
Таким образом, командой типа:
cp cpuinfo_max_freq scaling_min_freqЛюбой governor превращается в performance. Пути к файлам я опустил, и на всякий случай напомню, что частоты задаются для каждого ядра отдельно.
Кстати, повышать частоты требуется не всегда.
Приведу пример:
У меня работает роутер на мини-PC. Если использовать его только как роутер - нагрузка максимум 5%.
Я поставил туда торрент-качалку. А она может загрузить проц, даже если использовать
nice. Но я задал минимальную частоту в качестве максимальной:cp cpuinfo_min_freq scaling_max_freqТеперь мини-PC холодный, даже если прикидывается сервером и работает на 100% (В полку).
Код для установки максимальной производительности получается несколько проще, чем с governor:
#!/bin/bash
declare -a KEEP_MINFREQ
declare DIR_PREFIX=/sys/devices/system/cpu
declare -i NPROC=$(nproc) # число ядер (процессоров)
# Keep current setting
I=NPROC
while ((I--));do
KEEP_MINFREQ[$I]=$(cat "$DIR_PREFIX/cpu${I}/cpufreq/scaling_min_freq")
done
# Set
I=NPROC
while ((I--));do
# Поднимаем минимальную частоту до максимума
cp "$DIR_PREFIX/cpu${I}/cpufreq/cpuinfo_max_freq" "$DIR_PREFIX/cpu${I}/cpufreq/scaling_min_freq"
done
#Здесь ВАШ код
sleep 10
##############
# Restore settings
I=NPROC
while ((I--));do
echo "${KEEP_MINFREQ[$I]}">"$DIR_PREFIX/cpu${I}/cpufreq/scaling_min_freq"
done
Всем стабильных серваков!
—
Please open Telegram to view this post
VIEW IN TELEGRAM
CPU AFFINITY
🔤 🔤 🔤 🔤 🔤 🔤 🔤
Предыдущие статьи по настройке производительности Здесь и Здесь:
В современных системах число ядер только растет. И запущенный процесс гуляет по ядрам, как разочаровавшаяся в любви девушка.
ㅤ
Таким образом планировщик системы пытается балансировать нагрузку, ресурсы (и тепловыделение). Но это поведение можно изменить.
С помощью программы можно taskset можно запускать процессы на указанных ядрах.
Например:
Запустит
Фактически
Если использовать ключик
Современные процессоры имеют гибридную архитектуру. Т.е. они содержат и энергоэффективные и производительные ядра.
Так вот, с помощью этой команды можно немного оптимизировать производительность - ограничивая второстепенным приложениям доступ к высокопроизводительным ядрам.
Ну, или для всей «шушеры» выделить пару ядер, освободив остальные для самых важных процессов.
Но если Вам лень этим заниматься - знайте, что планировщик и так неплохо справляется. Единственное, чего он не знает - какие процессы для Вас более важные. Но ему всегда об этом можно напомнить, с помощью команды nice.
Ну, и напоследок - вредный совет.
Однажды у моего коллеги на работе эффективные менеджеры ввели KPI.
Деньги начали платить по проделанной, а не стабильной работе. После этого у всех, включая бухгалтерию в конце квартала все начинало тормозить Но не сразу, а как-то плавно, но заметно.
И приходилось проводить сложную многочасовую оптимизацию систем (оптимизация дисков, переиндексирование, очистка кэшей...). После которой все до конца следующего отчетного периода работало нормально.
А потом - о5-25.
Но как они этого добивались - я не знаю :-)
🛠 #cpu #core #taskset #nice #perfomance
—
💬 Bashdays 📲 MAX 🌐 LF 🔵 Blog
По просьбе коллеги @dox89.
Предыдущие статьи по настройке производительности Здесь и Здесь:
В современных системах число ядер только растет. И запущенный процесс гуляет по ядрам, как разочаровавшаяся в любви девушка.
ㅤ
Таким образом планировщик системы пытается балансировать нагрузку, ресурсы (и тепловыделение). Но это поведение можно изменить.
С помощью программы можно taskset можно запускать процессы на указанных ядрах.
Например:
taskset --cpu-list 0-2,6 thunderbird
Запустит
thunderbird, и разрешит почтовому клиенту работать только на указанных ядрах.Фактически
taskset не разрешает работать на указанных ядрах, а запрещает работать на всех остальных, потому что по умолчанию любому процессу можно работать на всех ядрах.Если использовать ключик
-p PID, то аналогичную процедуру можно выполнить с уже запущенным процессом.Современные процессоры имеют гибридную архитектуру. Т.е. они содержат и энергоэффективные и производительные ядра.
Так вот, с помощью этой команды можно немного оптимизировать производительность - ограничивая второстепенным приложениям доступ к высокопроизводительным ядрам.
Ну, или для всей «шушеры» выделить пару ядер, освободив остальные для самых важных процессов.
Но если Вам лень этим заниматься - знайте, что планировщик и так неплохо справляется. Единственное, чего он не знает - какие процессы для Вас более важные. Но ему всегда об этом можно напомнить, с помощью команды nice.
Ну, и напоследок - вредный совет.
Однажды у моего коллеги на работе эффективные менеджеры ввели KPI.
Деньги начали платить по проделанной, а не стабильной работе. После этого у всех, включая бухгалтерию в конце квартала все начинало тормозить Но не сразу, а как-то плавно, но заметно.
И приходилось проводить сложную многочасовую оптимизацию систем (оптимизация дисков, переиндексирование, очистка кэшей...). После которой все до конца следующего отчетного периода работало нормально.
А потом - о5-25.
Но как они этого добивались - я не знаю :-)
man tasksetman nice—
Please open Telegram to view this post
VIEW IN TELEGRAM
Борьба за производительность
В продолжение истории борьбы за производительность.
🔤 🔤 🔤 🔤 🔤 🔤 🔤 🔤
Допустим у нас есть что-то, что обладает каким-то неприличным количеством ядер, например 16.
ㅤ
И нам надо разбалансировать эти ядра между разными «типами» нагрузки.
Причем мы точно знаем, сколько ядер нам надо для одного типа и точно не знаем, сколько нужно для всего остального.
Тут на помощь приходят 4 параметра ядра -
В рамках решаемого кейса сразу указал на них, что сократило поиск необходимых решений.
По сути, все 4 параметра решают одну задачу - ограничить использование указанных ядер (например 0-3) процессами, за исключением базовых - init, scsi и прочих.
Таким образом мы можем через тот же
В данной картине мы защищаем этот сегмент от службы
Но будьте внимательны при изоляции, так как в случае количества процессоров > 1 нужно чуть иначе выставлять диапазоны, чтобы не угодить в яму NUMA. Там деление ядер от 0 до последнего происходит сегментами по очереди.
Конкретно мой случай изоляции был применен в рамках разделения нагрузки на сетевые прерывания и nginx, но в совокупности факторов - параметры ядра, отключенный + маскированный
🛠 #cpu #core #taskset #nice #perfomance
—
💬 Bashdays 📲 MAX 🌐 LF 🔵 Blog
В продолжение истории борьбы за производительность.
Допустим у нас есть что-то, что обладает каким-то неприличным количеством ядер, например 16.
ㅤ
И нам надо разбалансировать эти ядра между разными «типами» нагрузки.
Причем мы точно знаем, сколько ядер нам надо для одного типа и точно не знаем, сколько нужно для всего остального.
Тут на помощь приходят 4 параметра ядра -
isolcpus, nohz_full, rcu_nocbs и irqaffinity.В рамках решаемого кейса сразу указал на них, что сократило поиск необходимых решений.
По сути, все 4 параметра решают одну задачу - ограничить использование указанных ядер (например 0-3) процессами, за исключением базовых - init, scsi и прочих.
Таким образом мы можем через тот же
taskset указать вручную на ядра 0-3 те процессы, что нам нужны.В данной картине мы защищаем этот сегмент от службы
irqbalance, которая с завидным упорством будет ребалансировать процессы между ядрами.Но будьте внимательны при изоляции, так как в случае количества процессоров > 1 нужно чуть иначе выставлять диапазоны, чтобы не угодить в яму NUMA. Там деление ядер от 0 до последнего происходит сегментами по очереди.
Конкретно мой случай изоляции был применен в рамках разделения нагрузки на сетевые прерывания и nginx, но в совокупности факторов - параметры ядра, отключенный + маскированный
irqbalance, taskset и еще несколько твиков - давало профит только при утилизации сетевой карты лишь до 70%, дальше спецэффекты постепенно возвращались.—
Please open Telegram to view this post
VIEW IN TELEGRAM