问题:ubuntu lnmp 2.5G内存 双核心2.4G 日访问量在1万左右 开启40个phpfpm线程 内存占用2100M 那在php-fpm.conf中max_requests值如何定义呢?有没有什么标准的规范,我现在定义为10240.
max_children=40 , 每个children平均占用20M-30M内存,children越多,可以同时接受的并发数量越多,一般children的值是网站最高并发数+浮动值,这值再×内存占用,就是你需要用到的内存。
max_requests = N 是指当每个children接受了N次请求以后,就会把自己杀死,然后重新建立一个children。
PV / max_children = 每一个children接受的request次数
比如上面的值是1000,而你定义的是10240,那么fpm要超过10天才能杀死children并重建,这样如果存在内存泄露的话,就会导致进程占用过多的内存而无法释放,从而使fpm的处理能力降低,还会产生一些莫名其妙的错误。
但是如果你把这个值设置的过小,fpm频繁的杀死children并重建,也会导致额外的开销。
最好的优化当然是根据你网站的运行情况,去不断的调试,找到一个平衡点。
针对max_children还有一个偷懒的做法,如果你的php是5.3,那么你可以把fpm的style设置为apache-like,这个时候children的数量就由fpm自动控制。相应的配置参数是
start_servers:起始进程数量
min_spare_servers:最小进程数量
max_spare_servers:最大进程数量
当服务器比较空闲的时候,fpm会主动杀死一些多余的children,用来节约资源,当服务器繁忙的时候,服务器会自动建立更多的children。
我现在的配置
[global] pid = /www/server/php/72/var/run/php-fpm.pid error_log = /www/server/php/72/var/log/php-fpm.log log_level = notice [www] listen = /tmp/php-cgi-72.sock listen.backlog = 8192 listen.allowed_clients = 127.0.0.1 listen.owner = www listen.group = www listen.mode = 0666 user = www group = www pm = dynamic pm.status_path = /phpfpm_72_status pm.max_children = 80 pm.start_servers = 10 pm.min_spare_servers = 10 pm.max_spare_servers = 30 pm.max_requests = 6000 request_terminate_timeout = 100 request_slowlog_timeout = 30 slowlog = var/log/slow.log