Несколько дней назад мой веб-сервер CentOS 6.2 с ISPconfig 3 вышел из строя до такой степени, что я не смог войти в систему через SSH или с помощью консоли. Консоль была заполнена сообщениями «недостаточно памяти, процесс убийства, жертвоприношение детей» или что-то в этом роде. Запрос на вход через SSH появился через минуту ожидания, запрос пароля через минуту или две и так далее. Система явно была сильно перегружена. Мне не удалось перезапустить его чисто, поэтому я жестко сбросил его. Я думал, что это какой-то единичный сбой, но та же ситуация повторилась несколько часов назад. Это производственный сервер, и я не мог позволить себе экспериментировать, поэтому я просто увеличил оперативную память (это виртуальная машина Hyper-V) с 1 ГБ до 2 ГБ и перезапустил ее еще раз. Теперь он работает нормально два дня или что-то в этом роде. На следующий день такая же ситуация повторилась с другой аналогичной машиной, CentOS 6.3. Я просто перезапустил его, не увеличивая ОЗУ, и теперь он работает нормально.
Я не уверен, что это такое, почему это произошло и как этого избежать. Мне кажется, что было выделено слишком много оперативной памяти, поэтому система начала загружать и выгружать все страницы, из-за чего производительность упала до такой степени, что машина практически остановилась. Это sar
лог со второй машины:
12:03:14 AM CPU %user %nice %system %iowait %steal %idle
06:40:52 AM all 0.10 0.00 1.59 98.31 0.00 0.00
07:37:29 AM all 0.09 0.00 1.37 98.54 0.00 0.00
09:51:37 AM all 0.07 0.00 1.34 98.59 0.00 0.00
11:01:13 AM all 0.05 0.00 1.35 98.61 0.00 0.00
12:57:39 PM all 0.09 0.00 1.60 98.31 0.00 0.00
Неужели это была какая-то DOS-атака? Обе машины имеют последовательные IP-адреса, так что, может быть, это что-то, что принимает адреса один за другим? Указывает ли это на слабость в настройке безопасности? Есть ли способ более точно сказать, что произошло и почему?
Самым большим сюрпризом было то, что я вообще не смог войти в систему и управлять системой. Должен ли Linux это делать? Или это значит, что у меня какая-то неправильная конфигурация? Должен ли я иметь какие-то настройки, чтобы запретить любому процессу потреблять слишком много памяти? Это может случиться, или это означает, что я испортил установку?
РЕДАКТИРОВАТЬ - дополнительная информация о настройке:
На обеих машинах установлено следующее: ISPConfig 3, Apache, MySQL, PHP, Postfix, Courier, PureFTPd, Bind (установка ISPConfig по умолчанию в CentOS). Они действуют как веб-серверы с довольно низкой нагрузкой - вторая машина, с которой является отрывок из sar, обслужила 8000 файлов в день, когда это произошло.
В sar
log - это отрывок за период, в котором возникла проблема. Сразу после перезагрузки он вернулся к нормальной работе, которая выглядит следующим образом (текущий sar
журнал, iotop
показывает почти 0 чтений 0 записей сейчас):
07:20:01 AM CPU %user %nice %system %iowait %steal %idle
07:30:01 AM all 1.15 0.00 0.27 0.38 0.00 98.20
07:40:01 AM all 0.96 0.00 0.23 0.24 0.00 98.57
07:50:01 AM all 1.71 0.00 0.37 1.86 0.00 96.07
Согласно журналам Apache, необычной нагрузки или количества исключительных запросов не было. В журнале ошибок я обнаружил вот такую необычную строчку:
[Tue Feb 19 05:39:30 2013] [error] server reached MaxClients setting, consider raising the MaxClients setting
Кажется, это корень проблемы, не так ли?
Хорошо, больше никаких намеков или ответов, поэтому вопрос, вероятно, недостаточно конкретный. Я, наверное, приму «перегрузку веб-сервера» в качестве заключения. Однако я до сих пор не знаю, почему это произошло и может ли это быть какая-то DOS-атака. Возможно, это особенность Apache в том, что у него заканчивается разрешенное количество MaxClients, когда он работает слишком долго? Тем не менее, решение «перезагрузить сервер, увеличить оперативную память» - это, вероятно, то, с чем я могу жить (или, по крайней мере, мне придется).