LINUX.ORG.RU
ФорумAdmin

Периодически засыпающий Apache 2.4

 , , , ,


0

2

Господа, выручайте. Третий день не сплю, не ем - не могу никак найти причину странного (не побоюсь этого слова) поведения Apache. Началось всё довольно стандартно: необходимо было перенести среднего размера сайт на пару новых виртуалок под Xen'ом (два узла, нагрузка распределяется Netscaler'ом, база на третьей). В качестве ОСы используется не сильно любимая мною Ubuntu 14.04 (я больше по RHEL'ам уношусь), но и с ней я до этого находил язык. Что касаемо веб-серверов, то и здесь всё довольно привычно - nginx в качестве фронтенда, apache 2.4 - бэкенда, PHP 5.5.9 как mod_php у апача (ну и prefork, соответственно).

Для начала - о среде «песочницы». Код сайта лежит на shared-разделе, форматированном в ocfs2 со следующими параметрами (это может быть важно): mkfs.ocfs2 /dev/sdb1 -N 2 -b 4K -C 4K -T mail --fs-features=discontig-bg --fs-feature-level=max-features

В качестве фреймворка сайта используется Yii. Для кеша используется memcached, а также встроенный в PHP OpCache. Среди модулей PHP нет каких-либо необычных, собранных из сорцов или установленных через pear.

Конфиг апача (более чем стандартный, но все приведенные ниже параметры я пробовал менять):

<IfModule mpm_prefork_module>
        StartServers                     1
        MinSpareServers           1
        MaxSpareServers          2
        MaxRequestWorkers         10
        MaxConnectionsPerChild   0
</IfModule>
<VirtualHost *:8080>
    RPAFenable On
    RPAFsethostname On
    RPAFproxy_ips 127.0.0.1
    RPAFheader X-Real-IP
    ServerName site.com
    ServerAlias www.site.com
    CustomLog /var/log/apache2/access.log combined
    ErrorLog /var/log/apache2/error.log
    AddType application/x-httpd-php .php .php3 .php4 .php5 .phtml
    AddType application/x-httpd-php-source .phps
    DocumentRoot /srv/www/site
    <Directory "/srv/www/site">
        Options -Indexes +FollowSymLinks +Includes -MultiViews
        AllowOverride all
        Require all granted
    </Directory>
    DirectoryIndex /index.html /index.php /index.cgi
</VirtualHost>

Так вот. Проблема в том, что периодически Апач перестаёт отвечать на вопросы и просто чего-то ждёт. Ждёт секунд 30, может минуту, бывает - полторы, а потом всё начинает работает и отдаваться браузеру за 1-2 секунды (причём страницы есть достаточно тяжёлые).

Сначала я думал, что проблема в кэше и эта задержка как-то связана с медленной скоростью чтения с ocfs2-раздела (задержка очень часто проявлялась после рестарта Апача и мне казалось, что нужно какое-то время, чтобы контент закешировался, после чего уже будет отдаваться мгновенно). Но несколько раз после рестарта апача, задержек не было - значит, дело не в кеше. Разумеется я пробовал отключать и Memcached, и OpCache, и даже ставил apcu - всегда результат был одинаковым.

Было предположение, что виной всему база (чаще всего проблемы в ней). Так нет же! Я проверял одновременно на двух, идентично настроенных узлах и один может работать и отдавать контент, в то время как на втором в этот же самый момент апач чего-то ждёт. Значит, дело не в базе.

Думаю, так может дело в PHP - тоже нет. В момент ожидания чего-то апачем, простые файлы вроде test.php с phpinfo(); или html в той же директории сайта отдаются мгновенно. Получается, апач ждёт чего-то именно от приложения, но как понять чего?

Прибегнул к помощи любимого strace: strace -o trace.txt -f -s4096 -r -t -p 21319 (в качестве pid'а взят, разумеется, мастер-процесс). Но ничего познавательного в моменты ожиданий я так и не нашёл.

21319      0.000000 select(0, NULL, NULL, NULL, {0, 854712}) = 0 (Timeout)
21319      0.855951 wait4(-1, 0x7ffff35f8f64, WNOHANG|WSTOPPED, NULL) = 0
21319      0.000104 select(0, NULL, NULL, NULL, {1, 0}) = 0 (Timeout)
21319      1.001253 wait4(-1, 0x7ffff35f8f64, WNOHANG|WSTOPPED, NULL) = 0
21319      0.000082 select(0, NULL, NULL, NULL, {1, 0}) = 0 (Timeout)
21319      1.001259 wait4(-1, 0x7ffff35f8f64, WNOHANG|WSTOPPED, NULL) = 0
21319      0.000084 select(0, NULL, NULL, NULL, {1, 0}) = 0 (Timeout)
21319      1.001249 wait4(-1, 0x7ffff35f8f64, WNOHANG|WSTOPPED, NULL) = 0
21319      0.000082 select(0, NULL, NULL, NULL, {1, 0}) = 0 (Timeout)
21319      1.001267 wait4(-1, 0x7ffff35f8f64, WNOHANG|WSTOPPED, NULL) = 0
21319      0.000082 select(0, NULL, NULL, NULL, {1, 0}) = 0 (Timeout)
21319      1.001265 wait4(-1, 0x7ffff35f8f64, WNOHANG|WSTOPPED, NULL) = 0
21319      0.000085 select(0, NULL, NULL, NULL, {1, 0}) = 0 (Timeout)
21319      1.001258 wait4(-1, 0x7ffff35f8f64, WNOHANG|WSTOPPED, NULL) = 0
21319      0.000082 select(0, NULL, NULL, NULL, {1, 0}) = 0 (Timeout)
21319      1.001263 wait4(-1, 0x7ffff35f8f64, WNOHANG|WSTOPPED, NULL) = 0
21319      0.000084 select(0, NULL, NULL, NULL, {1, 0}) = 0 (Timeout)
21319      1.001272 wait4(-1, 0x7ffff35f8f64, WNOHANG|WSTOPPED, NULL) = 0
21319      0.000088 select(0, NULL, NULL, NULL, {1, 0}) = 0 (Timeout)
21319      1.001322 wait4(-1, 0x7ffff35f8f64, WNOHANG|WSTOPPED, NULL) = 0
21319      0.000086 select(0, NULL, NULL, NULL, {1, 0}) = 0 (Timeout)
21319      1.001897 wait4(-1, 0x7ffff35f8f64, WNOHANG|WSTOPPED, NULL) = 0
21319      0.000099 select(0, NULL, NULL, NULL, {1, 0}) = 0 (Timeout)
21319      1.001250 wait4(-1, 0x7ffff35f8f64, WNOHANG|WSTOPPED, NULL) = 0
21319      0.000082 select(0, NULL, NULL, NULL, {1, 0}) = 0 (Timeout)
21319      1.001261 wait4(-1, 0x7ffff35f8f64, WNOHANG|WSTOPPED, NULL) = 0
21319      0.000084 select(0, NULL, NULL, NULL, {1, 0}) = 0 (Timeout)
21319      1.001259 wait4(-1, 0x7ffff35f8f64, WNOHANG|WSTOPPED, NULL) = 0
21319      0.000085 select(0, NULL, NULL, NULL, {1, 0}) = 0 (Timeout)
21319      1.001269 wait4(-1, 0x7ffff35f8f64, WNOHANG|WSTOPPED, NULL) = 0
21319      0.000083 select(0, NULL, NULL, NULL, {1, 0}) = 0 (Timeout)

Просто, спустя какое-то время, когда Апач перестаёт ждать, в strace уже можно видеть, как читаются htaccess'ы, другие файлы и всё работает якобы нормально. В логах, разумеется, пусто - никаких ошибок или даже ворнингов. lsof каких-то необычных файлов не показывает - ну да, модули всякие, да логи. Глазу зацепиться не за что. Думал, может проблема в htaccess'е - у него много правил для ресайза изображений на лету, но тогда почему всё это периодически возникает, а не постоянно.

Честное слово: я проделывал всё это (перенос/ установку/ настройку) множество раз и никогда подобных проблем не возникало.

Я правда в тупике и уже не знаю в какую сторону ковырять. Перегуглил всё что можно, прочитал все эти суперчитабельные mail-листинги, да вообще всё что можно.

Надеюсь на вашу помощь и любые советы в диагностике. Я понимаю, что причина где-то есть - я просто не знаю как её найти. Мои методы иссякли.

Заранее премного благодарен.


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

goingUp ★★★★★
()
Ответ на: комментарий от goingUp

Да я собственно и не спорю. Я и сам вижу, что апач чего-то ждёт. Я просто хочу понять чего и ликвидировать эту причину.

Если это PHP, то как понять почему, зачем и где он блокирует сессию? А также почему это происходит не постоянно, а периодически.

Korben
() автор топика
Ответ на: комментарий от Korben

почему, зачем и где он блокирует сессию?

Ты открываешь страницу, стартуется сессия. Пока не закончится генерация страницы, сессия заблокирована. Это чтобы параллельно выполняющиеся скрипты не перезаписывали сессию неправильно.

goingUp ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.