﻿# Подготовка ОС Linux для работы в высоконагруженном кластере

> [HTML Version](preparing-optimized-kernel.html)

Чтобы обеспечить максимальную производительность и стабильность работы системы Kubernetes, оптимизируйте операционную систему, на которой она запущена. В этой статье рассмотрим установку оптимизированного ядра на примере ОС Ubuntu 20.04.

Оптимизированное ядро Ubuntu — это специально адаптированное ядро Linux. Оно включает в себя набор изменений и оптимизаций, которые направлены на повышение эффективности использования ресурсов системы и улучшение обработки сетевых запросов.

Настройка оптимизированного ядра системы Ubuntu для работы с Kubernetes состоит из двух этапов:

1. [Установка оптимизированного ядра.](#install-optimized-kernel)

2. [Оптимизация сетевых параметров.](#optimization-network-params)

## Шаг 1. Установка оптимизированного ядра

1. ## Установите оптимизированное ядро Ubuntu:

````
sudo apt-get install linux-lowlatency-hwe-20.04 -y

2. ````
После успешной установки выполните перезагрузку системы:

````
sudo reboot

## ````
Шаг 2. Оптимизация сетевых параметров

1. ## Создайте файл tuned-sysctl.sh, вставьте в него следующий скрипт:

````
\#\!/bin/bash  
  
CONNTRACK\_MAX\_PER\_CORE=131072  
CONNTRACK\_MIN=524288  
  
CPU\_NUM=\`cat /proc/cpuinfo | grep -E '^processor\\s+:\\s+\[0-9\]+\$' | wc -l\`  
CONNTRACK\_BY\_CPU=\$(( \$CPU\_NUM \* \$CONNTRACK\_MAX\_PER\_CORE ))  
NF\_CONNTRACK\_MAX=\$(( \$CONNTRACK\_BY\_CPU > \$CONNTRACK\_MIN ? \$CONNTRACK\_BY\_CPU : \$CONNTRACK\_MIN ))  
MEM\_NUM=\`awk '/^MemTotal:/\{print \$2\}' /proc/meminfo\`  
  
sysctl -w net.netfilter.nf\_conntrack\_max=\$NF\_CONNTRACK\_MAX # установить ограничение на количество conntrack  
sysctl -w net.nf\_conntrack\_max=\$NF\_CONNTRACK\_MAX  
echo \$(( \$NF\_CONNTRACK\_MAX / 4 )) > /sys/module/nf\_conntrack/parameters/hashsize # установить пропорциональный размер хеш-таблицы для поиска по contact  
  
\# Общая оптимизация  
sysctl -w vm.swappiness=0  
sysctl -w net.core.somaxconn=1000  
sysctl -w net.core.netdev\_max\_backlog=5000  
sysctl -w net.core.rmem\_max=\$MEM\_NUM  
sysctl -w net.core.wmem\_max=\$MEM\_NUM  
sysctl -w net.ipv4.tcp\_wmem="4096 87380 \$MEM\_NUM"  
sysctl -w net.ipv4.tcp\_rmem="4096 87380 \$MEM\_NUM"  
sysctl -w net.ipv4.tcp\_max\_syn\_backlog=8096  
sysctl -w net.ipv4.tcp\_no\_metrics\_save=1  
sysctl -w net.ipv4.tcp\_slow\_start\_after\_idle=0  
sysctl -w net.ipv4.tcp\_tw\_reuse=1  
sysctl -w net.ipv4.ip\_local\_port\_range="10500 65535"  
sysctl -w net.ipv4.neigh.default.gc\_thresh1=16384  
sysctl -w net.ipv4.neigh.default.gc\_thresh2=28672  
sysctl -w net.ipv4.neigh.default.gc\_thresh3=32768  
sysctl -w net.bridge.bridge-nf-call-iptables=1 # этот параметр необходим для работы kube-proxy  
sysctl -w net.bridge.bridge-nf-call-arptables=1 # этот параметр необходим для работы kube-proxy  
sysctl -w net.bridge.bridge-nf-call-ip6tables=1 # этот параметр необходим для работы kube-proxy  
sysctl -w vm.dirty\_ratio=80  
sysctl -w vm.dirty\_background\_ratio=5  
sysctl -w vm.dirty\_expire\_centisecs=12000  
sysctl -w fs.file-max=1000000  
sysctl -w vm.min\_free\_kbytes=131072  
sysctl -w kernel.numa\_balancing=0  
sysctl -w fs.inotify.max\_user\_watches=524288  
sysctl -w fs.inotify.max\_user\_instances=5120  
sysctl -w kernel.pid\_max=2000000  
  
\# параметры kubelet  
sysctl -w vm.overcommit\_memory=1  
sysctl -w kernel.panic=10  
sysctl -w kernel.panic\_on\_oops=1  
  
\# Параметр nofile задает максимальное количество открытых файлов  
echo -e "\* hard nofile 4194304\\n\* soft nofile 4194304" >> /etc/security/limits.conf

2. ````
Выдайте права на запуск созданного файла:

````
sudo chmod +x tuned-sysctl.sh

3. ````
Запустите файл:

````
sudo ./tuned-sysctl.sh

4. ````
Откройте crontab-файл на редактирование:

````
sudo crontab -e

5. ````
Добавьте в файл команду для запуска скрипта после перезагрузки:

````
@reboot sleep 180 \&\& /path/to/tuned-sysctl.sh
````