PHP+FPM导致内存耗光的问题

2 篇文章 0 订阅

转自:http://blog.csdn.net/zouyongjin/article/details/6642157

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生成core dump时,可以使用gdb进行调试。需要注意的是,由于生成core dump的是php-fpm,所以需要使用php-fpm进行调试。如果是在cli模式下使用php生成的core dump,则需要使用php程序进行调试。在调试过程中,可以查看调用栈信息来定位问题。例如,在调试过程中,可以使用gdb命令查看主函数的调用栈信息,如#17 0x00000000006ed0ba in main (argc=2, argv=0x7fff4efcb2a8) at /root/php-5.3.27/sapi/fpm/fpm/fpm_main.c:1929。同时,还可以使用gdb命令查看php执行脚本的调用栈信息,如#16 0x000000000058056c in php_execute_script (primary_file=0x7fff4efcb080) at /root/php-5.3.27/main/main.c:2316。\[1\]\[2\]\[3\] #### 引用[.reference_title] - *1* [使用GDB调试PHP core dump](https://blog.csdn.net/weixin_29748637/article/details/115987071)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [在php-fpm下,服务器间歇出现core dump 追踪到php代码是include一个php文件](https://blog.csdn.net/weixin_40004960/article/details/115941227)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值