我在 freebsd 服务器上安装了 nginx+php-fpm 和 APC,并且在 php-fpm 与 APC 以某种方式连接时不断遇到问题。php-fpm 在“lockf”状态(在top
)下冻结,因此站点无法正常工作。我注意到,将apc.shm_size
其降低到默认值 30 可以帮助 php-fpm 不冻结,但是 30Mb 对我来说不够,因为我在 APC 中存储了很多变量。我注意到,将其提升apc.shm_size
到更高的值(如 60)会使 php-fpm 进程使用更多的内存,实际上是所有服务器物理内存,这很奇怪,因为据我所知,这 60Mb 是所有 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 并且足够稳定以用于生产?
答案1
关于 mmap:
配置apc
has指令的脚本:
--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
+Default fcntl
。你可以尝试spinlocks
看看会发生什么
答案2
如果你还没有增加 sysctl 值内核ipc.shmmax您需要这样做。默认情况下,它是 32 MB,至少在我的 FreeBSD 8.0 和许多 Linux 发行版中也是如此。
尝试sysctl -w kern.ipc.shmmax=134217728
将值增加到 128 兆字节。然后尝试增加大小再次超过 30 MB。
如果有帮助,请将您喜欢的 kern.ipc.shmmax 值设置为/etc/sysctl.conf使更改在重启后继续生效。