Subscribe on YouTube

Модификация параметров ядра Linux (семафоры)

Семафор — самый часто употребляемый метод для синхронизации потоков и для контролирования одновременного доступа множеством потоков/процессов к общей памяти.

Семафор — это объект IPC, управляющий доступом к общим ресурсам (устройствам). Семафоры не позволяют одному процессу захватить устройство до тех пор, пока с этим устройством работает другой процесс. Семафор может находиться в двух положениях: 0 (устройство занято) и 1 (устройство свободно).

Одиночный семафор используется редко, практически никогда. Для контроля доступа к ресурсам обычно используются множества семафоров, даже если это множество состоит всего из одного семафора. К примеру, допустим у нас есть три принтера. Когда мы посылаем задание на печать, диспетчер печати просматривает множество семафоров принтеров и выясняет, есть ли свободный принтер. Если да, то он начинает печатать наше задание, если же нет, диспетчер ставит задание в очередь печати.

Еще один пример использования семафоров — это счетчики ресурсов. Представим, что вместо принтера есть некий контроллер, позволяющий выполнять 100 заданий одновременно. Когда он свободен, значение семафора равно 100. По мере поступления заданий диспетчер контроллера уменьшает значение семафора на 1, а по мере их выполнения увеличивает на 1. Когда значение достигает 0, новое задание ставится в очередь до освобождения контроллера.

Оптимизируем работу ядра на серверах с большим размером ОЗУ в ситуациях повышенной сетевой и дисковой нагрузки.

В моем примере рассмотрен сервер с 128Gb ОЗУ и 10Gb подключением.

Шаг 1. Выполним команду ipcs -l для отображения текущих параметров параметров ядра:

------ Messages Limits --------
max queues system wide = 32768
max size of message (bytes) = 8192
default max size of queue (bytes) = 16384
------ Shared Memory Limits --------
max number of segments = 4096
max seg size (kbytes) = 18014398509465599
max total shared memory (kbytes) = 18014398442373116
min seg size (bytes) = 1
------ Semaphore Limits --------
max number of arrays = 128
max semaphores per array = 250
max semaphores system wide = 32000
max ops per semop call = 32
semaphore max value = 32767

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

IPC kernel parameter Enforced minimum setting
kernel.shmmni (SHMMNI) 256 * (size of RAM in GB)
kernel.shmmax (SHMMAX) (size of RAM in bytes)
kernel.shmall (SHMALL) 2 * (size of RAM in the default system page size)
kernel.sem (SEMMNI) 256 * (size of RAM in GB)
kernel.sem (SEMMSL) 250
kernel.sem (SEMMNS) 256 000
kernel.sem (SEMOPM) 32
kernel.msgmni (MSGMNI) 1 024 * (size of RAM in GB)
kernel.msgmax (MSGMAX) 65 536
kernel.msgmnb (MSGMNB) 65 536

SHMALL ограничивает общий объем виртуальной совместной памяти, которая может быть выделена системе. Каждый сервер данных эффективно управляет тем объемом системной памяти, который он использует; ее называют также переданная память (committed memory). Сервер данных выделяет больше виртуальной памяти, чем ему передано, чтобы поддерживать предварительное выделение памяти и динамическое управление памятью. Предварительное выделение памяти повышает производительность. Динамическое управление памятью - это процесс увеличения и сокращения действительного использования памяти в отдельных областях виртуальной памяти совместного использования. Для поддержки предварительного выделения памяти и динамического управления памятью серверам данных часто необходимо выделять в системе больший объем виртуальной памяти совместного использования, чем физический объем оперативной памяти. Но для ядра это значение задается как число страниц.

Производительность нагрузки может увеличиться в случае большего предельного размера очереди сообщений, который задается в байтах параметром MSGMNB. Использование памяти очередью сообщений можно просмотреть, введя команду ipcs -q. Если очереди сообщений уже достигли предельного размера или близки к нему при операциях загрузки, рассмотрите возможность увеличения предельного размера очереди сообщений.

$ ipcs -l
------ Messages Limits --------
max queues system wide = 131072 // MSGMNI
max size of message (bytes) = 65536 // MSGMAX
default max size of queue (bytes) = 65536 // MSGMNB
------ Shared Memory Limits --------
max number of segments = 32768 // SHMMNI
max seg size (kbytes) = 134217728 // SHMMAX
max total shared memory (kbytes) = 524288 // SHMALL
min seg size (bytes) = 1
------ Semaphore Limits --------
max number of arrays = 32768 // SEMMNI
max semaphores per array = 250 // SEMMSL
max semaphores system wide = 8192000 // SEMMNS
max ops per semop call = 100 // SEMOPM
semaphore max value = 32767

В первом разделе, Shared Memory Limits (Предельные значения для совместно используемой памяти), предельное значение SHMMAX - это максимальный размер сегмента совместно используемой памяти в системе Linux. Предельное значение SHMALL - это максимальное выделение страниц совместно используемой памяти в системе.

Рекомендуется задать для SHMMAX значение, численно равное объему физической памяти в системе. Однако минимально необходимое в системах x86 значение равно 268435456 (256 Мбайт), а в 64-битных системах - 1073741824 (1 Гбайт).

Следующий раздел описывает количество семафоров, доступных для операционной системы. Параметр ядра sem состоит из четырех элементов: SEMMSL, SEMMNS, SEMOPM и SEMMNI. Значение SEMMNS равно произведению SEMMSL на SEMMNI. Для менеджера данных требуется соответственным образом увеличить число массивов (SEMMNI). Обычно значение SEMMNI должно быть вдвое больше максимального разрешенного числа ожидаемых в системе агентов, умноженного на число логических разделов на компьютере сервера данных плюс число соединений локальных программ с компьютером сервера данных.

Параметр MSGMNI влияет на число агентов, которые можно запустить.
Параметр MSGMAX влияет на размер сообщения, которое можно поместить в очередь, а параметр MSGMNB влияет на размер очереди.
Для параметра MSGMAX нужно задать значение 64 Кбайта (то есть 65536 байт), а значение MSGMNB нужно увеличить до 65536.

Измените параметры ядра, которые требуется изменить, отредактировав файл /etc/sysctl.d/01-kernel.conf. Если этот файл не существует, создайте его.

Ниже показаны примеры строк, которые нужно поместить в этот файл:

kernel.shmmni = 32768
kernel.shmmax = 137438953472
kernel.shmall = 131072
#kernel.sem=<SEMMSL> <SEMMNS> <SEMOPM> <SEMMNI>
kernel.sem = 250 8192000 100 32768
kernel.msgmni = 131072
kernel.msgmax = 65536
kernel.msgmnb = 65536

Для применения изменений выполните команду sysctl -p /etc/sysctl.d/01-kernel.conf.
Используемый материал

Поделиться Комментарии