PHP小機(jī)器解決高用戶量訪問瓶頸的思路

項(xiàng)目背景:

一個(gè)通過微信網(wǎng)頁訪問在線答題的功能 ,目標(biāo)用戶覆蓋江西全省大中小學(xué)生。
阿里云服務(wù)器性能:
CPU: 2核 內(nèi)存:4 GB 帶寬:3Mbps,環(huán)境: LAMP

已經(jīng)完成的功能:

1. 微信授權(quán)
2. 隨機(jī)篩選 30 道題輸出
3. 前端頁面單選的交互
4. 記錄答案提交的數(shù)據(jù)(答對(duì)題目、時(shí)間)
5. 計(jì)算在同學(xué)校同年級(jí)的排名

考慮到的優(yōu)化:

1. 不是每個(gè)人都是隨機(jī)考題,考慮到參與人數(shù)眾多,題庫也才 50道題,50抽30,做相同的考題的幾率還是挺高的,順便就控制在一個(gè)時(shí)間周期內(nèi)的考題一樣,不重復(fù)那數(shù)據(jù);所以就第一個(gè)用戶訪問獲取到 30 道題后先得到考卷數(shù)據(jù),存入本地文件,5分鐘有效,超時(shí)重新生成考卷;
2. 靜態(tài)文件都通過cdn服務(wù)訪問

一開始用戶增加上去了,服務(wù)器的Mysql 就%CPU 爆表, 130% 以上都有

第一步優(yōu)化:

1. 高峰人數(shù)要找到同年級(jí)的排名比較耗時(shí)和沒有太多實(shí)際意義,看的人其實(shí)可能不多,就臨時(shí)先取消這個(gè)模塊展示;
2. Mysql 表增加索引(效果非常顯著)
優(yōu)化前后對(duì)比--看中間的高峰

但是好景不長,6日開始,就Mysql 又爆表了,想著,該加的索引都加上了,不知道因?yàn)槭裁磳?dǎo)致(其實(shí)這個(gè)時(shí)候就算有遺漏也不好發(fā)現(xiàn))

7天內(nèi)的CPU使用率

這個(gè)時(shí)候Mysql 的慢查詢功能就可以擺上用場(chǎng)了。

netstat -na|grep -i "80"|wc -l
1562

top 查詢 Mysql 占用最多CPU的資源,那肯定是因?yàn)橥瑫r(shí)在線的用戶查詢可能因?yàn)樽枞麑?dǎo)致的大堵車,目前最重要的是要定位出來是什么的語句導(dǎo)致的。

慢查詢有什么用?

它能記錄下所有執(zhí)行超過long_query_time時(shí)間的SQL語句, 幫你找到執(zhí)行慢的SQL, 方便我們對(duì)這些SQL進(jìn)行優(yōu)化.

如何開啟慢查詢?

首先我們先查看MYSQL服務(wù)器的慢查詢狀態(tài)是否開啟.執(zhí)行如下命令:



我們可以看到當(dāng)前l(fā)og_slow_queries狀態(tài)為OFF, 說明當(dāng)前并沒有開啟慢查詢.
開啟慢查詢非常簡單, 操作如下:
Linux下找到mysql的配置文件my.ini, 在mysqld下方加入慢查詢的配置語句(注意:一定要在[mysqld]下的下方加入)



log-slow-queries: 代表MYSQL慢查詢的日志存儲(chǔ)目錄, 此目錄文件一定要有寫權(quán)限;Windows下需要寫絕對(duì)路徑,如:log-slow-queries="C:/Program Files/MySQL/MySQL Server 5.5/log/mysql-slow.log"
long_query_time: 最長執(zhí)行時(shí)間. (如圖, MSYQL將記錄下所有執(zhí)行時(shí)間超過2s的SQL語句, 此處為測(cè)試時(shí)間, 時(shí)間不應(yīng)太小最好在5-10秒之內(nèi), 當(dāng)然可以根據(jù)自己的標(biāo)準(zhǔn)而定);

配置好以后重新啟動(dòng)一個(gè)MYSQL服務(wù)


然后查看log發(fā)現(xiàn)了問題
SELECT * FROM `fd_members` WHERE `unionid` = 'oh6a0s65Oh8rTtFLoW9Pf0***' LIMIT 1;
都是因?yàn)檫@樣類似的語句記錄,說明這條查詢非常久(表里邊大概有30多萬條記錄),測(cè)一下,當(dāng)時(shí)候服務(wù)器查詢要13秒左右,坑爹的,那怪堵車那么嚴(yán)重。
然后再看數(shù)據(jù)庫表結(jié)構(gòu),原來members 表的uniond 沒有加入索引,趕快補(bǔ)充上了,然后再測(cè)試,就變成了 10ms 不到就出來了。這差別是 千倍數(shù)呀??!
開了后的效果,如下,立竿見影
image.png

晚上統(tǒng)計(jì)了一下,今天一共來的人數(shù),在Nginx 的地方還有好多要優(yōu)化的地方

人數(shù)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容