Господа, выручайте. Третий день не сплю, не ем - не могу никак найти причину странного (не побоюсь этого слова) поведения 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-листинги, да вообще всё что можно.
Надеюсь на вашу помощь и любые советы в диагностике. Я понимаю, что причина где-то есть - я просто не знаю как её найти. Мои методы иссякли.
Заранее премного благодарен.