Есть хост с обычной серверной Ubuntu 14.04 LTS без хитростей.
Есть в ней уйма Docker и LXC-контейнеров.
Сервер без нареканий пахал 3.5 года.
Недавно (две недели назад) начались проблемы. Симптомы:
— В LXC-контейнерах (сразу всех) виснет php5-fpm. Виснет так, что ни перезапустить, ни даже убить. Процессы даже в зомби не превращаются. Просто попытки их убивать ни к чему не приводят. Попытка перезапустить сервис приводит к завису процесса перезапуска. Попытка остановить или убить LXC-контейнер приводит к завису lxc-stop/lxc-kill.
— Всё остальное работает нормально: — И nginx внутри LXC отдаёт данные корректно (кроме того, что обращение php выдаёт 502-ю ошибку). — И Docker-контейнеры работают (в т.ч. с PHP) и перезапускаются штатно. — И хост весь рабочий. — Диски в отличном состоянии, в dmesg пусто. — Загрузка системы после зависа нагруженных тяжёлых LXC-контейнеров падает практически до нуля. CPU — почти 100% idle, дисковая активность — тоже.
Поскольку никакие средства lxc не оживляют, сервер приходится перезапускать. Перезапуск проходит штатно, после перезапуска всё работает.
Ещё два замечания:
У меня висят cron-процессы с традицонной много-много лет назад добавленной защитой от повторного запуска, если старый не отработал до конца. Это ещё в нулевых, когда cron-скрипты минутные за минуту иногда не успевали отработать. Код проверки такой:
if [ ! -z "`ps -C \`basename $0\` --no-headers -o "pid,ppid,sid,comm"|grep -v "$$ "|grep -v "<defunct>"`" ]; then
echo script is already running . abort
exit 0
fi
Так вот, где-то с месяц назад (точно не помню) cron-скрипыт иногда стали «зависать». Скрипт всё сделал, но процесс висит (кажется, уже не помню точные симптомы). Новый скрипт поэтому не запускается. Я пожал плечами и убрал эту проверку. Всё стало работать нормально. Машина к тому времени была 160 дней без рестарта, подумал, мало ли какие-то проблемы стали в ядре накапливаться и забил. Теперь думаю, не связано ли оно как-то вместе...
После этих зависов и рестартов трижды были проблемы madm-raid. Первый раз я в попытках понять, почему висят php-процессы в контейнере доигрался до того, что сервер не перезапускался. Пришлось его удалённо ресетить. Через какое-то время после перезапуска (специально не контролировал) обнаружил, что вся активность идёт на одном из hdd, второй — стоит. Беглый просмотр показал, что зеркало развалилось и работает только один том. С какой точно формулировкой проблемы была не помню. Удалил отвалившийся том, добавил снова — всё завелось штатно и без проблем. Конечно, тщательно изучил smartctl и т.п. — всё было ок. Т.е., скорее всего, проблема была где-то в жёстком перезапуске.
Добавил мониторинг mdam в munin.
После второго рестарта, уже мягкого, всё было ок пару дней. Потом — munin выдал alert. Смотрю — зеркало развалилось. На этот раз без ошибок, просто hdd оказался исключённым o_O Включил в зеркало, сразу подхватился, засинхронизировался, всё стало ок.
После третьего рестарта, не сразу, а где-то через пол-дня, munin опять сигнализирует. На этот раз «жёлтеньким», типа, предупреждением. Смотрю — raid в процессе восстановления снова. Но на этот раз сам. Конечно, тренд позитивный, с полного развала к лёгкой починке и потом к самовосстановлению, но какого фига? Я бы понял, если бы проблема лезла сразу после рестарта. Но она не синхронна с зависами/перезапусками...
Сегодня был 4-й завис. Опять всё чисто, никаких проблем. Специально тщательно потыркал палочкой Docker-контейнеры, работают как часы. А вот в LXC — опять мёртвые php-fpm. И опять пришлось перезапускать...
Есть мысли, что это может быть? :) И как с этим бороться, кроме навешивания watchdog (благо, сервер рестартует нормально и хост остаётся работоспособен).