redis 隊(duì)列進(jìn)程消費(fèi),插件安裝的,代碼里面使用了靜態(tài)方法, 隊(duì)列跑完了數(shù)據(jù)進(jìn)程內(nèi)存沒(méi)有釋放,
跑之前:
跑中:
跑完后:
然后我打印status 結(jié)果和跑完后一樣,內(nèi)存沒(méi)有釋放呀,需要使用單例模式 使用類的靜態(tài)方法嗎?
這樣一直增長(zhǎng)會(huì)不會(huì)出現(xiàn)內(nèi)存泄露 溢出的情況呀?
消費(fèi)的過(guò)程中會(huì)加載類文件到內(nèi)存,消費(fèi)后內(nèi)存比初始內(nèi)存大是正常的,隨著所有類文件都加載到內(nèi)存,內(nèi)存就不增長(zhǎng)了。只要不是內(nèi)存無(wú)限增長(zhǎng)就沒(méi)事。
本地測(cè)試下,比如消費(fèi)10萬(wàn)條消息,后記截圖記錄下內(nèi)存占用,再消費(fèi)10萬(wàn)條消息看下內(nèi)存是否有明顯增長(zhǎng)。如果有的話可能是內(nèi)存泄漏,需要自己定位下,找出代碼中有嫌疑的地方注釋掉,消費(fèi)測(cè)試直到找到泄漏點(diǎn)。沒(méi)有明顯增長(zhǎng)不用擔(dān)心。一般進(jìn)程占用幾十M是很正常的事情。
插個(gè)樓 為什么4個(gè)進(jìn)程 內(nèi)存差別這么大呢
經(jīng)過(guò)測(cè)試發(fā)現(xiàn)。內(nèi)存是增長(zhǎng)到一定量以后,消費(fèi)進(jìn)程重啟,然后內(nèi)存釋放,再增長(zhǎng)到一定量進(jìn)程重啟,內(nèi)存釋放,就這么個(gè)循環(huán)過(guò)程。
process terminated with ERROR: E_ERROR "Uncaught RuntimeException: Workerman Redis Wait Timeout (600 seconds) in /private/var/www/api_process/vendor/workerman/redis-queue/src/Client.php:175
這個(gè)我知道 有個(gè)內(nèi)存檢測(cè) 如果某個(gè)進(jìn)程占用內(nèi)存即將超過(guò)php.ini中memory_limit設(shè)定的值,就會(huì)重啟進(jìn)程。但是最主要是要知道哪里在泄漏。
process 意思是隊(duì)列里有命令超過(guò)xx秒還沒(méi)成功發(fā)送給redis服務(wù)端,觸發(fā)超時(shí)。出現(xiàn)這個(gè)問(wèn)題一般是業(yè)務(wù)有長(zhǎng)時(shí)間阻塞的代碼如sleep、curl等,或者redis讀寫量太大超過(guò)redis服務(wù)端承受能力。
30多正常。php內(nèi)存管理器不一定會(huì)把空閑內(nèi)存及時(shí)歸還給操作系統(tǒng),它會(huì)留著復(fù)用,提升性能,比如A進(jìn)程剛好處理了某個(gè)業(yè)務(wù)邏輯申請(qǐng)了大量?jī)?nèi)存,這部分內(nèi)存使用完php管理器可能不會(huì)釋放,留著下次用,B進(jìn)程沒(méi)處理過(guò)這樣占用大量?jī)?nèi)存的業(yè)務(wù),那B進(jìn)程內(nèi)存占用就小一些。這也是為什么有的進(jìn)程大,有的進(jìn)程小,和請(qǐng)求量沒(méi)有直接關(guān)系。30M正常,只有內(nèi)存無(wú)限增長(zhǎng)時(shí)才需要關(guān)注,占用幾十M就不增長(zhǎng)了不用管?;蛘吣闶謩?dòng)調(diào)用下 gc_mem_caches() 方法,它會(huì)釋放部分空閑內(nèi)存。
Workerman Redis Wait Timeout 如JhQ所說(shuō),本地緩存里的消息數(shù)據(jù)過(guò)了600秒還沒(méi)有發(fā)給redis,導(dǎo)致觸發(fā)超時(shí)。
這種情況一般發(fā)生在短時(shí)間內(nèi)產(chǎn)生巨量消息,redis處理速度跟不上導(dǎo)致的,比如redis走的外網(wǎng),傳輸速度慢。
老大,每個(gè)消費(fèi)進(jìn)程使用40多M 的時(shí)候就消費(fèi)進(jìn)程自己重啟了正常嘛?如果超過(guò)50M左右就重啟這個(gè)進(jìn)程了
status 里的內(nèi)存統(tǒng)計(jì)用的 memory_get_usage(),有些內(nèi)存不會(huì)統(tǒng)計(jì)在內(nèi),比如emalloc() 分配的內(nèi)存
,php可執(zhí)行文件本身占用內(nèi)存。你看到40M占用實(shí)際上占用要比40M多,具體多少用ps aux查看。
monitor監(jiān)控的是整個(gè)php的占用的內(nèi)存,達(dá)到最大限度的80%時(shí)回收進(jìn)程。
關(guān)鍵是我看了代碼,真的沒(méi)有用靜態(tài)屬性 數(shù)組 方式一直往里面放數(shù)據(jù) , 使用靜態(tài)方法,調(diào)用第三方接口就這些,內(nèi)存嗚嗚漲