PHP+FPM导致内存耗光的问题
2011-07-28 21:27
531 查看
最近总是发现fpm挂掉,查看日志是因为内存耗光了。查资料
http://blog.sina.com.cn/s/blog_40e8378d0100pojm.html
nginxphp-fpm配置过程中最大问题是内泄漏出问题:服务器的负载不大,但是内存占用迅速增加,很快吃掉内存接着开始吃交换分区,系统很快挂掉!
google了一天,终于发现些有用的东西,其实根据官方的介绍,php-cgi不存在内存泄漏,每个请求完成后php-cgi会回收内存,但是不会释放给操作系统,这样就会导致大量内存被php-cgi占用。
官方的解决办法是降低PHP_FCGI_MAX_REQUESTS的值,我用的是php-fpm,对应的php-fpm.conf中的就是max_requests,该值的意思是发送多少个请求后会重启该线程,我们需要适当降低这个值,用以让php-fpm自动的释放内存,不是大部分网上说的51200等等,实际上还有另一个跟它有关联的值max_children,这个是每次php-fpm会建立多少个进程,这样实际上的内存消耗是max_children*max_requests*每个请求使用内存,根据这个我们可以预估一下内存的使用情况,就不用再写脚本去kill了。
下面其实是重启脚本的过程,并不是什么很严重的事情,但是我们要小心,不是说一直重启就是好的,因为重启会导致cpu的使用率飙升,系统负载巨大,所以还是平衡上面的数据比较重要。
其他解决办法:
1.检查php进程的内存占用,杀掉内存使用超额的进程
一般情况下,如果php-cgi进程占用超过1%的内存,就得考虑一下是否要杀掉它了。因为普通情况下,php-cgi进程一般占用0.2%或以下。
这里提供一个脚本供各位使用,就是放在cron任务里,每分钟执行一次。
使用crontab -e 命令,然后添加如下调度任务
* * * * * /bin/bash /usr/local/script/kill_php_cgi.sh
kill_php_cgi.sh脚本如下
#!/bin/sh
# This script is used to kill php-cgi process that takes large memory size
# If a php-cgi process uses 1% or more memory, then it will be killed.
PIDS=`ps aux|grep php-cgi|grep -v grep|awk '{if($4>=1)print $2}'`
for PID in $PIDS
do
#echo `date +%F....%T` >> /usr/local/php/logs/phpkill.log
#echo $PID >> /usr/local/php/logs/phpkill.log
kill -9 $PID
done
顺便检查PHP-FPM参数
一般来说,如果设置不当,可能导致fpm出现[WARNING] fpm_children_bury(), line 215: child 20883 (pool default) exited on signal 11 SIGSEGV 之类的错误。
可以输入命令ulimit -n,看看ulimit设置是多少,默认是1024,也许你改成了65535,但都没关系,你只要保证这个值与php-fpm.conf里的设置相同就可以了。
<value name="rlimit_files">65535</value>
http://blog.sina.com.cn/s/blog_40e8378d0100pojm.html
nginxphp-fpm配置过程中最大问题是内泄漏出问题:服务器的负载不大,但是内存占用迅速增加,很快吃掉内存接着开始吃交换分区,系统很快挂掉!
google了一天,终于发现些有用的东西,其实根据官方的介绍,php-cgi不存在内存泄漏,每个请求完成后php-cgi会回收内存,但是不会释放给操作系统,这样就会导致大量内存被php-cgi占用。
官方的解决办法是降低PHP_FCGI_MAX_REQUESTS的值,我用的是php-fpm,对应的php-fpm.conf中的就是max_requests,该值的意思是发送多少个请求后会重启该线程,我们需要适当降低这个值,用以让php-fpm自动的释放内存,不是大部分网上说的51200等等,实际上还有另一个跟它有关联的值max_children,这个是每次php-fpm会建立多少个进程,这样实际上的内存消耗是max_children*max_requests*每个请求使用内存,根据这个我们可以预估一下内存的使用情况,就不用再写脚本去kill了。
下面其实是重启脚本的过程,并不是什么很严重的事情,但是我们要小心,不是说一直重启就是好的,因为重启会导致cpu的使用率飙升,系统负载巨大,所以还是平衡上面的数据比较重要。
其他解决办法:
1.检查php进程的内存占用,杀掉内存使用超额的进程
一般情况下,如果php-cgi进程占用超过1%的内存,就得考虑一下是否要杀掉它了。因为普通情况下,php-cgi进程一般占用0.2%或以下。
这里提供一个脚本供各位使用,就是放在cron任务里,每分钟执行一次。
使用crontab -e 命令,然后添加如下调度任务
* * * * * /bin/bash /usr/local/script/kill_php_cgi.sh
kill_php_cgi.sh脚本如下
#!/bin/sh
# This script is used to kill php-cgi process that takes large memory size
# If a php-cgi process uses 1% or more memory, then it will be killed.
PIDS=`ps aux|grep php-cgi|grep -v grep|awk '{if($4>=1)print $2}'`
for PID in $PIDS
do
#echo `date +%F....%T` >> /usr/local/php/logs/phpkill.log
#echo $PID >> /usr/local/php/logs/phpkill.log
kill -9 $PID
done
顺便检查PHP-FPM参数
一般来说,如果设置不当,可能导致fpm出现[WARNING] fpm_children_bury(), line 215: child 20883 (pool default) exited on signal 11 SIGSEGV 之类的错误。
可以输入命令ulimit -n,看看ulimit设置是多少,默认是1024,也许你改成了65535,但都没关系,你只要保证这个值与php-fpm.conf里的设置相同就可以了。
<value name="rlimit_files">65535</value>
相关文章推荐
- PHP+FPM导致内存耗光的问题
- PHP+FPM导致内存耗光的问题
- 解决Linux下php-fpm进程过多导致内存耗尽问题
- php-fpm内存占满的问题
- 记录一下xcache导致的php-fpm 502问题
- PHP 大图片操作导致内存崩溃及超时的问题
- 解决PHP加速器eAccelerator导致php-cgi占用内存过多的问题
- 避免PHP-FPM内存泄漏导致内存耗尽
- PHP 4.4.0发布 修复导致内存崩溃问题
- php-fpm进程太多,内存耗尽问题排查
- 避免 php-fpm 耗尽内存导致宕机
- 解决WordPress被利用xmlrpc.php导致VPS CPU内存占用过高问题
- php-fpm设置问题导致网站无法访问
- 记录一下xcache导致的php-fpm 502问题
- 如何解决PHP+FPM导致内存耗光的问题
- php5.1x的时区问题导致相差八个小时!
- PHP线程的内存回收问题
- PHP数组内存耗用太多问题的解决方法
- PHP关于IE下的iframe跨域导致session丢失问题解决方法
- 如何解决PHP里大量数据循环时内存耗尽的问题