php-fpm.conf

pm = static  

pm.max_children = 7  #这个决定了 php-fpm的总进程。我们要想同时响应更多的并发数,这个数值要尽可能大,比如500,1000  

pm.max_requests = 10000  #并发数越大,这个最大请求数应该越大,并发数小,这个数值也应该越小。它表示,php-fpm进程响应了10000个并发请求之后,就自 动重启一下进程。  

request_terminate_timeout = 30  #表示等待30秒后,结束那些没有自动结束的php脚本,以释放占用的资源。

 

由于服务器只有600M的内存,上面跑了一个并发并不是很大的php应用,当运行一段时间后,发现内存不断增长,其中一部分是PageCache的增长, 这个可以通过echo 3 > /proc/sys/vm/drop_caches 命令来进行有效的释放,另外一个应用内存的增长,且无法释放,通过top命名(输入命名后按m键可按进程占用内存大小的排序)查看,发现大部分内存都被 php-fpm 占用,网上查了一下,大概的意思是说,处理每个php请求完成后,php-fpm会回收内存,但不会释放给操作系统,从而导致大量的内存被php-fpm 占用。网上也提到解决方法,就是调整php-fpm.conf中的pm.max_requests值,pm.max_requests的作用是发送多少个 请求后会重启该线程,从而使其释放占用的内存,默认0,即决不重启。在我的应用把该值设置为250,观察一段时间后,发现还是有好几个php-fpm占用 内存的比例是2.8%左右,效果不理想,可能的原因是请求量大,还是无法达到这个阀值,将其设置为10的时候,发现php-fpm是会不断的重启的。个人 感觉这样配置不是太好,所有还是把这个值置为250,同时用一个脚本来进行杀掉php-fpm,从而释放他占用的内存,另外如果系统负载巨大,重启会导致 cpu的使用率飙升。脚本如下:

#!/bin/bash

log=/home/www/scripts/php-fpm.log

echo `date "+%F %H:%M:%S"` >> $log
for PID in `ps aux|grep php-fpm|grep -v grep|awk '{if($4>=1)print $2}'`
do
    kill -9 $PID
    echo $PID >> $log
done

可以把脚本加到crontab中让其定期执行.

另外记录几个长用的命令:
1、按顺序列出内存占用率的进程     ps -A --sort -rss -o comm,pmem,pcpu |uniq -c |head -15

ps -A --sort -rss -o comm,pmem,pcpu|uniq -c |head -15
2、指令vmstat可以监控内存使用情况,作为对内存监控,我们比较关心swpd、free、si、so。一般系统不繁忙的状态下,我们看到swpd,so的值不会持续很高,经常为0
3、通过pmap来查看进程占用内存的详细情况,例如,pmap 进程号

pmap $(pgrep php-cgi|head -1)

netstat -np|grep php-cgi 查看数量

 

1、提升服务器的文件句柄打开打开
/etc/security/limits.conf : (增加)
*    soft    nofile    51200
*    hard    nofile    51200
# vi /etc/security/limits.conf 加上
* soft nofile 51200
* hard nofile 51200
 
2、提升nginx的进程文件打开数
 
nginx.conf : worker_rlimit_nofile 51200;
 
3、修改php-fpm.conf文件,主要需要修改2处
 
命令 ulimit -n 查看限制的打开文件数,php-fpm.conf 中的选项rlimit_files 确保和此数值一致。
 
 10240
 
51200
 
4、
# vi /etc/sysctl.conf 
底部添加
fs.file-max=51200

完成以上修改,重启



本文参考了:http://www.opsers.org/linux-home/server/php-fpm-on-analysis-of-system-resources.html