408 ошибок из Apache, "fork: не может выделить память" из dhclient и sshd

Последние три ночи подряд у меня запускается сервер EC2, выдающий 408 ошибок в ответ на веб-запросы. Когда я прихожу утром, я не могу войти; Я должен перезагрузиться с помощью консоли управления. И dhclient, и sshd выдают сообщения об ошибках, в которых говорится: "fork: Cannot распределить память".

Насколько я могу судить, это происходит только с одним сервером. Детали немного отличались каждый раз:

В первую ночь это произошло примерно в 19:30 (согласно /var/log/messages), но все еще было сообщение "привязано к". Затем примерно с 20:00 до 20:30 происходит множество DHCPREQUEST, и после этого не происходит успешной привязки. Ошибки sshd начинаются примерно в 21:10 (согласно /var/log/secure).

Вторую ночь мы видим строки DHCPREQUEST с 18:45 до 19:15, и после этого начинается ошибка разветвления. Ошибки sshd начинаются в 18:20.

На этом этапе я обновил dhclient через yum, чтобы посмотреть, поможет ли это. (Я не видел ошибок sshd на данный момент.) Это не так.

Третья ночь выглядит как первая, с ошибкой разветвления в 18:30 и DHCPREQUEST с 19:00 до 19:30. Но затем в 4:15 утра приходит убийца OOM и убивает процесс httpd. Убийца ООМ не появился первые две ночи. Ошибки sshd начинаются в 19:30, и в 4:15 возникает много ошибок "Получено отключение".

Эта ветка на форумах разработчиков AWS предполагает, что dhclient может иметь утечку памяти в переменной окружения, но я не вижу этого, если так. Это также не является медленной утечкой: это происходило раньше каждую ночь, но я перезагружал сервер в 17:00 после обновления dhclient, так что в третий раз он работал менее двух часов.

Я рассмотрел утечку памяти из Apache, но, похоже, она не совпадает с чем-то конкретным в журналах Apache, и я не смог вызвать ее, отправив несколько одновременных запросов памяти на сервер. И в этом случае я ожидаю, что убийца ООМ был вовлечен все три ночи.

В логах apache есть одна примечательная вещь: метки времени на трех последовательных строках: 24/ фев /2017:02:10:05, 23/ фев /2017:18:23:05, 24/ фев /2017:07:03:20. Вторым из этих запросов был 500, а не 408. Так что я думаю, что запрос каким-то образом выполнялся в течение восьми или более часов, и это, возможно, потребляло память. Там нет ничего подобного первые две ночи.

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

Обновить

С тех пор у меня это сработало после установки простого монитора ps/cron, как предложил пользователь ochach. Кажется, у меня действительно кончилась память, и виновником был httpd; Я не знаю, почему убийца ООМ не бежал.

1 ответ

Решение

Установите инструменты мониторинга и проверьте, какой процесс требует памяти. Оттуда вы можете попытаться изолировать проблему, когда узнаете, какой процесс получил утечку памяти. Также проверьте dmesg на наличие убитых ядом, которые сделал ядро.

Чтобы точно определить проблему, вы можете добавить "ps aux --sort -rss | head -n 10", чтобы запускать каждую минуту и ​​добавлять в файл на неферическом устройстве.

Кроме того, вы можете установить отдельный мониторинг, например, nagios, prometeus или использовать sar/sysstat.

Другие вопросы по тегам