FreeBsd 6.2, amd64. Запускаю php-4.4.8 + fpm-0.5.7 под nginx.
Через некоторое время работы с сайтом, он перестаёт отзываться, говоря
на все запросы "No input file specified" (код 404). Как я понял по
выводу ktrace, php не может открыть запрошенный файл:
91046 php-4.4.8-fpm CALL lstat(0x7fffffffbe50,0x7fffffffbd70)
91046 php-4.4.8-fpm NAMI "/www"
91046 php-4.4.8-fpm RET lstat 0
91046 php-4.4.8-fpm CALL lstat(0x7fffffffbe50,0x7fffffffbd70)
91046 php-4.4.8-fpm NAMI "/www/guest"
91046 php-4.4.8-fpm RET lstat 0
91046 php-4.4.8-fpm CALL lstat(0x7fffffffbe50,0x7fffffffbd70)
91046 php-4.4.8-fpm NAMI "/www/guest/
hiero.ru"
91046 php-4.4.8-fpm RET lstat 0
91046 php-4.4.8-fpm CALL lstat(0x7fffffffbe50,0x7fffffffbd70)
91046 php-4.4.8-fpm NAMI "/www/guest/
hiero.ru/htdocs"
91046 php-4.4.8-fpm RET lstat 0
91046 php-4.4.8-fpm CALL lstat(0x7fffffffbe50,0x7fffffffbd70)
91046 php-4.4.8-fpm NAMI "/www/guest/
hiero.ru/htdocs/
series_show_modes.php"
91046 php-4.4.8-fpm RET lstat 0
91046 php-4.4.8-fpm CALL sigprocmask(0x1,0,0x7099c8)
91046 php-4.4.8-fpm RET sigprocmask 0
91046 php-4.4.8-fpm CALL setitimer(0x2,0x7fffffffc530,0)
91046 php-4.4.8-fpm RET setitimer 0
91046 php-4.4.8-fpm CALL sigaction(0x1b,
0x7fffffffc4e0,0x7fffffffc4c0)
91046 php-4.4.8-fpm RET sigaction 0
91046 php-4.4.8-fpm CALL sigprocmask(0x2,0x7fffffffc520,0)
91046 php-4.4.8-fpm RET sigprocmask 0
91046 php-4.4.8-fpm CALL open(0x7dab98,0,0x1b6)
91046 php-4.4.8-fpm RET open -1 errno 24 Too many open files
Файлов открыто в самом деле много:
> fstat | grep php-4 | wc -l
3104
Причём это одни и те же файлы открыты множество раз (взял наугад inode
из списка, с остальными ситуация ровно такая же):
> fstat | grep php-4 | grep 1179615 | wc -l
72
Если рестартануть php, то с каждым релоадом страницы число открытых
файлов увеличивается где-то на сотню штук.
Рядом работает php-5.2.5 + fpm-0.5.4, он гораздо скромнее (хотя
реальная нагрузка на него куда выше):
> fstat | grep php-5 | wc -l
212
Кто виноват (похоже, что всё-таки php/fpm) и что делать?