国产+高潮+在线,国产 av 仑乱内谢,www国产亚洲精品久久,51国产偷自视频区视频,成人午夜精品网站在线观看

Timer執(zhí)行任務(wù)時間問題

jackyzhuo

// 使用定時器 0.01 秒執(zhí)行一次 Task::fun()
// 已知 Task::fun() 需要 0.1 秒 才執(zhí)行完畢
// 那該定時器是否會造成進程占用內(nèi)存越來越大?
Timer::add(0.01, );
?補充:
LOG中沒有任何報錯信息,進程也正常運行,只是最近有兩次內(nèi)存占用超過80%,重啟后就好了。所以正在查找原因。
?
程序原本用了while(true) {} 死循環(huán)來進行隊列消費者操作,看了官方文檔后,里面有說不能用死循環(huán),會造成進程狀態(tài)無法上報,無法正常stop, restart進程。所以修改成 Timer::add 的形式來實現(xiàn)。運行過程發(fā)現(xiàn)內(nèi)存占用特別大,用 php server.php status 查看是正常的,但是 ps -aux 可以查看到 Workerman server.php 的內(nèi)存占用85%以上了(服務(wù)器內(nèi)存32GB)。
?
所以提出這個疑問。
?

4500 2 0
2個回答

walkor 打賞

?
workerman的定時器本身沒有內(nèi)存泄漏。
?
我猜測是Task::fun()方法里占用了大量內(nèi)存。你可以這樣測試,開一個進程不載入任何其它代碼,只有一個定時器Timer::add(0.01, function(){usleep(100000);});,運行一段時間看下是否有占用大內(nèi)存的情況,如果沒有內(nèi)存超大占用則有可能是業(yè)務(wù)代碼問題。
?
反過來再寫一個test.php,不載入workerman框架的東西,只循環(huán)運行你的Task::fun()方法,類似
while(1) {
? ? usleep(1000);
? ??Task::fun()
}
看下這個進程占用的內(nèi)存是否越來越大。
?
還有下次有問題最好保留截圖并粘貼出來。一般php默認內(nèi)存限制是128M,不會到達占用上G的情況。

  • jackyzhuo 2019-03-25

    業(yè)務(wù)代碼應(yīng)該沒有問題,因為業(yè)務(wù)代碼已經(jīng)運行了很久。之前沒有過這種情況,但是之前因為用while死循環(huán),所以無法正常restart,需要kill掉進程。近期改成Timer,0.01秒進行一次隊列pop。然后出現(xiàn)了該問題2次,但是每次重新重啟后就正常了。

jackyzhuo

[attach]1860[/attach]
謝謝你的回答,這是當時的截圖。
你所說的測試方法我這邊測試過,都沒有問題,所以才有疑惑在這里提出。
服務(wù)器設(shè)置PHP的內(nèi)存限制是128M,但是服務(wù)器PHP的內(nèi)存占用莫名特別高。暫時還沒找到原因,再次謝謝你的回答。
?

  • walkor 2019-03-25

    如果php默認內(nèi)存限制128M沒有改過,實際占用內(nèi)存遠超限制,感覺像是某個擴展有內(nèi)存泄漏php無法檢測到,所以內(nèi)存越來越大。

  • jackyzhuo 2019-03-29

    明白,謝謝你的回答。

年代過于久遠,無法發(fā)表回答
??