webman框架運行了有一年,后面不知道從什么時候開始,內(nèi)存一直在增加,不釋放,按照之前walkor提供的方法檢測,心跳檢測接口都出現(xiàn)內(nèi)存變化,各位大佬,有什么好的方法可以定位嗎
檢查內(nèi)存變化中間件
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([
'上次內(nèi)存' => $memory / 1024 . '(KB)',
'本次內(nèi)存' => $usage / 1024 . '(KB)',
'內(nèi)存變化' => $diff / 1024 . '(KB)',
'請求方法' => $method,
'請求地址' => $uri,
], 'fs_token_check');
}
$memory = $usage;
return $response;
}
心跳接口
public function isHealthy(Request $request)
{
return 'okk';
}
飛書報警
每次大概2M增加
進程的內(nèi)存分布也相差很大,處理的請求差不大,但有的進程才15M,有的就300M多
后來加了xhprof監(jiān)控,但和飛書里的內(nèi)存不一致,xhprof監(jiān)控的內(nèi)存大致正常
xhprof監(jiān)控頁面
飛書提醒有12M
請求增長到一定程度不再增長不是內(nèi)存泄露。
50M內(nèi)存是正常內(nèi)存占用,沒超過100M不用擔(dān)心。
看在是不是哪里讀數(shù)據(jù)庫 redis等讀的數(shù)據(jù)太大了,超過php內(nèi)存上限了。
如果有類似 Fatal error: Allowed memory size of xxx bytes exhausted
看下調(diào)用棧,大概能看出來哪里大量使用了內(nèi)存。
什么時候開始出現(xiàn)居高不下的情況的,看下代碼提交日志,回想下當(dāng)時上了什么功能,或者什么功能的業(yè)務(wù)量在那時候起突然比之前增多,沒業(yè)務(wù)代碼,大家看截圖大概率只能靠猜,只能你自己去定位
Redis內(nèi)存增加是不是應(yīng)該體現(xiàn)在系統(tǒng)內(nèi)存總占用上,請問對于PHP workerman中使用了Redis還會導(dǎo)致workerman進程的內(nèi)存增加嗎?