Довольно часто можно встретить примеры настройки (тюнинга) сетевого стека Linux для высоконагруженных систем, однако некоторые из этих гайдов сильно устарели и не используют рекомендованные подходы к конфигурированию системы. В этом обзоре мы рассмотрим подготовку Linux, для использования в качестве узла плоскости управления Kubernetes.
Tuned
Tuned – это демон, который использует udev для отслеживания подключенных устройств
и статически или динамически настраивает системные настройки используя выбранный профиль.
Tuned устанавливается вместе с коллекцией профилей под определенные типы нагрузки: network-latency, powersave, desktop и другие.
Для установки tuned на дистрибутивах использующих yum/dnf:
yum install -y tuned
systemctl enable --now tuned
systemctl status tuned
Для того, чтобы вывести активный профиль:
tuned-adm active
Current active profile: virtual-host
Для того, чтобы вывести список со всеми доступными профилями tuned:
tuned-adm list
Available profiles:
- accelerator-performance - Throughput performance based tuning with disabled higher latency STOP states
- aws - Optimize for aws ec2 instances
- balanced - General non-specialized tuned profile
- desktop - Optimize for the desktop use-case
- hpc-compute - Optimize for HPC compute workloads
- intel-sst - Configure for Intel Speed Select Base Frequency
- latency-performance - Optimize for deterministic performance at the cost of increased power consumption
- network-latency - Optimize for deterministic performance at the cost of increased power consumption, focused on low latency network performance
- network-throughput - Optimize for streaming network throughput, generally only necessary on older CPUs or 40G+ networks
- optimize-serial-console - Optimize for serial console use.
- powersave - Optimize for low power consumption
- throughput-performance - Broadly applicable tuning that provides excellent performance across a variety of common server workloads
- virtual-guest - Optimize for running inside a virtual guest
- virtual-host - Optimize for running KVM guests
Current active profile: network-latency
Для того, чтобы активировать профиль «network-latency»:
tuned-adm profile network-latency
tuned-adm active
Current active profile: network-latency
Настройки для профиля «network-latency»:
cat /usr/lib/tuned/network-latency/tuned.conf
#
# tuned configuration
#
[main]
summary=Optimize for deterministic performance at the cost of increased power consumption, focused on low latency network performance
include=latency-performance
[vm]
transparent_hugepages=never
[sysctl]
net.core.busy_read=50
net.core.busy_poll=50
net.ipv4.tcp_fastopen=3
kernel.numa_balancing=0
[bootloader]
cmdline_network_latency=skew_tick=1
С помощью директивы «include» в этом профиле включены настройки из «latency-performance».
Существуют профили tuned с настройками для высоконагруженных баз данных:
yum search tuned-profiles
yum install -y tuned-profiles-mssql tuned-profiles-oracle
По-умолчанию tuned работает в режиме демона Linux, но это можно поменять добавив daemon = 0
в /etc/tuned/tuned-main.conf
.
Создаем кастомный профиль tuned
Профили tuned по-умолчанию находятся в каталоге /etc/tuned/<profile_name>/tuned.conf
или в /usr/lib/tuned/<profile_name>/tuned.conf
.
Создайте директорию для вашего профиля:
mkdir /usr/lib/tuned/custom
Создайте новый конфиг в директории профиля:
touch /usr/lib/tuned/custom/tuned.conf
Сделайте файл исполняемым:
chmod +x /usr/lib/tuned/custom/tuned.conf
Откройте для редактирования (vim /usr/lib/tuned/custom/tuned.conf
) созданный профиль и добавьте следующие строчки:
[main]
summary=Кастомизированный профиль tuned
В списке с доступными профилями должен появится новый пресет:
tuned-adm list | grep custom
- custom - Кастомизированный профиль tuned
Скопируйте пример профиля «железного» хоста или виртуальной машины предназначенной для установки узлов плоскости Kubernetes:
[main]
summary=Кастомизированный профиль tuned
[cpu]
governor=performance
energy_perf_bias=performance
min_perf_pct=100
[vm]
transparent_hugepages=never
[net]
nf_conntrack_hashsize=131072
[sysctl]
net.ipv4.ip_forward=1
net.core.busy_read=50
net.core.busy_poll=50
# Увеличиваем значения параметров net.nf_conntrack_max и net.netfilter.nf_conntrack_max,
# отвечающих за максимальное количество сетевых соединений.
net.netfilter.nf_conntrack_max=1048576
net.nf_conntrack_max=1048576
# https://datatracker.ietf.org/doc/html/rfc7413
# https://repository.ihu.edu.gr/xmlui/bitstream/handle/11544/29857/Grendas_Dimitrios_Dissertation_IHU_Cybersecurity_2021.pdf?sequence=1
# Для сборки nginx с поддержкой TCP Fast Open нужно использовать флаг `-DTCP_FASTOPEN=23`
# https://github.com/VKCOM/nginx-quic/issues/1
net.ipv4.tcp_fastopen=3
# https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux_for_real_time/7/html/tuning_guide/reduce_tcp_performance_spikes
net.ipv4.tcp_timestamps=0
kernel.sched_autogroup_enabled=0
kernel.sched_migration_cost_ns=5000000
kernel.sched_min_granularity_ns=10000000
# https://github.com/kubernetes-sigs/kubespray/issues/8825
net.ipv4.conf.all.arp_announce=2
net.ipv4.neigh.default.gc_thresh1=8192
net.ipv4.neigh.default.gc_thresh2=32768
net.ipv4.neigh.default.gc_thresh3=65536
net.ipv6.neigh.default.gc_thresh1=8192
net.ipv6.neigh.default.gc_thresh2=32768
net.ipv6.neigh.default.gc_thresh3=65536
fs.inotify.max_user_watches=65536
fs.inotify.max_user_instances=8192
# Разрешаем больше SYN соединений
net.ipv4.tcp_max_syn_backlog=100000
# И больше запросов на сокет
net.core.somaxconn=100000
# Увеличиваем значения по-умолчанию для сокетов TCP. Три значения: minimum, default, maximum.
net.ipv4.tcp_wmem='4096 12582912 16777216'
net.ipv4.tcp_rmem='4096 12582912 16777216'
# Расширяем диапазон динамических портов
net.ipv4.ip_local_port_range='10240 65535'
vm.max_map_count=262144
[sysfs]
/sys/module/nvme_core/parameters/io_timeout=4294967295
/sys/module/nvme_core/parameters/max_retries=10
Примените данный профиль в системе:
tuned-adm profile custom
Для того, чтобы проверить работу tuned
выполните следующую команду:
cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor
performance
Благодаря scaling_governor
, можно выбрать оптимальную схему управления частотой процессора, что влияет на потребление электроэнергии и производительность:
cpupower -c all frequency-info
Теперь если вы поменяете значение scaling_governor
на powersave (режим энергосбережения) и снова выполните команду:
cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor
powersave