Я ищу предложения о том, где мне следует копать глубже.
Вскоре сервер Apache2 перестает обслуживать запросы через 2-15 часов после запуска. В результате мне приходится делать это service apache2 restart
полдня.
Длинная версия:
- Я запускаю несколько веб-сайтов (Apache 2.2.22, построен 12 июля 2013 г.) на выделенном сервере (Ubuntu 13.04).
- Сервер Apache2 работал нормально более полугода, а теперь внезапно перестал обрабатывать запросы на всех сайтах (всего их около 5), пока процесс Apache не будет перезапущен.
- Мне не удалось найти никаких аномальных записей в журналах /var/log/apache, касающихся этой проблемы.
service apache2 status
сообщает, что процесс запущен
Буду рад услышать ваши предложения и узнать, что мне делать в моей ситуации.
ОБНОВЛЯТЬ:
Бег netstat -an | grep 80
:
tcp6 0 0 :::80 :::* LISTEN
tcp6 325 0 SERV_IP:80 IP_A:35514 CLOSE_WAIT
tcp6 332 0 SERV_IP:80 IP_B:34198 CLOSE_WAIT
tcp6 379 0 SERV_IP:80 IP_C:57859 CLOSE_WAIT
tcp6 0 0 SERV_IP:80 IP_A:35060 CLOSE_WAIT
tcp6 360 0 SERV_IP:80 IP_A:38481 CLOSE_WAIT
tcp6 466 0 SERV_IP:80 IP_B:56324 CLOSE_WAIT
tcp6 361 0 SERV_IP:80 IP_A:53466 CLOSE_WAIT
tcp6 1 0 SERV_IP:80 IP_A:38102 CLOSE_WAIT
tcp6 196 0 SERV_IP:80 IP_E:58125 ESTABLISHED
и еще больше подобных записей, около 150.
ps aux | grep apache
:
root 2968 0.0 0.0 452240 21116 ? Ss 16:08 0:01 /usr/sbin/apache2 -k start
www-data 5217 0.0 0.0 463584 23820 ? S 17:04 0:03 /usr/sbin/apache2 -k start
Последующих строк (www-data) около 120, поэтому я предполагаю, что это 120 процессов Apache?
Использование strafe
корневого процесса apache2:
sudo strace -f -p 2968
Process 2968 attached - interrupt to quit
select(0, NULL, NULL, NULL, {0, 264394}) = 0 (Timeout)
wait4(-1, 0x7fff6d157a6c, WNOHANG|WSTOPPED, NULL) = 0
select(0, NULL, NULL, NULL, {1, 0}) = 0 (Timeout)
wait4(-1, 0x7fff6d157a6c, WNOHANG|WSTOPPED, NULL) = 0
Использование одного из процессов www-data:
sudo strace -f -p 8554
Process 8554 attached - interrupt to quit
flock(40, LOCK_EX
Ого, мне кажется, что каким-то образом процессы Apache застревают, и как только максимальный лимит соединений превышен, он перестает создавать новые экземпляры. Но почему они застревают?
htop, iotop, jnettop не сообщают об аномалиях (перегрузки нет).
ОБНОВЛЕНИЕ 2: Сервер больше не падает в течение последних двух дней. Поэтому я не могу получить больше информации. Вместо этого я благодарен за вашу помощь и принимаю ответ. Как только будет больше информации, я оставлю ссылку на новый вопрос с более четким текстом. Спасибо
решение1
Независимо от того, что сообщает «service apache2 status», видите ли вы процессы Apache, когда выполняете команду ps aux?
Можете ли вы сделать netstat -n, когда возникает проблема? Возможно, у вас закончились ресурсы, например, дескрипторы файлов, или у вас слишком много открытых соединений.
Во время проблемы у вас высокая загрузка процессора? Может быть, система исчерпывает память и тормозит?
HTTP-сервер отвечает отказом в соединении или просто истекает время ожидания соединения?
В последнем случае я бы предложил выполнить strace -f -p [apachepid] и вы, возможно, узнаете, какой системный вызов блокирует запрос. В первом случае, вероятно, apache рухнул.
Используете ли вы прокси-сервер Tomcat или другой сервер приложений или обслуживаете простой статический HTML?
Вы настроили аутентификацию? Например, может быть, что-то пошло не так на уровне аутентификации.
ОБНОВЛЯТЬ:
Во второй трассе я вижу это flock(40,LOCK_EX Возможно, процессы пытаются получить где-то исключительную блокировку? Вы можете выполнить lsof -n -p 8554 (или любой другой pid, который пытается flock) и посмотреть, какой файл он пытается заблокировать (40 — это дескриптор файла). Вы также можете выполнить "ls /proc/8554/fd"