我現在打開的php start.php status 顯示內存占用與我服務器上面看到的不一樣
如圖:
服務器進程內存:397768 確是顯示 物理內存使用有368M
內存中間件
是不是代表/admin/room/getRoomList有內存泄漏呢
不是,說明他要用2MB內存,你下一條日志不就-2MB了么
你這個diff是執(zhí)行結束之前的值,在你return $response之前都不會釋放,所以getRoomList +2MB,下一個日志的memory起始值就是上一個日志沒有釋放時候的結束值,所以再算diff的時候就是-2MB
現在如果實在不行只能去監(jiān)聽服務器內存達到多少執(zhí)行reload了,為什么主進程監(jiān)聽php.ini達到會自動reload,這個也沒有生效呢 ,我看框架上面是這么寫的 現在我單個進程已經達到168M,php.ini設置的128M 沒有自動釋放
if (!$worker || $worker->id !== 0) {
return $response;
} 大哥 你知道這個是啥意思不? 我沒有很看明白,我進程開啟32個 但是這個判斷是大佬給的 不知道是不是主進程不進行記錄
從日志看沒有內存泄露。每次 /admin/room/getRoomList 請求后內存固定是 119537664,沒有增長。
只要內存不是無限增長就不是內存泄露。有時候業(yè)務從數據庫讀取很大的數據時例如幾十M會申請很大內存,這個內存申請后PHP不一定立刻歸還操作系統(tǒng),可能會留做復用,這時候內存占用就很大。但只要不是無限增長就沒事。
memory_get_usage($real_usage) 返回的是php腳本申請的內存,參數傳false和true值也不同。 top等命令看到的內存是PHP所有東西占用的內存,包括PHP可執(zhí)行文件自身占用、共享庫、緩存等所有占用,肯定要大一些。如果大很多可能是可執(zhí)行文件很大,例如做了二進制打包、phar打包等,也有可能是php或者某個擴展的bug。
關于 “現在我單個進程已經達到168M,php.ini設置的128M 沒有自動釋放” 問題,
執(zhí)行 php -i | grep memory_limit 看下實際值,因為可能沒找對php.ini文件,也有可能config/process.php里手動設置了釋放閾值
if (!$worker || $worker->id !== 0) {
return $response;
}
意思是只記錄0號進程的內存使用情況,所有進程都記錄不好比對。
你沒沒有排除,業(yè)務的死循環(huán)導致的泄露?。烤褪悄硞€接口請求完了,業(yè)務有死循環(huán)導致的,而且這種現象會導致當前進程阻塞,一直到該進程觸發(fā)了php的內存上限后,被workerman殺死進程后,重啟進程