Семафоры Linux — средство ОС для синхронизации потоков и процессов. На практике сталкиваться с этим понятием приходится, например, когда отказывается запускаться Apache
Семафоры Linux и что делать если они заканчиваются
О том, что закончились семафоры могут говорить такие записи в логах веб-сервера:
[Fri Jan 26 12:34:31.540156 2019] [core:emerg] pid 25695No space left on device: AH00023: Couldn't create the ssl-cache mutex
AH00016: Configuration Failed
No space left on device
Свободное место на диске при этом есть, по inode также есть запас. Apache при этом перестает работать и не запускается, а если запускается, то работает нестабильно.
Сколько семафоров используется можно посмотреть выполнив
ipcs -s | wc -l1089
Можно просмотреть содержимое файла /proc/sys/kernel/sem и сравнить его с текущим значением в системе.
Пример вывода в консоли нагруженного веб-сервера на скриншоте:
Что делать если достигнут лимит по семафорам в Linux
Значение можно увеличить, например до 10240
echo "250 256000 32 10240" > /proc/sys/kernel/sem
После завершения процесса (например, веб-сервера) семафоры могут продолжать существовать в открытом состоянии.
Семафоры можно почистить — например, для пользователя www-data, из-под него обычно запускаются процессы веб-сервера. Предварительно нужно завершить процессы пользователя, в случае с веб-сервером — выключить веб-сервер.
В цикле for:
for i in $(ipcs -s | grep 'www-data' | awk '{print $2}'); do ipcrm -s "$i"; done
Разово только для определенного пользователя (www-data):
ipcs -s | grep www-data | awk '{ print $2 }' | xargs -n1 ipcrm sem
Или можно добавить параметры в /etc/sysctl.conf
kernel.msgmni = 512 kernel.sem = 250 128000 32 10240
Если меняется /etc/sysctl.conf, то нужно перезагрузить машину или выполнить
sysctl -p
Читайте также про файловые дескрипторы и принципы диагностики неполадок на уровне системы.
Подробную информацию про семафоры в Linux можно найти выполнив в консоли сервера man sem_overview.
man sem_overview
То же описание доступно по ссылке.