早上發(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ù)庫服務即可。
看看這樣可不可以解決:
$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ù)庫是放在Gateway的onMessage里,worker早就啟動了。
worker進程和數(shù)據(jù)庫產(chǎn)生了連接,連接過程中,數(shù)據(jù)庫突然發(fā)生異常斷掉連接。
1、沒有弄明白這個數(shù)據(jù)庫斷開的異常為什么會kill掉worker
2、為什么新fork的worker立即獲得了SIGKILL的信號導致不停fork不停kill