Вопрос или проблема
Мой сервер иногда заполняется соединениями в Apache, застревающими в состоянии “Sending Reply”, из-за чего мне приходится перезапускать Apache. Обычно это работает, но иногда я получаю эту ошибку при попытке перезапустить Apache:
Job for httpd.service failed because the control process exited with
error code. See "systemctl status httpd.service" and "journalctl -xe"
for details.
Запуск systemctl status httpd.service
или journalctl -xe
, как рекомендуется, возвращает следующую соответствующую информацию:
Nov 15 06:24:06 hostname.biologyreporter.com systemd-logind[874]:
Failed to remove runtime directory /run/user/1067: Device or resource busy
Nov 15 06:24:27 hostname.biologyreporter.com restartsrv_httpd[29484]:
[Fri Nov 15 06:24:27.255594 2019] [core:emerg] [pid 29509:tid 47498001208384]
(28) No space left on device: AH00023: Couldn't create the mpm-accept mutex
Nov 15 06:24:27 hostname.biologyreporter.com restartsrv_httpd[29484]:
(28) No space left on device: could not create accept mutex
Nov 15 06:24:27 hostname.biologyreporter.com restartsrv_httpd[29484]:
AH00015: Unable to open logs
Nov 15 06:24:27 hostname.biologyreporter.com systemd[1]:
httpd.service: control process exited, code=exited status=1
Nov 15 06:24:27 hostname.biologyreporter.com systemd[1]:
Failed to start Apache web server managed by cPanel EasyApache.
-- Subject: Unit httpd.service has failed
Апачу может потребоваться около 10 минут для перезапуска и восстановления работы сайта. Я не понимаю, почему говорится “No space left on device”, так как выполнение df
, например, возвращает следующее (нигде 100% пространства не занято):
Filesystem 1K-blocks Used Available Use% Mounted on
devtmpfs 3973024 0 3973024 0% /dev
tmpfs 3983400 0 3983400 0% /dev/shm
tmpfs 3983400 255296 3728104 7% /run
tmpfs 3983400 0 3983400 0% /sys/fs/cgroup
/dev/sda2 952008348 137586024 766039760 16% /
/dev/sda1 999320 134892 795616 15% /boot
/dev/loop0 3997376 8856 3778808 1% /tmp
tmpfs 796684 0 796684 0% /run/user/0
tmpfs 796684 0 796684 0% /run/user/1022
Мне не удалось найти надежную информацию о причине и решении указанных выше ошибок
No space left on device: AH00023: Couldn't create the mpm-accept mutex
иFailed to remove runtime directory /run/user/1067: Device or resource busy
Что мне делать, чтобы решить эту проблему, чтобы эти ошибки не возникали и Apache всегда перезапускался без проблем?
Скорее всего, это вызвано ограничением семафоров ОС и тем, что Apache не очищает за собой.
Подробнее об ограничениях семафоров см. https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/5/html/tuning_and_optimizing_red_hat_enterprise_linux_for_oracle_9i_and_10g_databases/sect-oracle_9i_and_10g_tuning_guide-setting_semaphores-setting_semaphore_parameters
Эти ошибки означают, что в системе недостаточно ресурсов для межпроцессного взаимодействия, таких как семафоры или сегменты общей памяти.
Попробуйте выполнить следующее, чтобы увидеть, достигнуто ли ограничение семафоров, и посмотрите результаты:
ipcs -s | wc -l
cat /proc/sys/kernel/msgmni
cat /proc/sys/kernel/sem
Выполните следующую команду через SSH или консоль и посмотрите, поможет ли это:
ipcs -s | awk -v user=apache '$3==user {system("ipcrm -s "$2)}'
ipcs -s
выводит список используемых в настоящее время семафоров.
awk -v user=apache
фильтрует только те, которые принадлежат пользователю apache, и следующая часть выполняет icprm -s "id"
для каждого из них, удаляя этот семафор.
Т.е. вся команда удаляет все семафоры, принадлежащие пользователю apache.
Хотя ответ от @dzup4uk, кажется, указывает на то, в чем проблема, для фактического решения проблемы необходимо убедиться, что семафоры очищаются.
Команда ipcs
покажет, в чем проблема, но для фактического решения проблемы потребуется очистка, которую можно сделать с помощью
ipcrm -a
Если ваш Apache работает под пользователем nobody, тогда вы должны запустить это с nobody следующим образом:
ipcs -s | awk -v user=nobody '$3==user {system("ipcrm -s "$2)}'
Решение для меня (для разблокировки всех семафоров):
for i in `ipcs -s | awk '{print $2}'`; do ipcrm sem $i; done
либо фильтрация по пользователю:
for i in `ipcs -s | grep apache | awk '{print $2}'`; do ipcrm sem $i; done
Ответ или решение
Ошибка "No space left on device: AH00023: Couldn’t create the mpm-accept mutex" при перезапуске Apache (httpd) может вызывать множество неудобств. Давайте разберем причины, примеры и практические решения этой проблемы.
Теория
Ошибка "No space left on device" возникает не из-за нехватки дискового пространства, как можно было бы предположить на первый взгляд, а вследствие исчерпания системных ресурсов, таких как семафоры. В контексте операционных систем Unix и Linux семафоры используются для управления доступом к общим ресурсам при многопоточных процессах. Apache использует семафоры для координации работы между процессами и потоками.
Ошибки, подобные "Couldn’t create the mpm-accept mutex," указывают на то, что системе не хватает ресурсов для создания нового мьютекса (механизма синхронизации). В данном случае, это вызвано именно тем, что система больше не может выделить новые семафоры Apache, чтобы обеспечить его работоспособность.
Пример
В приведенном вами логе мы видим несколько важных сообщений, которые помогают понять суть проблемы. Например, строка с "[core:emerg] [pid 29509:tid 47498001208384] (28) No space left on device: AH00023: Couldn’t create the mpm-accept mutex" указывает на то, что Apache не удается создать необходимый мьютекс из-за нехватки нискозависимых ресурсов, таких как семафоры.
Также важно учитывать ошибки вроде "Failed to remove runtime directory /run/user/1067: Device or resource busy", что может говорить о неудачах в освобождении системных ресурсов, что также влияет на работу Apache.
Применение
Теперь перейдем к решению проблемы. Наиболее вероятной причиной данной ошибки является перегруженность системы семафорами. Это может происходить из-за некорректной очистки семафоров при завершении работы Apache, что со временем заполняет все доступные семафоры.
Шаги для исправления:
-
Проверка текущего состояния семафоров:
Чтобы выявить, не исчерпано ли количество семафоров, можно использовать команды:
ipcs -s | wc -l cat /proc/sys/kernel/msgmni cat /proc/sys/kernel/sem
Первая команда покажет количество используемых семафоров, а две последние — значения ограничений для семафоров в системе.
-
Очистка семафоров Apache:
Для ручной очистки используемых семафоров, можно выполнить следующую команду:
ipcs -s | awk -v user=apache '$3==user {system("ipcrm -s "$2)}'
Эта команда удалит все семафоры, принадлежащие пользователю Apache.
-
Автоматизация очистки:
Для автоматического и безопасного удаления всех семафоров, связанных с Apache, которая может быть запущена, например, через cron:
for i in `ipcs -s | grep apache | awk '{print $2}'`; do ipcrm sem $i; done
-
Настройка системы для предотвращения переполнения:
Убедитесь, что конфигурация Apache и системы настроена на корректное управление ресурсами. Возможно, потребуется увеличить лимиты семафоров, изменив параметры в
/etc/sysctl.conf
:kernel.sem = 250 32000 100 128
Эти значения могут варьироваться в зависимости от требований вашего сервера.
-
Обновление и мониторинг:
Убедитесь, что на сервере установлены все последние обновления для вашего дистрибутива Linux и Apache. Используйте инструменты мониторинга для отслеживания использования ресурсов, такие как Nagios, Zabbix, или Prometheus.
В заключение, исправление проблемы требует корректной настройки системных параметров, регулярного мониторинга и, возможно, переработки стратегии управления соединениями и обработчиками в Apache. Следуя предложенным шагам, вы сможете значительно сократить вероятность возникновения данных ошибок в будущем.