Техническая база знаний
Оптимизация работы
Вводная
Полезные ссылки по теме в целом:
- https://access.redhat.com/documentation/ru-RU/Red_Hat_Enterprise_Linux/6/html/Performance_Tuning_Guide/s-network-commonque-soft.html
- https://www.redbooks.ibm.com/redpapers/pdfs/redp4285.pdf
Таймер ядра
Проверка текущего таймера:
cat /sys/devices/system/clocksource/clocksource0/current_clocksource
Отобразить список имеющихся таймеров:
cat /sys/devices/system/clocksource/clocksource0/available_clocksource
Прописать таймер в параметрах ядра:
kernel /vmlinuz-2.6.32-504.23.4.el6.x86_64 ro root=UUID=ffa77d61-73c6-4357-a8a6-fd371ae4427f rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet clocksource=hpet
Включить в /etc/asterisk/asterisk.conf
internaltiming=yes
Вынесение директорий в память
Актуально для Автообзвона. /wiki/spaces/FKB/pages/1297383429.
Оптимизация MySQL
Информация в Базе знаний FIBEX
Балансировка IRQ
Теория
Таймер TIMER в ядре отвечает за выдачу IRQ. Его частота должна быть 1ГГц.
CONFIG_HZ_1000=y CONFIG_HZ=1000
Практика
Документация
Приоритизация процесса
Теория
Приоритет ввода/вывода процесса - ionice
Приоритет вычислений на процессоре - nice
Изменить приоритет вычислений на процессоре - renice
renice priority [ [ -p ] pids ] [ [ -g ] pgrps ] [ [ -u ] users ] -g Force who parameters to be interpreted as process group ID's. -u Force the who parameters to be interpreted as user names. -p Resets the who interpretation to be (the default) process ID's.
Например, повысить приоритет запущенного asterisk на процессоре:
renice -10 `cat /var/run/asterisk/asterisk.pid`
Практика
Документация по теме
Дисковая подсистема
Информация в базе знаний FIBEX
Файловые дескрипторы
Теория
Каждое приложение, читая файл или записываю информацию, используется файловый дескриптор. В системе установлено ограничение на количество открытых файловых дескрипторов для процесса (чтобы не было утечек).
По умолчанию установлено значение 1024 для одного процесса, чего обычно достаточно, но крайне мало. Посмотреть текущие ограничения можно выполнив команду:
ulimit -a
Понятно, что увеличивая количество доступных файловых дескрипторов, возрастает нагрузка на оперативную память.
Помимо прочего, есть общее ограничение для системы, которое прописано параметром ядра в файле /proc/sys/fs/file-max. Посмотреть текущее значение можно выполнив команду:
cat /proc/sys/fs/file-max
file-max & file-nr:
The kernel allocates file handles dynamically, but as yet it doesn't free them again.
The value in file-max denotes the maximum number of file- handles that the Linux kernel will allocate. When you get lots of error messages about running out of file handles, you might want to increase this limit.
Historically, the three values in file-nr denoted the number of allocated file handles, the number of allocated but unused file handles, and the maximum number of file handles. Linux 2.6 always reports 0 as the number of free file handles – this is not an error, it just means that the number of allocated file handles exactly matches the number of used file handles.
Attempts to allocate more file descriptors than file-max are reported with printk, look for «VFS: file-max limit reached».
Кстати, открытые файловые дескрипторы можно посмотреть выполнив команду
lsof
Практика
Чтобы увеличить допустимое количество открытых файловых дескрипторов для процессов, нужно в файл /etc/security/limits.conf добавить следующие строки:
* soft nofile 65535 * hard nofile 65535
Изменения вступят после перезагрузки.
Количество дескрипторов для процесса можно изменить ПЕРЕД его запуском. Для этого в том же терминале, откуда будет запускаться процесс, сначала надо выполнить команду
ulimit -n 65535
Эту же строку можно добавить в init скрипт, в функцию запуска процесса. Но метод через /etc/security/limits.conf является более приоритетным.
Для изменения количества открытых файлов в системе в целом, нужно изменить параметр ядра file-max, для этого необходимо выполнить команду:
sysctl -w fs.file-max=1614948
Можно также добавить установку этого параметра в систему при загрузке. Для этого в файл /etc/sysctl.conf нужно добавить строку:
fs.file-max=1614948
Чтобы изменения в sysctl.conf сразу вступили в силу, нужно выполнить команду:
sysctl -p
Документация по теме
Connection tracking
Теория
Connection tracking refers to the ability to maintain state information about a connection in memory tables, such as source and destination ip address and port number pairs (known as socket pairs), protocol types, connection state and timeouts. Firewalls that do this are known as stateful. Stateful firewalling is inherently more secure than its «stateless» counterpart …. simple packet filtering.
The state table for udp and tcp connections is maintained in /proc/net/ip_conntrack. We will discuss what its contents look below.
The maximum number of connections the state table can contain is stored in /proc/sys/net/ipv4/ip_conntrack_max. This value is determined initially by how much physical memory you have (on my 128Mb machine, ip_conntrack_max = 8184 by default).
Because UDP lacks sequence numbers, it is known as a «stateless» protocol . However, this does not mean we can't track udp connections. There is still other useful information we can utilize. Here is an example state table entry for a newly formed udp connection:
udp 17 19 src=192.168.1.2 dst=192.168.1.50 sport=1032 dport=53 [UNREPLIED] src=192.168.1.50 dst=192.168.1.2 sport=53 dport=1032 use=1
This state table entry can only be made if there is an iptables filter rule specifying NEW connections, something like the following ruleset, which allows NEW connections outbound only (as is often wise):
iptables -A INPUT -p udp -m state --state ESTABLISHED -j ACCEPT iptables -A OUTPUT -p udp -m state --state NEW,ESTABLISHED -j ACCEPT
Things we can tell from the state table entry are as follows:
- The protocol is udp (IP protocol number 17).
- The state table entry has 19 seconds until it expires.
- Source and destination addresses and ports of original query.
- Source and destination addresses and ports of expected reply. The connection is marked UNREPLIED so this has not been received yet.
Udp timeouts are set in /usr/src/linux/net/ipv4/netfilter/ip_conntrack_proto_udp.c at compile time. A single request will enter into the state for 30*HZ (generally 30 seconds). In the example above, where we have 19 seconds left, 11 seconds have already elapsed without a reply being received. Once a reply is received, and allowed by a rule permitting ESTABLISHED connections, the timeout is reset to 30 seconds and the UNREPLIED mark is removed. Here we see the connection a couple of seconds after this has taken place:
udp 17 28 src=192.168.1.2 dst=192.168.1.50 sport=1032 dport=53 src=192.168.1.50 dst=192.168.1.2 sport=53 dport=1032 use=1
If multiple requests and replies occur between the same socket pairs, the entry is considered to be a stream and the timeout changes to 180 seconds. At this point the entry is marked ASSURED (once connections become ASSURED they are not dropped under heavy load ). Here we see the connection a few of seconds after this has taken place:
udp 17 177 src=192.168.1.2 dst=192.168.1.50 sport=1032 dport=53 src=192.168.1.50 dst=192.168.1.2 sport=53 dport=1032 [ASSURED] use=1
There is no absolute timeout for a udp connection (or a tcp connection for that matter), provided traffic keeps flowing.
Практика
Включение conntrack происходит подгрузкой соответствующего модуля nf_conntrack
modprobe nf_conntrack
Я прописывал грузку модуля в /etc/conf.d/modules, чтобы он автоматически загружался вместе с системой. Конечно, чтобы модуль присутствовал, он должен скомпилирован вместе с ядром ОС, иначе будет отображено сообщение о том, что модуль отсутствует.
Убедиться, что модуль загружен, можно посмотрев список загруженных модулей:
lsmod | grep conntrack nf_conntrack_ipv4 9945 3 nf_nat,iptable_nat nf_defrag_ipv4 1171 1 nf_conntrack_ipv4 nf_conntrack 48926 3 nf_conntrack_ipv4,nf_nat,iptable_nat
Также свидетельством того, что модуль в системе присутствует, является наличие файла /proc/net/ip_conntrack с кучей всякого содержимого. Если оно так, это уже хорошо.
Далее можно изменить максимальное количество сессий, которое будет учитываться ядром. Для этого в файл /etc/sysctl.conf надо добавить строки:
net.ipv4.netfilter.ip_conntrack_max=1048576 net.netfilter.nf_conntrack_max = 1048576 net.nf_conntrack_max = 1048576
Изменения вступят в силу при перезагрузке автоматически. Но можно применить внесенные изменения в систему сразу, выполнив команду:
sysctl -p
Проверить текущие настройки conntrack можно командой
sysctl -a | grep conntrack
Увеличение буферов сетевой карты
Для 6 centos на VMware вот эта инструкция по увеличению буферов сетевой карты - весьма важная штука. без неё на 80+ одновременных вызовах могут быть проблемы
https://vswitchzero.com/2017/09/26/vmxnet3-rx-ring-buffer-exhaustion-and-packet-loss/