redis 隊(duì)列進(jìn)程消費(fèi),插件安裝的,代碼里面使用了靜態(tài)方法, 隊(duì)列跑完了數(shù)據(jù)進(jìn)程內(nèi)存沒有釋放,
跑之前:
跑中:
跑完后:
然后我打印status 結(jié)果和跑完后一樣,內(nèi)存沒有釋放呀,需要使用單例模式 使用類的靜態(tài)方法嗎?
這樣一直增長會不會出現(xiàn)內(nèi)存泄露 溢出的情況呀?
插個(gè)樓 為什么4個(gè)進(jìn)程 內(nèi)存差別這么大呢
經(jīng)過測試發(fā)現(xiàn)。內(nèi)存是增長到一定量以后,消費(fèi)進(jìn)程重啟,然后內(nèi)存釋放,再增長到一定量進(jìn)程重啟,內(nèi)存釋放,就這么個(gè)循環(huán)過程。
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)存檢測 如果某個(gè)進(jìn)程占用內(nèi)存即將超過php.ini中memory_limit設(shè)定的值,就會重啟進(jìn)程。但是最主要是要知道哪里在泄漏。
process 意思是隊(duì)列里有命令超過xx秒還沒成功發(fā)送給redis服務(wù)端,觸發(fā)超時(shí)。出現(xiàn)這個(gè)問題一般是業(yè)務(wù)有長時(shí)間阻塞的代碼如sleep、curl等,或者redis讀寫量太大超過redis服務(wù)端承受能力。
30多正常。php內(nèi)存管理器不一定會把空閑內(nèi)存及時(shí)歸還給操作系統(tǒng),它會留著復(fù)用,提升性能,比如A進(jìn)程剛好處理了某個(gè)業(yè)務(wù)邏輯申請了大量內(nèi)存,這部分內(nèi)存使用完php管理器可能不會釋放,留著下次用,B進(jìn)程沒處理過這樣占用大量內(nèi)存的業(yè)務(wù),那B進(jìn)程內(nèi)存占用就小一些。這也是為什么有的進(jìn)程大,有的進(jìn)程小,和請求量沒有直接關(guān)系。30M正常,只有內(nèi)存無限增長時(shí)才需要關(guān)注,占用幾十M就不增長了不用管?;蛘吣闶謩诱{(diào)用下 gc_mem_caches() 方法,它會釋放部分空閑內(nèi)存。
Workerman Redis Wait Timeout 如JhQ所說,本地緩存里的消息數(shù)據(jù)過了600秒還沒有發(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)程自己重啟了正常嘛?如果超過50M左右就重啟這個(gè)進(jìn)程了
status 里的內(nèi)存統(tǒng)計(jì)用的 memory_get_usage(),有些內(nèi)存不會統(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)鍵是我看了代碼,真的沒有用靜態(tài)屬性 數(shù)組 方式一直往里面放數(shù)據(jù) , 使用靜態(tài)方法,調(diào)用第三方接口就這些,內(nèi)存嗚嗚漲