Назад | Перейти на главную страницу

Процессы Apache застряли в состоянии «запись»

Мой сервер apache производит множество процессов в состоянии «запись», пока все слоты не будут заполнены и весь веб-сервер не зависнет. Вот что у меня получилось:

root@viking:/# uname -a
Linux viking 2.6.32-51-server #113-Ubuntu SMP Wed Aug 21 20:01:09 UTC 2013 x86_64 GNU/Linux
root@viking:/# apache2 -V
Server version: Apache/2.2.14 (Ubuntu)

Вот стек зависшего процесса:

root@viking:/# cat /proc/14475/stack
[<ffffffff81158c39>] poll_schedule_timeout+0x39/0x60
[<ffffffff81158e93>] do_poll+0x233/0x2c0
[<ffffffff81159965>] do_sys_poll+0x155/0x210
[<ffffffff81159c1c>] sys_poll+0x7c/0x110
[<ffffffff81013172>] system_call_fastpath+0x16/0x1b
[<ffffffffffffffff>] 0xffffffffffffffff

Это жарко, оно появляется в server-status:

Srv PID Acc M   CPU     SS  Req Conn    Child   Slot    Client  VHost   Request
0-0 14472   0/1033/1033 W   8.65    965 0   0.0 8.43    8.43    178.129.218.193 ***.com GET /programs/ HTTP/1.0

Что может вызвать такое поведение?

Одна из частых причин такого поведения - злонамеренные клиенты. Они подключаются к вашему веб-серверу, запрашивают некоторые данные, а затем никогда не читают данные, которые им отправляет ваш сервер. Это съедает ваши слоты для подключения.

Оказалось, что это были повешены запросы curl к недоступному сервису. По какой-то причине curl никогда не выходит из строя и вечно ждет ответа.