Bash Days | Linux | DevOps
23.3K subscribers
149 photos
24 videos
676 links
Авторский канал от действующего девопса

Самобытно про разработку, devops, linux, скрипты, сисадминство, техдирство и за айтишную жизу.

Автор: Роман Шубин
Реклама: @maxgrue

MAX: https://max.ru/bashdays

Курс: @tormozilla_bot
Блог: https://bashdays.ru
Download Telegram
Хотелось бы поговорить о гувернантках, но будем обсуждать губернаторов. (governors).

🔤🔤🔤🔤🔤🔤🔤

Сейчас практически везде идет борьба за экологию, поэтому производители пытаются делать процы «зелеными». Есть нагрузка - частоту поднимают, нет нагрузки - частоту снижают и сразу падает тепловыделение и энергопотребление.

Так вот, управляют частотой/производительностью/энергопотреблением специальные алгоритмы, которые называются 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 или воспользоваться специальными утилитами.

Продолжение следует.

🛠 #cpu #performance #frequency #governor

💬 Bashdays 📲 MAX 🌐 LF 🔵 Blog
Please open Telegram to view this post
VIEW IN TELEGRAM
36
Здесь я рассказал, как просто управлять производительностью сервера с помощью governors.

🔤🔤🔤🔤🔤🔤🔤

Но есть еще один способ: Прямое управление частотой.

Дело в том, что governor задает только скорость нарастания и убывания частоты, в зависимости от нагрузки. Сами частоты заданы в файлах:

/sys/devices/system/cpu/cpu0/cpufreq/

scaling_min_freq
scaling_cur_freq
scaling_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

Всем стабильных серваков!

🛠 #cpu #performance #frequency #governor

💬 Bashdays 📲 MAX 🌐 LF 🔵 Blog
Please open Telegram to view this post
VIEW IN TELEGRAM
38
CPU AFFINITY

По просьбе коллеги @dox89.


🔤🔤🔤🔤🔤🔤🔤

Предыдущие статьи по настройке производительности Здесь и Здесь:

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

Таким образом планировщик системы пытается балансировать нагрузку, ресурсы (и тепловыделение). Но это поведение можно изменить.

С помощью программы можно taskset можно запускать процессы на указанных ядрах.

Например:

taskset --cpu-list 0-2,6 thunderbird


Запустит thunderbird, и разрешит почтовому клиенту работать только на указанных ядрах.

Фактически taskset не разрешает работать на указанных ядрах, а запрещает работать на всех остальных, потому что по умолчанию любому процессу можно работать на всех ядрах.

Если использовать ключик -p PID, то аналогичную процедуру можно выполнить с уже запущенным процессом.

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

Так вот, с помощью этой команды можно немного оптимизировать производительность - ограничивая второстепенным приложениям доступ к высокопроизводительным ядрам.

Ну, или для всей «шушеры» выделить пару ядер, освободив остальные для самых важных процессов.

Но если Вам лень этим заниматься - знайте, что планировщик и так неплохо справляется. Единственное, чего он не знает - какие процессы для Вас более важные. Но ему всегда об этом можно напомнить, с помощью команды nice.

Ну, и напоследок - вредный совет.

Однажды у моего коллеги на работе эффективные менеджеры ввели KPI.

Деньги начали платить по проделанной, а не стабильной работе. После этого у всех, включая бухгалтерию в конце квартала все начинало тормозить Но не сразу, а как-то плавно, но заметно.

И приходилось проводить сложную многочасовую оптимизацию систем (оптимизация дисков, переиндексирование, очистка кэшей...). После которой все до конца следующего отчетного периода работало нормально.

А потом - о5-25.

Но как они этого добивались - я не знаю :-)

man taskset
man nice

🛠 #cpu #core #taskset #nice #perfomance

💬 Bashdays 📲 MAX 🌐 LF 🔵 Blog
Please open Telegram to view this post
VIEW IN TELEGRAM
46
Борьба за производительность

В продолжение истории борьбы за производительность.

🔤🔤🔤🔤🔤🔤🔤🔤

Допустим у нас есть что-то, что обладает каким-то неприличным количеством ядер, например 16.

И нам надо разбалансировать эти ядра между разными «типами» нагрузки.
Причем мы точно знаем, сколько ядер нам надо для одного типа и точно не знаем, сколько нужно для всего остального.

Тут на помощь приходят 4 параметра ядра - isolcpus, nohz_full, rcu_nocbs и irqaffinity.

В рамках решаемого кейса сразу указал на них, что сократило поиск необходимых решений.

По сути, все 4 параметра решают одну задачу - ограничить использование указанных ядер (например 0-3) процессами, за исключением базовых - init, scsi и прочих.

Таким образом мы можем через тот же taskset указать вручную на ядра 0-3 те процессы, что нам нужны.

В данной картине мы защищаем этот сегмент от службы irqbalance, которая с завидным упорством будет ребалансировать процессы между ядрами.

Но будьте внимательны при изоляции, так как в случае количества процессоров > 1 нужно чуть иначе выставлять диапазоны, чтобы не угодить в яму NUMA. Там деление ядер от 0 до последнего происходит сегментами по очереди.

Конкретно мой случай изоляции был применен в рамках разделения нагрузки на сетевые прерывания и nginx, но в совокупности факторов - параметры ядра, отключенный + маскированный irqbalance, taskset и еще несколько твиков - давало профит только при утилизации сетевой карты лишь до 70%, дальше спецэффекты постепенно возвращались.

🛠 #cpu #core #taskset #nice #perfomance

💬 Bashdays 📲 MAX 🌐 LF 🔵 Blog
Please open Telegram to view this post
VIEW IN TELEGRAM
20