公司項(xiàng)目代碼比較老,運(yùn)行了很多年,存在很多坑。
最近遷移到aliyun都,因?yàn)榘⒗镌频呐渲貌桓?,mysql成為了瓶頸。
項(xiàng)目架構(gòu)是nginx做代理,請(qǐng)求交給php-fpm處理,php連接mysql處理業(yè)務(wù)。
最近一個(gè)前端頁(yè)訪(fǎng)問(wèn)量比較大,前端頁(yè)面有一個(gè)比較復(fù)雜的實(shí)時(shí)統(tǒng)計(jì),導(dǎo)致mysql服務(wù)器cpu直接100%了。
因?yàn)閙ysql卡住了,所有的php-fpm進(jìn)程與mysql保持著連接狀態(tài),傻傻的等待mysql響應(yīng)。
沒(méi)有多余的php-fpm來(lái)處理nginx新進(jìn)來(lái)的請(qǐng)求,導(dǎo)致前端頁(yè)面報(bào)502錯(cuò)誤。
我研究了一下,php連接mysql時(shí)可以設(shè)置MYSQL_OPT_READ_TIMEOUT參數(shù)來(lái)避免mysql因執(zhí)行慢長(zhǎng)時(shí)間不返回導(dǎo)致php-fpm進(jìn)程一直被占據(jù),無(wú)法處理新請(qǐng)求。
但是我們項(xiàng)目比較舊,使用的還是最老的mysql擴(kuò)展,不支持MYSQL_OPT_READ_TIMEOUT。
如果在php.ini里設(shè)置mysqlnd.net_read_timeout 會(huì)影響全局(我們項(xiàng)目里很多cli方式運(yùn)行耗時(shí)任務(wù))。
有沒(méi)有一種mysql的代理或者網(wǎng)關(guān)組件,能控制php等待mysql的返回時(shí)間?
比如實(shí)現(xiàn)php發(fā)送sql給mysql,mysql在20s內(nèi)沒(méi)有返回,php直接斷開(kāi)與mysql的連接
卡在數(shù)據(jù)庫(kù),我感覺(jué)用webman也是一樣的等待mysql tcp的數(shù)據(jù)回復(fù),畢竟workerman也是多進(jìn)程阻塞