Разработчик и интегратор VoIP решений
Работаем по всей России и СНГ
Заказать звонок

Техническая база знаний

Оптимизация работы

Вводная 

Полезные ссылки по теме в целом: 

Таймер ядра

Проверка текущего таймера:

cat /sys/devices/system/clocksource/clocksource0/current_clocksource

Отобразить список имеющихся таймеров:

cat /sys/devices/system/clocksource/clocksource0/available_clocksource

Прописать таймер в параметрах ядра (cat /boot/grub/menu.lst | grep hpet):

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

Вынесение директорий в память

Создать директории:

mkdir -p /var/spool/asterisk/tmp
mkdir -p /var/spool/asterisk/tmprecs
mkdir -p /var/spool/asterisk/outgoing

Добавить в /etc/fstab маунт этих директорий в память (/etc/fstab):

tmpfs           /var/spool/asterisk/tmp/    tmpfs   nodev,nosuid,noexec     0 0
tmpfs           /var/spool/asterisk/tmprecs tmpfs   nodev,nosuid,noexec,nodiratime,size=512M   0 0
tmpfs           /var/spool/asterisk/outgoing    tmpfs   noexec,nosuid,nodev,nodiratime,size=12M     0 0

Внести изменение в /var/lib/asterisk/agi-bin/daemon.pl:

$filee="/var/spool/asterisk/outgoing/z_".$arr{'number'}.".call";
# Строку ниже закомментировать
#$tmp="/var/tmp/z_".$arr{'number'}.".call";
# Строку ниже добавить
$tmp="/var/spool/asterisk/tmp/z_".$arr{'number'}.".call";
if(!(-e $filee)){
Оптимизация MySQL 

Теория 
  • mysqltuner.pl
  • tuning-primer.sh
Практика

Документация  Балансировка 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`

Практика 

Документация по теме 

Дисковая подсистема 

Теория 

Разные шедулеры 

  • noop 
  • deadline 
  • cfq 

Практика 

Скрипт проверки шедулера (iqsheduler.sh)

#!/bin/bash
  
disk="$1"
hdparm=`which hdparm`
  
# Make sure this script in run as root
if ; then
   echo "This script must be run as root" 1>&2
   exit 1
fi
  
  
# Test if hdparm is installed
test -x $hdparm || exit 5
  
# Test if $disk variable is provided
if [ -z "$disk" ]; then
echo "Block device not defined" && exit 1
fi
  
  
cat /sys/block/$disk/queue/scheduler
  
for type in noop deadline cfq; do
        echo $type > /sys/block/$disk/queue/scheduler
        cat /sys/block/$disk/queue/scheduler
        sync && /sbin/hdparm -tT /dev/$disk && echo "----"
        sleep 5
done
exit 0

Использовать как

bash iosheduler.sh sda
Документация по теме 

Файловые дескрипторы

Теория 

Каждое приложение, читая файл или записываю информацию, используется файловый дескриптор. В системе установлено ограничение на количество открытых файловых дескрипторов для процесса (чтобы не было утечек). 

По умолчанию установлено значение 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 добавить следующие строки (/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 нужно добавить строку (/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
Документация по теме