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

死循環(huán)問題

Endy

早上發(fā)現(xiàn)Mac風扇狂轉(zhuǎn),看了一下活動監(jiān)視器,竟然是PHP進程占用了接近100%的CPU,這是以前從未發(fā)生過的。
ps -ef|grep php看了一下,用于web應用的是php-fpm,php啟動的進程只有workerman的幾個businessworker
重啟workerman,CPU使用降下去了,問題解決。
然后開始查看原因,打開日志,竟然loading了很久, ll看了一下,日志大小達到2GB。
日志從末尾往上,99%都是一句打?。?/p>

worker[Businessworker:xxxxx] exit with status 9

xxxxx為不停分配的進程號,但是每一個都剛分配好就kill掉了
繼續(xù)往上查看日志,發(fā)現(xiàn)一個DB異常,error code: 1927 ('Connection was killed')
因為我在Events里需要bindUid,所以用到了DB查詢,MariaDB主動斷開連接造成了這個異常(具體原因還沒有去詳細查找,谷歌了一些結果說可能是因為并發(fā)造成死鎖,但是這個地方只有簡單的讀,一個SELECT操作并沒有加鎖,回頭再仔細看看,先解決死循環(huán)的主要矛盾),所以復現(xiàn)也很容易,在事件循環(huán)時故意關閉數(shù)據(jù)庫服務即可。

2612 3 0
3個回答

小七他哥

看看這樣可不可以解決:

$this->sql = $sql;
        $this->result = mysqli_query($this->conn, $this->sql);

        //參考:https://wenda.workerman.net/question/1793
        if ($this->getErrorNo() == 2006) {
            $this->initConnection();
            $this->result = mysqli_query($this->conn, $this->sql);
            //注意這里不能再做有關于數(shù)據(jù)庫的操作,否則會發(fā)生死循環(huán)
            wlog('數(shù)據(jù)庫鏈接失效重連');
        }

主要就是在 mysqli_query 或者 mysql_query 這一步下面加個檢測當前有沒有錯誤號為 2006 的,如果有錯誤就重連一遍數(shù)據(jù)庫。

  • 暫無評論
抽不完的寂寞

連數(shù)據(jù)庫放在onWorkerStart里試下,不要在onWorkerStart運行前連數(shù)據(jù)庫

  • 暫無評論
Endy

連接數(shù)據(jù)庫是放在Gateway的onMessage里,worker早就啟動了。
worker進程和數(shù)據(jù)庫產(chǎn)生了連接,連接過程中,數(shù)據(jù)庫突然發(fā)生異常斷掉連接。

1、沒有弄明白這個數(shù)據(jù)庫斷開的異常為什么會kill掉worker
2、為什么新fork的worker立即獲得了SIGKILL的信號導致不停fork不停kill

  • 小七他哥 2021-07-20

    看源代碼吧,很多地方都寫的 exit(250); 這句,這里就是被kill 了

  • Endy 2021-07-20

    不是在exit(250)被kill的,這句之前都會有l(wèi)og,但日志里面就只有exit with status 9,我試了直接從命令行kill -9worker進程,也不會產(chǎn)生反復fork反復kill的死循環(huán)。

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