Aapache перестает обрабатывать запросы.
Добрый день. Есть проблема с Apache.
Apache в какой-то момент перестает обрабатывать запросы. HTTP запрос ему отправлен,а ответа нет.
Server version: Apache/2.2.19 (Unix)
Architecture: 64-bit
Server MPM: Prefork
threaded: no
forked: yes (variable process count)
При старте apache создается родительский процесс и несколько дочерних. Когда поступает новый запрос,то он перенаправляетя одному из дочерних процессов на обработку.
Я наблюдаю с помощью strace за родтельским процессом и дочерним. Обычно это выглядит так.
Родительский процесс
strace -vp <master_pid>
wait4(-1, 0x7fff23b7b84c, WNOHANG|WSTOPPED, NULL) = 0
select(0, NULL, NULL, NULL, {1, 0}) = 0 (Timeout)
wait4(-1, 0x7fff23b7b84c, WNOHANG|WSTOPPED, NULL) = 0
select(0, NULL, NULL, NULL, {1, 0}) = 0 (Timeout)
...
и т.д.
Дочерний процесс
strace -vp <child_pid>
#Ожидание запроса
futex(0x7f32d3ae3000, FUTEX_WAIT, 0, NULL
#Поступление запроса,обработка
epoll_wait(7, {{EPOLLIN, {u32=12209800, u64=12209800}}}, 2, 10000) = 1
accept(4, {sa_family=AF_INET, sin_port=htons(35696), sin_addr=inet_addr("127.0.0.1")}, [16]) = 11
futex(0x7faf46972000, FUTEX_WAKE, 1) = 1
fcntl(11, F_GETFL) = 0x2 (flags O_RDWR)
fcntl(11, F_SETFL, O_RDWR|O_NONBLOCK) = 0
read(11, "GET /phpinfo.php?=PHPE9568F34-D42"..., 8000) = 566
stat("/var/www/site.com/public_html/phpinfo.php", {st_dev=makedev(147, 0), st_ino=5816332, st_mode=S_IFREG|0600, st_nlink=1, st_uid=1000, st_gid=600, st_blksize=4096, st_blocks=8, st_size=18, st_atime=2013/03/06-18:53:58, st_mtime=2009/09/22-17:57:22, st_ctime=2010/12/20-16:30:00}) = 0
open("/var/www/site.com/public_html/.htaccess", O_RDONLY) = 12
fstat(12, {st_dev=makedev(147, 0), st_ino=5823385, st_mode=S_IFREG|0600, st_nlink=1, st_uid=1000, st_gid=600, st_blksize=4096, st_blocks=8, st_size=153, st_atime=2013/03/06-18:53:58, st_mtime=2010/12/23-18:20:37, st_ctime=2010/12/23-18:26:05}) = 0
read(12, "php_value mbstring.func_overload "..., 4096) = 153
read(12, ""..., 4096) = 0
close(12) = 0
open("/var/www/site.com/public_html/phpinfo.php/.htaccess", O_RDONLY) = -1 ENOTDIR (Not a directory)
rt_sigaction(SIGCHLD, {0x7faf44833820, [CHLD], SA_RESTORER|SA_RESTART, 0x7faf451ff1e0}, {0x7faf44833820, [CHLD], SA_RESTORER|SA_RESTART, 0x7faf451ff1e0}, 8) = 0
setitimer(ITIMER_PROF, {it_interval={0, 0}, it_value={900, 0}}, NULL) = 0
rt_sigaction(SIGPROF, {0x7faf44879130, [PROF], SA_RESTORER|SA_RESTART, 0x7faf451ff1e0}, {0x7faf44879130, [PROF], SA_RESTORER|SA_RESTART, 0x7faf451ff1e0}, 8) = 0
rt_sigprocmask(SIG_UNBLOCK, [PROF], NULL, 8) = 0
setitimer(ITIMER_PROF, {it_interval={0, 0}, it_value={0, 0}}, NULL) = 0
writev(11, [{"HTTP/1.1 200 OK\r\nDate: Thu, 07 Ma"..., 171}, {"GIF89ax\0C\0\346j\0\177\202\27097G(%*\314\315\342\241\244\313\323\325\347\262\264"..., 2524}], 2) = 2695
write(8, "site.com 98.34.52.44"..., 257) = 257
shutdown(11, 1 /* send */) = 0
poll([{fd=11, events=POLLIN}], 1, 2000) = 1 ([{fd=11, revents=POLLIN|POLLHUP}])
read(11, ""..., 512) = 0
close(11) = 0
read(5, 0x7fffb6fdbbab, 1) = -1 EAGAIN (Resource temporarily unavailable)
#Ожидание нового запроса
futex(0x7faf46972000, FUTEX_WAIT, 0, NULL
В один момент родительский процесс убивает дочерние процессы (по timout вроде) и создает новые.
select(0, NULL, NULL, NULL, {1, 0}) = ? ERESTARTNOHAND (To be restarted)
--- SIGCHLD (Child exited) @ 0 (0) ---
select(0, NULL, NULL, NULL, {0, 742953}) = 0 (Timeout)
wait4(-1, [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], WNOHANG|WSTOPPED, NULL) = 14481
wait4(-1, 0x7fffbe8854bc, WNOHANG|WSTOPPED, NULL) = 0
select(0, NULL, NULL, NULL, {1, 0}) = 0 (Timeout)
clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7fb1afeeda30) = 29584
С этого момента дочерние процессы все время висият в ожидании запроса.
futex(0x7f32d3ae3000, FUTEX_WAIT, 0, NULL
В родительском процессе я так понимаю постоянное ожидание завершения работы от дочерних процессов (wait4)
wait4(-1, 0x7fff23b7b84c, WNOHANG|WSTOPPED, NULL) = 0
select(0, NULL, NULL, NULL, {1, 0}) = 0 (Timeout)
wait4(-1, 0x7fff23b7b84c, WNOHANG|WSTOPPED, NULL) = 0
select(0, NULL, NULL, NULL, {1, 0}) = 0 (Timeout)
Для распределения запросов между дочерними процессами в Apache 2 используются мьютексы. Multi Processing Modules (MPM).
Подскажите пожалуйста куда копнуть,чтобы отследить что происходит с запросами и как узнать причну почему дочернему процессу не передается запрос?
Спасибо.