直播間,workman的內(nèi)存約來越大,自己不會釋放,一直會到服務(wù)器內(nèi)存滿了為止!請教大佬們,這個(gè)該怎么處理呢?
IMWorker可能業(yè)務(wù)有內(nèi)存泄漏,需要自己定位下代碼
噢,IMWorker 隨著人數(shù)占用內(nèi)存越來越大,我把php.ini memory_limit 設(shè)置成8G,服務(wù)器內(nèi)存是16G,現(xiàn)在有6000人數(shù),隨著人數(shù)增長,內(nèi)存會一直不夠用,我想問下,業(yè)務(wù)已經(jīng)優(yōu)化了,沒有什么可在優(yōu)化的了,現(xiàn)在該怎么處理呀?其實(shí)最好的可以類似重啟一樣的操作,可以把占用的內(nèi)存又重新歸0,這樣是最好的了
內(nèi)存泄漏一般是長周期數(shù)組里無限添加元素導(dǎo)致的。
如果實(shí)在定位不到業(yè)務(wù)內(nèi)存泄漏的代碼,定時(shí)reload也可以。像根據(jù)內(nèi)存占用定時(shí)執(zhí)行某個(gè)程序問webman/ai就好,下面是AI回復(fù)
問
寫一個(gè)sh腳本,服務(wù)器內(nèi)存使用量大于90%時(shí),執(zhí)行 php /your/path/start.php reload。利用crontab 每分鐘執(zhí)行一次這個(gè)腳本。
AI回復(fù)
可以按照以下步驟設(shè)置定時(shí)任務(wù)來每分鐘執(zhí)行該腳本:
check_memory.sh
,并將以下內(nèi)容復(fù)制到文件中:#!/bin/bash
# 獲取當(dāng)前內(nèi)存使用率
memory_usage=$(free | awk '/Mem/{printf("%.2f"), $3/$2 * 100}')
# 判斷內(nèi)存使用率是否大于90%
if (( $(echo "$memory_usage > 90" | bc -l) )); then
# 執(zhí)行 reload 命令
php /your/path/start.php reload
fi
chmod +x check_memory.sh
crontab -e
* * * * * /path/to/check_memory.sh
請將/path/to/check_memory.sh
替換為實(shí)際的.sh文件路徑。
現(xiàn)在,該腳本將會每分鐘執(zhí)行一次,并在服務(wù)器內(nèi)存使用量大于90%時(shí)執(zhí)行php /your/path/start.php reload
命令。
執(zhí)行這個(gè)命令 php start.php reload
之后報(bào)這個(gè)錯(cuò)誤
SendBufferToWorker fail. The connections between Gateway and BusinessWorker are not ready.
我們模擬3個(gè)賬號在直播間一直發(fā)消息,發(fā)1萬條消息,imworker占用很少內(nèi)存,真實(shí)線上環(huán)境6000人同時(shí)在線,有人發(fā)送消息,imworker內(nèi)存就會累積很快,30分鐘就能達(dá)到7G