У меня есть nginx + php-fpm и APC, установленные на сервере freebsd, и я испытываю постоянные проблемы с php-fpm, каким-то образом связанным с APC. php-fpm зависает в состоянии 'lockf' (в top
) и поэтому сайт не работает. я заметил это, опустив apc.shm_size
значение по умолчанию 30 помогает php-fpm не зависать, но 30 МБ мне недостаточно, потому что я храню много переменных в APC. я заметил это повышение apc.shm_size
на более высокие значения (например, 60) заставляет процессы php-fpm использовать намного больше памяти, практически всю физическую память сервера, что странно, потому что, как я понял, эти 60 МБ разделяются между всеми процессами php-fpm и не должны влиять на память использование каждого процесса php-fpm. я пытался изменить apc.shm_segments
значение больше 1 и при перезапуске php-fpm возникла ошибка:
PHP Startup: apc.shm_segments setting ignored in MMAP mode in <b>Unknown</b> on line <b>0</b><br />
Unknown(0) : Warning - PHP Startup: apc.shm_segments setting ignored in MMAP mode
Итак, скажите, пожалуйста, как эти параметры влияют на APC и почему php-fpm умирает при использовании большого количества разделяемой памяти? что означает MMAP mode
? Я думаю о переходе на xcache, работает ли он с php-fpm и достаточно ли стабилен для производства?
О mmap:
Настроить скрипт apc
имеет директиву:
--disable-apc-mmap
Disable mmap support and use IPC shm instead
Также существует 3 вида блокировки:
--enable-apc-sem
Enable semaphore locks instead of fcntl
--enable-apc-spinlocks
Enable spin locks EXPERIMENTAL
+ По умолчанию fcntl
. Можешь попробовать spinlocks
и посмотрим, что произойдет
PS. Это тоже должно быть полезно: http://www.php.net/manual/en/apc.setup.php
Если вы не увеличили значение sysctl kern.ipc.shmmax вам нужно это сделать. По умолчанию это 32 МБ, по крайней мере, в моей FreeBSD 8.0, а также во многих дистрибутивах Linux.
Пытаться sysctl -w kern.ipc.shmmax=134217728
увеличить значение до 128 мегабайт. Тогда попробуйте увеличить apc.shm_size опять будет больше 30 Мб.
Если это помогает, укажите желаемое значение kern.ipc.shmmax в /etc/sysctl.conf чтобы изменение сохранялось между перезагрузками.
Как ставили память?
apc.shm_size=64
или apc.shm_size=64M
, как и в руководство?
Последний решил мою аналогичную проблему.