Семафор — самый часто употребляемый метод для синхронизации потоков и для контролирования одновременного доступа множеством потоков/процессов к общей памяти.
Семафор — это объект IPC, управляющий доступом к общим ресурсам (устройствам). Семафоры не позволяют одному процессу захватить устройство до тех пор, пока с этим устройством работает другой процесс. Семафор может находиться в двух положениях: 0 (устройство занято) и 1 (устройство свободно).
Одиночный семафор используется редко, практически никогда. Для контроля доступа к ресурсам обычно используются множества семафоров, даже если это множество состоит всего из одного семафора. К примеру, допустим у нас есть три принтера. Когда мы посылаем задание на печать, диспетчер печати просматривает множество семафоров принтеров и выясняет, есть ли свободный принтер. Если да, то он начинает печатать наше задание, если же нет, диспетчер ставит задание в очередь печати.
Еще один пример использования семафоров — это счетчики ресурсов. Представим, что вместо принтера есть некий контроллер, позволяющий выполнять 100 заданий одновременно. Когда он свободен, значение семафора равно 100. По мере поступления заданий диспетчер контроллера уменьшает значение семафора на 1, а по мере их выполнения увеличивает на 1. Когда значение достигает 0, новое задание ставится в очередь до освобождения контроллера.
Оптимизируем работу ядра на серверах с большим размером ОЗУ в ситуациях повышенной сетевой и дисковой нагрузки.
В моем примере рассмотрен сервер с 128Gb ОЗУ и 10Gb подключением.
Шаг 1. Выполним команду ipcs -l
для отображения текущих параметров параметров ядра:
------ Messages Limits -------- |
Шаг 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 |
В первом разделе, 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 |
Для применения изменений выполните команду sysctl -p /etc/sysctl.d/01-kernel.conf
.
Используемый материал