直接用MYSQL庫(kù),肯定是阻塞方式的,就是說(shuō),你的SQL語(yǔ)句,網(wǎng)絡(luò)傳到服務(wù)器,服務(wù)器執(zhí)行完,再把結(jié)果通過(guò)網(wǎng)絡(luò)發(fā)回來(lái),你調(diào)用的接口才會(huì)返回;所以,崩潰的話,肯定是自己代碼有BUG的了,不會(huì)是異步導(dǎo)致的;
秀峰網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)公司!從網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開(kāi)發(fā)、APP開(kāi)發(fā)、成都響應(yīng)式網(wǎng)站建設(shè)公司等網(wǎng)站項(xiàng)目制作,到程序開(kāi)發(fā),運(yùn)營(yíng)維護(hù)。創(chuàng)新互聯(lián)公司成立于2013年到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來(lái)保證我們的工作的順利進(jìn)行。專(zhuān)注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)公司。
mysql有最大連接數(shù)設(shè)置,如果,沒(méi)有關(guān)閉連接,會(huì)導(dǎo)致阻塞。
可以使用下面命令查看最大連接數(shù):
show variables like '%max_connections%';
查看當(dāng)前mysql連接數(shù):
show processlist;
產(chǎn)生死鎖的四個(gè)必要條件:
(1) 互斥條件:一個(gè)資源每次只能被一個(gè)進(jìn)程使用。
(2) 請(qǐng)求與保持條件:一個(gè)進(jìn)程因請(qǐng)求資源而阻塞時(shí),對(duì)已獲得的資源保持不放。
(3) 不剝奪條件:進(jìn)程已獲得的資源,在末使用完之前,不能強(qiáng)行剝奪。
(4) 循環(huán)等待條件:若干進(jìn)程之間形成一種頭尾相接的循環(huán)等待資源關(guān)系。
這四個(gè)條件是死鎖的必要條件,只要系統(tǒng)發(fā)生死鎖,這些條件必然成立,而只要上述條件之
一不滿足,就不會(huì)發(fā)生死鎖。
現(xiàn)象是,系統(tǒng)里的java連接mysql超時(shí)了,
于是去mysql的機(jī)器,查看/var/log/messages日志,查對(duì)應(yīng)的時(shí)間點(diǎn)的情況
發(fā)現(xiàn)mysql被阻塞了blocked for more than 120 seconds,mysql的io非常之高,用top查看系統(tǒng)的負(fù)載也到達(dá)了50的樣子
用mpstat查看cpu情況
好明顯,都在等io
用iostat查看io情況,%util的值,一直在80%,99%之間變化
以為磁盤(pán)有問(wèn)題,用dd測(cè)下速看看
從上面的結(jié)果看,也還好,沒(méi)問(wèn)題
以為可能磁盤(pán)有壞道,用下面命令也掃了一遍,沒(méi)問(wèn)題
結(jié)果也沒(méi)有壞的塊,這個(gè)過(guò)程,很耗時(shí)。
用show processlist命令查看mysql正在忙著什么,一看,也沒(méi)什么任務(wù)在執(zhí)行的
想看看mysql,研究寫(xiě)哪個(gè)文件時(shí),最耗時(shí)的
從上面結(jié)果來(lái)看,xxl_job是最耗時(shí)的。知道點(diǎn)眉目了,因?yàn)楣镜亩〞r(shí)任務(wù)是用的xxljob,定時(shí)任務(wù)里,有每幾秒執(zhí)行的任務(wù),我猜它的日志記錄一定很大,于是查看一下
我的天,這個(gè)表的記錄有千萬(wàn)?。?!這些記錄,沒(méi)做定時(shí)任務(wù)來(lái)清理,由于都是一些沒(méi)用的記錄,所以這個(gè)表的數(shù)據(jù)我全清了
清了之后,再用iostat查看
%util一下子就降下來(lái)了,用iotop查看mysql進(jìn)程的io也下降了
cpu的iowait也下降了
定義一個(gè)事件,讓mysql定時(shí)清理30天前的日志記錄
記錄一下,希望對(duì)有需要的朋友也起一點(diǎn)提示