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