早上發(fā)現(xiàn)Mac風(fēng)扇狂轉(zhuǎn),看了一下活動(dòng)監(jiān)視器,竟然是PHP進(jìn)程占用了接近100%的CPU,這是以前從未發(fā)生過(guò)的。
ps -ef|grep php
看了一下,用于web應(yīng)用的是php-fpm,php啟動(dòng)的進(jìn)程只有workerman的幾個(gè)businessworker
重啟workerman,CPU使用降下去了,問(wèn)題解決。
然后開(kāi)始查看原因,打開(kāi)日志,竟然loading了很久, ll看了一下,日志大小達(dá)到2GB。
日志從末尾往上,99%都是一句打?。?/p>
worker[Businessworker:xxxxx] exit with status 9
xxxxx為不停分配的進(jìn)程號(hào),但是每一個(gè)都剛分配好就kill掉了
繼續(xù)往上查看日志,發(fā)現(xiàn)一個(gè)DB異常,error code: 1927 ('Connection was killed')
因?yàn)槲以贓vents里需要bindUid,所以用到了DB查詢(xún),MariaDB主動(dòng)斷開(kāi)連接造成了這個(gè)異常(具體原因還沒(méi)有去詳細(xì)查找,谷歌了一些結(jié)果說(shuō)可能是因?yàn)椴l(fā)造成死鎖,但是這個(gè)地方只有簡(jiǎn)單的讀,一個(gè)SELECT操作并沒(méi)有加鎖,回頭再仔細(xì)看看,先解決死循環(huán)的主要矛盾),所以復(fù)現(xiàn)也很容易,在事件循環(huán)時(shí)故意關(guān)閉數(shù)據(jù)庫(kù)服務(wù)即可。
看看這樣可不可以解決:
$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);
//注意這里不能再做有關(guān)于數(shù)據(jù)庫(kù)的操作,否則會(huì)發(fā)生死循環(huán)
wlog('數(shù)據(jù)庫(kù)鏈接失效重連');
}
主要就是在 mysqli_query 或者 mysql_query 這一步下面加個(gè)檢測(cè)當(dāng)前有沒(méi)有錯(cuò)誤號(hào)為 2006 的,如果有錯(cuò)誤就重連一遍數(shù)據(jù)庫(kù)。
連數(shù)據(jù)庫(kù)放在onWorkerStart里試下,不要在onWorkerStart運(yùn)行前連數(shù)據(jù)庫(kù)
連接數(shù)據(jù)庫(kù)是放在Gateway的onMessage里,worker早就啟動(dòng)了。
worker進(jìn)程和數(shù)據(jù)庫(kù)產(chǎn)生了連接,連接過(guò)程中,數(shù)據(jù)庫(kù)突然發(fā)生異常斷掉連接。
1、沒(méi)有弄明白這個(gè)數(shù)據(jù)庫(kù)斷開(kāi)的異常為什么會(huì)kill掉worker
2、為什么新fork的worker立即獲得了SIGKILL的信號(hào)導(dǎo)致不停fork不停kill