我现在打开的php start.php status 显示内存占用与我服务器上面看到的不一样 如图:
服务器进程内存:397768 确是显示 物理内存使用有368M
内存中间件 是不是代表/admin/room/getRoomList有内存泄漏呢
不是,说明他要用2MB内存,你下一条日志不就-2MB了么
感觉不是这个是差值,而且是请求之后的释放后差值。有点没搞透彻,现在5台业务服务器一直内存在奔溃边缘
你下一条日志不就-2MB了么
你这个diff是执行结束之前的值,在你return $response之前都不会释放,所以getRoomList +2MB,下一个日志的memory起始值就是上一个日志没有释放时候的结束值,所以再算diff的时候就是-2MB
看内存使用很正常,所以先弄清楚是内存的正常增长还是内存泄漏
下一条日志的-2M 并不是代表当前接口的内存占用 仅仅是差值 因为部分也在释放。
现在如果实在不行只能去监听服务器内存达到多少执行reload了,为什么主进程监听php.ini达到会自动reload,这个也没有生效呢 ,我看框架上面是这么写的 现在我单个进程已经达到168M,php.ini设置的128M 没有自动释放
if (!$worker || $worker->id !== 0) { return $response; } 大哥 你知道这个是啥意思不? 我没有很看明白,我进程开启32个 但是这个判断是大佬给的 不知道是不是主进程不进行记录
00:00:07 memroy_get_usage = 119537664 ..... 00:10:09 memroy_get_usage = 119537664
如果你看不明白我上面说的意思,那我觉得我也没必要再说下去了,是个死循环,解决不了问题
现在明白了 感谢
从日志看没有内存泄露。每次 /admin/room/getRoomList 请求后内存固定是 119537664,没有增长。 只要内存不是无限增长就不是内存泄露。有时候业务从数据库读取很大的数据时例如几十M会申请很大内存,这个内存申请后PHP不一定立刻归还操作系统,可能会留做复用,这时候内存占用就很大。但只要不是无限增长就没事。
memory_get_usage($real_usage) 返回的是php脚本申请的内存,参数传false和true值也不同。 top等命令看到的内存是PHP所有东西占用的内存,包括PHP可执行文件自身占用、共享库、缓存等所有占用,肯定要大一些。如果大很多可能是可执行文件很大,例如做了二进制打包、phar打包等,也有可能是php或者某个扩展的bug。
关于 “现在我单个进程已经达到168M,php.ini设置的128M 没有自动释放” 问题, 执行 php -i | grep memory_limit 看下实际值,因为可能没找对php.ini文件,也有可能config/process.php里手动设置了释放阈值
if (!$worker || $worker->id !== 0) { return $response; }
意思是只记录0号进程的内存使用情况,所有进程都记录不好比对。
感谢大佬解释的这么详细,现在明白了所有的关系。等我自己在好好排查下
现在我的系统每天的访问量快到200W了,5台4核8G的服务器 内存都在80-90,访问量还在不停增长有点担心
你没没有排除,业务的死循环导致的泄露啊?就是某个接口请求完了,业务有死循环导致的,而且这种现象会导致当前进程阻塞,一直到该进程触发了php的内存上限后,被workerman杀死进程后,重启进程
你这种内存不一致的进程出现了,你观察下是不是就那几个大内存的进程,内存在上涨
其他的的进程都是好的,唯独那几个上涨,就很像我说的这种情况
还有如果你只是判断是请求导致的内存泄露,直接用压测工具随便跑接口就可以看出来了
好的 感谢,我也准备白天没有业务量的时候压测单个这个接口看看内存会有多大变化
这个最直观的办法就是压测 然后观察进程 内存使用情况 如果压测一直增长 就是内存泄漏 有时候 一直new 类 不释放 也会缓慢增长 我测试过
不是,说明他要用2MB内存,你下一条日志不就-2MB了么
感觉不是这个是差值,而且是请求之后的释放后差值。有点没搞透彻,现在5台业务服务器一直内存在奔溃边缘
你下一条日志不就-2MB了么
你这个diff是执行结束之前的值,在你return $response之前都不会释放,所以getRoomList +2MB,下一个日志的memory起始值就是上一个日志没有释放时候的结束值,所以再算diff的时候就是-2MB
看内存使用很正常,所以先弄清楚是内存的正常增长还是内存泄漏
下一条日志的-2M 并不是代表当前接口的内存占用 仅仅是差值 因为部分也在释放。
现在如果实在不行只能去监听服务器内存达到多少执行reload了,为什么主进程监听php.ini达到会自动reload,这个也没有生效呢 ,我看框架上面是这么写的 现在我单个进程已经达到168M,php.ini设置的128M 没有自动释放
if (!$worker || $worker->id !== 0) {
return $response;
} 大哥 你知道这个是啥意思不? 我没有很看明白,我进程开启32个 但是这个判断是大佬给的 不知道是不是主进程不进行记录
如果你看不明白我上面说的意思,那我觉得我也没必要再说下去了,是个死循环,解决不了问题
现在明白了 感谢
从日志看没有内存泄露。每次 /admin/room/getRoomList 请求后内存固定是 119537664,没有增长。
只要内存不是无限增长就不是内存泄露。有时候业务从数据库读取很大的数据时例如几十M会申请很大内存,这个内存申请后PHP不一定立刻归还操作系统,可能会留做复用,这时候内存占用就很大。但只要不是无限增长就没事。
memory_get_usage($real_usage) 返回的是php脚本申请的内存,参数传false和true值也不同。 top等命令看到的内存是PHP所有东西占用的内存,包括PHP可执行文件自身占用、共享库、缓存等所有占用,肯定要大一些。如果大很多可能是可执行文件很大,例如做了二进制打包、phar打包等,也有可能是php或者某个扩展的bug。
关于 “现在我单个进程已经达到168M,php.ini设置的128M 没有自动释放” 问题,
执行 php -i | grep memory_limit 看下实际值,因为可能没找对php.ini文件,也有可能config/process.php里手动设置了释放阈值
意思是只记录0号进程的内存使用情况,所有进程都记录不好比对。
感谢大佬解释的这么详细,现在明白了所有的关系。等我自己在好好排查下
现在我的系统每天的访问量快到200W了,5台4核8G的服务器 内存都在80-90,访问量还在不停增长有点担心
你没没有排除,业务的死循环导致的泄露啊?就是某个接口请求完了,业务有死循环导致的,而且这种现象会导致当前进程阻塞,一直到该进程触发了php的内存上限后,被workerman杀死进程后,重启进程
你这种内存不一致的进程出现了,你观察下是不是就那几个大内存的进程,内存在上涨
其他的的进程都是好的,唯独那几个上涨,就很像我说的这种情况
还有如果你只是判断是请求导致的内存泄露,直接用压测工具随便跑接口就可以看出来了
好的 感谢,我也准备白天没有业务量的时候压测单个这个接口看看内存会有多大变化
这个最直观的办法就是压测 然后观察进程 内存使用情况 如果压测一直增长 就是内存泄漏 有时候 一直new 类 不释放 也会缓慢增长 我测试过