nginx+php-fpm模式php内存泄漏探究_blakeFez的博客-CSDN博客_phpfpm请求结束子进程会销毁吗


本站和网页 https://blog.csdn.net/blakefez/article/details/46691171 的作者无关,不对其内容负责。快照谨为网络故障时之索引,不代表被搜索网站的即时页面。

nginx+php-fpm模式php内存泄漏探究_blakeFez的博客-CSDN博客_phpfpm请求结束子进程会销毁吗
nginx+php-fpm模式php内存泄漏探究
blakeFez
于 2015-06-30 08:51:28 发布
7180
收藏
分类专栏:
php
文章标签:
nginx
php
php-fpm
内存
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/blakefez/article/details/46691171
版权
php
专栏收录该内容
17 篇文章
0 订阅
订阅专栏
之前遇到过一次服务器内存告警,查看后发现有个php-fpm进程占用了2G的内存。但我明明在php.ini文件里面,有配置 memory_limit = 256M,那为什么会有占用2G内存的php-fpm进程呢?
这里先简单说一下nginx+php-fpm模式的工作原理。
nginx服务器fork出n个子进程(worker),php-fpm管理器fork出n个子进程。当有用户请求,nginx的一个worker接收请求,并将请求抛到socket中。php-fpm空闲的子进程监听到socket中有请求,接收并处理请求。
这里要重点说一下第三步骤。第三步涉及到php-fpm进程生命周期的东西。一个php-fpm的生命周期大致是这样的:模块初始化(MINIT)-> 模块激活(RINIT)-> 请求处理 -> 模块停用(RSHUTDOWN) -> 模块激活(RINIT)-> 请求处理 -> 模块停用(RSHUTDOWN)……. 模块激活(RINIT)-> 请求处理 -> 模块停用(RSHUTDOWN)-> 模块关闭(MSHUTDOWN)。在一个php-fpm进程的生命周期里,会有多次的模块激活(RINIT)-> 请求处理 -> 模块停用(RSHUTDOWN)的过程。这个“请求处理”的大致过程是这样的:php读取相应的php文件,对其进行词法分析,生成opcode,zend虚拟机执行opcode。
回到一开始说的PHP配置文件里面的memory_limit 这个东西,其实,它限制的只是这个“请求处理”的内存。所以,这个参数跟php-fpm进程占用的内存并没有什么关系。那为什么会有占用2G大小的php-fpm进程呢?原因是这样的:php是用c写的,所以,难免又会一些内存泄露。也就是说,在“请求处理”这个过程结束后,有些变量没有被销毁,然后就导致一个php-fpm进程占用的内存越来越大。
那么,有什么办法能阻止这个问题呢?方法一:写不泄漏内存的php程序;方法二:在php-fpm配置文件中,将pm.max_requests这个参数设置小一点。这个参数的含义是:一个php-fpm子进程最多处理pm.max_requests个用户请求后,就会被销毁。当一个php-fpm进程被销毁后,它所占用的所有内存都会被回收。
以下是我自己做的一次测试:
首先:将php-fpm.conf里面pm.max_chindren参数设为1。这意味着,php-fpm管理器只会fork出一个php-fpm子进程。这样一来,用户的每次请求,都会让这个进程来处理。然后随便请求我自己的网站,会看到有如下结果: 可以看到,那个php-fpm子进程占用的内存越来越大。
然后我将php-fpm重启一下: 可以看到php-fpm子进程占用的内存立刻变小了。
最后我将pm.max_requests这个参数设为5,然后再随便请求几次我的网站,看一下结果: 可以看到,php-fpm子进程的进程id会自动变化。这说明,php-fpm子进程确实会自动被销毁,然后再产生新的php-fpm子进程,而且php-fpm子进程占用的内存也没有越来越大。
blakeFez
关注
关注
点赞
收藏
打赏
评论
nginx+php-fpm模式php内存泄漏探究
之前遇到过一次服务器内存告警,查看后发现有个php-fpm进程占用了2G的内存。但我明明在php.ini文件里面,有配置 memory_limit = 256M,那为什么会有占用2G内存的php-fpm进程呢?
复制链接
扫一扫
专栏目录
PHP内存泄漏问题解析
稻草人技术博客
12-18
2万+
内存泄漏内存泄漏指的是在程序运行过程中申请了内存,但是在使用完成后没有及时释放的现象, 对于普通运行时间较短的程序来说可能问题不会那么明显,但是对于长时间运行的程序, 比如Web服务器,后台进程等就比较明显了,随着系统运行占用的内存会持续上升, 可能会因为占用内存过高而崩溃,或被系统杀掉PHP的内存泄漏PHP属于高级语言,语言级别并没有内存的概念,在使用过程中完全不需要主动申请或释放内存, 所以在P
Markdown基本使用
qq_38950838的博客
10-26
103
Markdown的基本使用
1、 标题
几级标题在内容前面加几个#号
【注】严格意义上#后加空格
一阶标题
内容写好后换行加=(数量不限)
例如:
我是一阶标题
二阶标题
内容写好后换行加-(数量不限)
2、斜体和粗体
斜体:
一个*中间写内容
粗体:
两个*中间写内容
粗斜体:
三个*中间写内容
【注】以上不要加空格
3、图片和链接
链接
方法一:
英文状态下的中括号加小括号,中括号里写内容,小括号里写网址,在网址后加空格,引号里的内容在鼠标悬停时显示
例如:
百度一下
方法
参与评论
您还未登录,请先
登录
后发表或查看评论
php fpm 内存泄漏,valgrind 检测 php-fpm 内存泄漏
weixin_36304957的博客
03-21
93
最近线上服务器安装了一些扩展,导致 php-fpm 内存增长过快,虽然可以通过配置最大请求数和定时脚本来重启 php-fpm ,但是也抱着学习折腾的精神来学习下valgrind的使用。下面的配置都是在我自己的服务器上测试,就是该博客运行的服务器上。下载安装wgethttp://valgrind.org/downloads/valgrind-3.12.0.tar.bz2tar-jxvfvalg...
python基础学习笔记八
weixin_47569730的博客
09-07
100
文章目录文件操作一、认识文件操作1、打开文件的方式: r, w, a, r+, w+, a+, rb, wb, ab, r+b, w+b, a+b 默认使用的是r(只读)模式2、文件路径二、实际操作详解1、只读操作(r,rb)2、只写(w,wb)3、追加(a,ab)4、r+、r+b读写( r+模式,默认情况下光标在文件的开头,必须先读后写 )5、w+、w+b写读( w+模式,先写后读,写的时候会覆盖原来的文件内容,读到空白文件 )6、a+、a+b写读(追加写读) 不论先读还是后读. 都读取不到数据7、其他操
php-fpm 回收,PHP的垃圾回收机制以及大概实现
weixin_32049741的博客
03-18
242
垃圾回收,简称gc。顾名思义,就是废物重利用的意思。再说这个之前先接触一下内存泄露,大概意思就是申请了一块地儿拉了会儿屎,拉完后不收拾,那么那块儿地就算是糟蹋了,地越用越少,最后一地全是屎。说到底一句,用了记得还。一定程度上说,垃圾回收机制就是用来擦屁股的。如果用过C语言,那么申请内存的方式是malloc或者是calloc,然后你用完这个内存后,一定不要忘了用free函数去释放掉,这就是传说中手动...
排查php内存泄露
victorc666的博客
05-03
589
背景
这是08年写的一份文档,我当时在一家网站刚接手做技术负责人,网站每天大概有60万ip/300万pv的访问,网站产品很复杂,代码结构差,开发工程师来来去去,代码只能只读了。突然有一天开始频繁出现php-fpm进程耗光内存和cpu占有率飙升,前端频繁出现504错误
php-fpm进程耗光内存
这个就是传说中的内存泄露,所谓内存泄露,是指进程在运行过程中,内存占用率逐步上升而不释放,导致系统可用内存越来越少的情况
严格上说,这个也不算致命错误,“内存泄露”只对长期运行的程序有威胁,对单一任务的执行脚本不需要
php 脚本 fpm缓存,PHP生命周期及fpm(FastCGI进程管理器)的运作方式
weixin_31461519的博客
03-10
311
PHP在web方式中如何改了文件就立即生效的,重要的几个概念:sapi: 可以简单的理解为php引擎对外的一个统一接口,使得php可以和外部程序进行交互php的生命周期中关键四个调用: MINT -> RINT -> RSHUTDOWN -> MSHUTDOWNfpm: fastcgi进程管理器fpm方式的流程就是:fpm通过sapi接口与php进程交互1.fpm启动会调用各扩展...
php fpm 生命周期,PHP生命周期及fpm的运作体式格局_后端开发
weixin_34453486的博客
03-16
147
PHP生命周期及fpm(FastCGI历程管理器)的运作体式格局PHP在web体式格局中怎样改了文件就马上见效的,主要的几个观点:● sapi: 能够简朴的理解为php引擎对外的一个一致接口,使得php能够和外部程序举行交互● php的生命周期中症结四个挪用: MINT -> RINT -> RSHUTDOWN -> MSHUTDOWN● fpm: fastcgi历程管理器fpm...
php-fpm 配置和优化
大鹏
10-14
426
pid = run/php-fpm.pid
#pid设置,默认在安装目录中的var/run/php-fpm.pid,建议开启
error_log = log/php-fpm.log
#错误日志,默认在安装目录中的var/log/php-fpm.log
log_level = notice
#错误级别. 可用级别为: alert(必须立即处理), error(错误情况), warning(警告情况), notice(一般重要信息), debug(调试信息). 默认: notice...
php-fpm 扩展 生命周期,PHP生命周期及fpm的运作体式格局_后端开发
weixin_28759725的博客
03-13
39
PHP生命周期及fpm(FastCGI历程管理器)的运作体式格局PHP在web体式格局中怎样改了文件就马上见效的,主要的几个观点:● sapi: 能够简朴的理解为php引擎对外的一个一致接口,使得php能够和外部程序举行交互● php的生命周期中症结四个挪用: MINT -> RINT -> RSHUTDOWN -> MSHUTDOWN● fpm: fastcgi历程管理器fpm...
PHP+FPM导致内存耗光的问题
thunder-1
05-22
347
最近总是发现fpm挂掉,查看日志是因为内存耗光了。查资料
nginxphp-fpm配置过程中最大问题是内泄漏出问题:服务器的负载不大,但是内存占用迅速增加,很快吃掉内存接着开始吃交换分区,系统很快挂掉!
google了一天,终于发现些有用的东西,其实根据官方的介绍,php-cgi不存在内存泄漏,每个请求完成后php-cgi会回收内存,但是不会释放给操作系统,这样就会导致大量内存被php-cgi占用...
php-fpm.conf 配置 性能优化 参数详解
zhouyuqi1的博客
07-20
3340
下图是展示一下php-fpm.conf 主要配置参数:
pm = dynamic; 表示使用哪种进程数量管理方式
dynamic表示php-fpm进程数是动态的,最开始是pm.start_servers指定的数量,如果请求较多,则会自动增加,保证空闲的进程数不小于pm.min_spare_servers,如果进程数较多,也会进行相应清理,保证多余的进程数不多于pm.max_spare...
PHP-fpm
最新发布
m0_66412572的博客
07-24
305
连接到来时(只有链接,不没有数据也会创建,telnet也会创建),创建新worker进程,worker进程数的创建收max_children设置限制,也受限于全局的process.max设置,如果空闲时间超过了process_idle_timeout的设置就会销毁worker进程,优点按流量需求创建,不浪费系统资源,缺点因为php-fpm是短连接的,如果每次请求都先建立连接,大流量场景下会使得master进程变得繁忙,浪费cpu,不适合大流量模式。PHP-FPM提供了更好的PHP进程管理方式,可以有。...
避免PHP-FPM内存泄漏导致内存耗尽
weixin_34113237的博客
12-21
295
对于PHP-FPM多进程的模式,想要避免内存泄漏问题很简单,就是要让PHP-CGI在处理一定数量进程后退出即可。否则PHP程序或第三方模块(如Imagemagick扩展)导致的内存泄漏问题会导致内存耗尽或不足。php-fpm.conf中有相关配置:#请自行按需求配置pm.max_requests = 1024实际上还有另一个跟它有关联的值max_children,这个是每次p...
【译】一行代码就将你的PHP-FPM内存占用降低至少一半
weixin_34214500的博客
07-30
137
标题直译:如何减少PHP-FPM (php5-fpm)内存占用50%原标题:How to reduce PHP-FPM (php5-fpm) RAM usage by about 50%英文原文:http://linuxbsdos.com/2015/02...
PHP-FPM是PHP的FastCGI过程管理器。在类Unix操作系统(包括L...
php运行的生命周期
onlymayao的博客
03-15
579
前言
通过本文可以了解到cli和fpm模式的生命周期、以及fastcgi协议。
cli模式
就是命令行模式
cli模式的生命周期一共有5大阶段:
php_module_startup //模块初始化阶段
php_request_startup //请求初始化阶段
php_execute_script //脚本执行阶段(读取你的代码,进行解析)
php_request_shutdown //...
PHP一次请求的生命周期
青玄的学习日志
11-04
291
文章目录一个请求进来,到达nginx或者是apache,再到php,直到出现响应,发生了什么事情PHP的运行模式第一阶段:SAPI接口,模块初始化阶段在使用Apache作为Web服务器的时候:在使用Nginx作为Web服务器的时候:第二阶段:请求初始化阶段第三阶段:php脚本执行阶段第四阶段:请求结束阶段
一个请求进来,到达nginx或者是apache,再到php,直到出现响应,发生了什么事情
PHP的运行模式
PHP两种运行模式是WEB模式、CLI模式。
无论哪种模式,PHP工作原理都是一样的,作
php生命周期
左手代码右手诗
08-14
181
问题
php的生命周期是什么?每个阶段做了什么?
为什么会有FPM?
cli执行代码和请求经过fpm执行有什么区别?
swoole为什么可以不使用fpm
nginx配置php-fpm的两种方式
思考ing
php五个生命周期
php_module_startup:模块初始化
php_request_startup:请求初始化
php_execute_script:执行脚本
php_reque...
php-fpm 内存占用过大
luckyboy008的专栏
10-21
4143
由于服务器只有600M的内存,上面跑了一个并发并不是很大的php应用,当运行一段时间后,发现内存不断增长,其中一部分是PageCache的增长,这个可以通过echo 3 > /proc/sys/vm/drop_caches 命令来进行有效的释放,另外一个应用内存的增长,且无法释放,通过top命名(输入命名后按m键可按进程占用内存大小的排序)查看,发现大部分内存都被
php-fpm 占用,网上查
“相关推荐”对你有帮助么?
非常没帮助
没帮助
一般
有帮助
非常有帮助
提交
©️2022 CSDN
皮肤主题:编程工作室
设计师:CSDN官方博客
返回首页
blakeFez
CSDN认证博客专家
CSDN认证企业博客
码龄7年
暂无认证
33
原创
21万+
周排名
170万+
总排名
10万+
访问
等级
1379
积分
10
粉丝
15
获赞
评论
30
收藏
私信
关注
热门文章
mysql大量数据迁移
9232
用PHP实现n的阶乘--高精度算法
8279
使用secureCrt端口转发连接远程服务器mysql
7312
nginx+php-fpm模式php内存泄漏探究
7180
rtrim函数的一个坑
6771
分类专栏
css
2篇
php
17篇
jquery
js
1篇
linux
5篇
hive
1篇
大数据
1篇
mysql
7篇
nosql
1篇
angularjs
nodejs
1篇
storm
1篇
kafka
1篇
docker
最新评论
rtrim函数的一个坑
Daslu666:
感谢,学到了。
rtrim函数的一个坑
Howardsze:
then what's the correct method to handle this kind multibyte situation/
[mysql]explain语句中的key_len计算
lppl010_:
不错,谢谢
mysql大量数据迁移
ganchuanhu:
看了很多,第一次看见这个方法,但是似乎很直接粗暴
mysql大量数据迁移
Main_csdn_String:
很粗暴
您愿意向朋友推荐“博客详情页”吗?
强烈不推荐
不推荐
一般般
推荐
强烈推荐
提交
最新文章
Vuex源码解析
用php实现几种常见的排序算法
php源码阅读----php5.3.27 mysqli扩展bug及修复
2018年1篇
2017年4篇
2016年8篇
2015年26篇
目录
目录
分类专栏
css
2篇
php
17篇
jquery
js
1篇
linux
5篇
hive
1篇
大数据
1篇
mysql
7篇
nosql
1篇
angularjs
nodejs
1篇
storm
1篇
kafka
1篇
docker
目录
评论
被折叠的 条评论
为什么被折叠?
到【灌水乐园】发言
查看更多评论
打赏作者
blakeFez
你的鼓励将是我创作的最大动力
¥2
¥4
¥6
¥10
¥20
输入1-500的整数
余额支付
(余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付
您的余额不足,请更换扫码支付或充值
打赏作者
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额
抵扣说明:
1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。 2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。
余额充值