這里寫描述
整個worker項目代碼沒起一個timers,但是運行一晚上后,php work.php status出現(xiàn)了大量的timers,而且connections也顯示異常,應(yīng)該就1000多玩家,但是連接顯示4000多
下面是另一個服務(wù)器的woker進程就很正常
netstat -nt | grep 39002 | grep ESTABLISHED
能看到操作系統(tǒng)39002連接情況。
php start.php connections
能看到workerman統(tǒng)計的連接情況。
使用一些功能或者組件會啟動定時器,例如使用了AsyncTcpConnection,設(shè)置了reconnect()定時重連,連接斷開后會產(chǎn)生一個定時器,連接成功后刪除定時器。使用了一些組件或功能可能會產(chǎn)生定時器。
如果你要記錄哪里使用了定時器,需要自己記錄日志,
例如 vendor/workerman/workerman/src/Events/Swoole.php 里的
public function delay(float $delay, callable $func, array $args = []): int
{
file_put_contents('/tmp/timer.log', (new \Exception('delay')) . "\n", FILE_APPEND);
public function repeat(float $interval, callable $func, array $args = []): int
{
file_put_contents('/tmp/timer.log', (new \Exception('repeat')) . "\n", FILE_APPEND);
websocket業(yè)務(wù),應(yīng)該在服務(wù)端設(shè)置一個定時器,定時清理不活躍連接,例如定時關(guān)閉60秒不活躍的連接。
前端需要保證至少每隔59秒通訊一次保持連接。
如果沒有這個機制,會導(dǎo)致服務(wù)端會積累一些無效的連接無法及時清理,例如手機用戶關(guān)閉了網(wǎng)絡(luò)、關(guān)機、網(wǎng)絡(luò)切換、進入無信號區(qū)域等,這種極端斷網(wǎng)情況服務(wù)端操作系統(tǒng)是無法及時感知的,需要定時通訊感知。
如果兩個服務(wù)器的代碼和用戶量一樣,那么服務(wù)器一本身有點問題,它的負載比服務(wù)器2高很多。
需要用top等命令找出哪些進程占用cpu高,是否是workerman進程。
如果是workerman進程可以用 strace -ttp pid
命令查看進程在執(zhí)行哪些系統(tǒng)調(diào)用,導(dǎo)致cpu很高。
如果你確認(rèn)兩個服務(wù)器用戶量一樣,代碼運行環(huán)境都一樣,那么服務(wù)器一負載比服務(wù)器二高就一定還是有不同。
你需要找到不同的地方,例如服務(wù)器一多運行了一些服務(wù)如mysql等。
例如服務(wù)器一帶寬遇到瓶頸,服務(wù)器內(nèi)核沒有優(yōu)化等原因。
websocket業(yè)務(wù)注意事項這里,我使用的是gateway是不是就不需要用定時任務(wù)去關(guān)閉不活躍連接了,在gate進程中有個心跳判斷并關(guān)閉的
我的配置是pingInterval=14, pingNotResponseLimit=1,客戶端每6s會有一個心跳,現(xiàn)在的問題是,每過一段時間,有時候24小時,有時候12小時,gateway status 就會顯示有超過實際連接幾倍的連接數(shù),而且本來每個進程只有3個timer的會變成有幾百個timer,