webman框架运行了有一年,后面不知道从什么时候开始,内存一直在增加,不释放,按照之前walkor提供的方法检测,心跳检测接口都出现内存变化,各位大佬,有什么好的方法可以定位吗
检查内存变化中间件
public function process(Request $request, callable $handler) : Response
{
$response = $handler($request);
$worker = App::worker();
if (!$worker || $worker->id !== 0) {
return $response;
}
static $memory = 0;
if ($memory === 0) {
$memory = memory_get_usage(true);
}
$usage = memory_get_usage(true);
$diff = $usage - $memory;
$checkLimit = 10 * 1024;
if ($diff > $checkLimit) {
$uri = $request->uri();
$method = $request->method();
(new FeiShuClient)->send([
'上次内存' => $memory / 1024 . '(KB)',
'本次内存' => $usage / 1024 . '(KB)',
'内存变化' => $diff / 1024 . '(KB)',
'请求方法' => $method,
'请求地址' => $uri,
], 'fs_token_check');
}
$memory = $usage;
return $response;
}
心跳接口
public function isHealthy(Request $request)
{
return 'okk';
}
飞书报警
每次大概2M增加
进程的内存分布也相差很大,处理的请求差不大,但有的进程才15M,有的就300M多
后来加了xhprof监控,但和飞书里的内存不一致,xhprof监控的内存大致正常
xhprof监控页面
飞书提醒有12M
请求增长到一定程度不再增长不是内存泄露。
50M内存是正常内存占用,没超过100M不用担心。
增长到300M了,服务器内存都爆了
看在是不是哪里读数据库 redis等读的数据太大了,超过php内存上限了。
如果有类似
Fatal error: Allowed memory size of xxx bytes exhausted
看下调用栈,大概能看出来哪里大量使用了内存。有这个错误,是通过execl上传文件会爆这个错误,这块申请的内存是相当垃圾内存吗,之后都不能用吗,要怎么处理呢
php申请的内存不一定会全部释放,会留着下次复用
大佬,评论贴不了图片。我在问题上加了几张图,飞书看到的报警是大概2M一加,进程内存严重不均衡
这个自己测试下吧,看下哪个请求占用了内存。尤其excel上传。其他人帮不上什么忙,只能自己去测试找问题
没有慌过
你尝试着注释你的中间件,composer包,先从架构层次排查,定位在那一层先。然后在定位业务,这个思路
也可以正向排查,下载一个裸框架,一层层把你的业务加上去。通过压力测试跑你的接口,这样也可以排查
少用
static
多用new
,少用tp
多用lv
生态。会很少很多烦恼;有可能是redis存的东西太多,运行的时候加载进来了。有的缓存时间设置的很长或是永久的,时间久了就积累了一些垃圾数据。
如果redis里面数据不重要,直接把使用的库全库清除或手动判断删除。
redis在一个进程里,变量名是一样的,应该会被覆盖吧
之前遇到了跟你一样的问题。。突然开始进程增上,而且是慢慢稳定的向上,直到超过上限后自动重启。。
老哥,有办法解决吗
后来也没查
看是不是redis 我遇到过一次 是redis
老哥,我这边的redis是用了云厂商的,redis的数据不占本机内存,redis是怎么关联的,php只是把redis数据读到内存里,
如果redis 单个数据太大也会
老哥,我看下我这个情况,问题我加了几张图片,内存大概是2M一加,而且进程间内存相差很大
什么时候开始出现居高不下的情况的,看下代码提交日志,回想下当时上了什么功能,或者什么功能的业务量在那时候起突然比之前增多,没业务代码,大家看截图大概率只能靠猜,只能你自己去定位
单独搞一部份流量用 xphrof 做内存使用分析。基本可以定位到。
接入了xhprof,xhprof监控页面没发现大内存,问题又贴了几张图
Redis内存增加是不是应该体现在系统内存总占用上,请问对于PHP workerman中使用了Redis还会导致workerman进程的内存增加吗?
现在就是使用了redis,问题我截图了,很奇怪,有的进程内存正常
你有云服务器吗?查看一下那段时间中间件redis,mysql日志,看在执行哪些操作。有的进程有,有的进程没,那就可能是某些进程触发了业务死循环