MYSQL CPU 占用 100% 的現(xiàn)象描述早上幫朋友一臺服務(wù)器解決了 Mysql cpu 占用 100% 的問題。稍整理了一下,將經(jīng)驗記錄在這篇文章里:《解決一個 MySQL 服務(wù)器進程 CPU 占用 100%的技術(shù)筆記》 http://www./weekly/20070307.htm 朋友主機(Windows 2003 + IIS + PHP + MYSQL )近來 MySQL 服務(wù)進程 (mysqld-nt.exe) CPU 占用率總為 100% 高居不下。此主機有10個左右的 database, 分別給十個網(wǎng)站調(diào)用。據(jù)朋友測試,導(dǎo)致 mysqld-nt.exe cpu 占用奇高的是網(wǎng)站A,一旦在 IIS 中將此網(wǎng)站停止服務(wù),CPU 占用就降下來了。一啟用,則馬上上升。 MYSQL CPU 占用 100% 的解決過程全文記錄: http://www./weekly/20070307.htm 今天早上仔細(xì)檢查了一下。目前此網(wǎng)站的七日平均日 IP 為2000,PageView 為 3萬左右。網(wǎng)站A 用的 database 目前有39個表,記錄數(shù) 60.1萬條,占空間 45MB。按這個數(shù)據(jù),MySQL 不可能占用這么高的資源。 于是在服務(wù)器上運行命令,將 mysql 當(dāng)前的環(huán)境變量輸出到文件 output.txt: d:\web\mysql> mysqld.exe --help >output.txt 發(fā)現(xiàn) tmp_table_size 的值是默認(rèn)的 32M,于是修改 My.ini, 將 tmp_table_size 賦值到 200M: d:\web\mysql> notepad c:\windows\my.ini [mysqld] tmp_table_size=200M 然后重啟 MySQL 服務(wù)。CPU 占用有輕微下降,以前的CPU 占用波形圖是 100% 一根直線,現(xiàn)在則在 97%~100%之間起伏。這表明調(diào)整 tmp_table_size 參數(shù)對 MYSQL 性能提升有改善作用。但問題還沒有完全解決。 于是進入 mysql 的 shell 命令行,調(diào)用 show processlist, 查看當(dāng)前 mysql 使用頻繁的 sql 語句: mysql> show processlist; 反復(fù)調(diào)用此命令,發(fā)現(xiàn)網(wǎng)站 A 的兩個 SQL 語句經(jīng)常在 process list 中出現(xiàn),其語法如下: SELECT t1.pid, t2.userid, t3.count, t1.date FROM _mydata AS t1 LEFT JOIN _myuser AS t3 ON t1.userid=t3.userid LEFT JOIN _mydata_body AS t2 ON t1.pid=t3.pid ORDER BY t1.pid LIMIT 0,15 調(diào)用 show columns 檢查這三個表的結(jié)構(gòu) : mysql> show columns from _myuser; mysql> show columns from _mydata; mysql> show columns from _mydata_body; 終于發(fā)現(xiàn)了問題所在:_mydata 表,只根據(jù) pid 建立了一個 primary key,但并沒有為 userid 建立索引。而在這個 SQL 語句的第一個 LEFT JOIN ON 子句中: LEFT JOIN _myuser AS t3 ON t1.userid=t3.userid _mydata 的 userid 被參與了條件比較運算。于是我為給 _mydata 表根據(jù)字段 userid 建立了一個索引: mysql> ALTER TABLE `_mydata` ADD INDEX ( `userid` ) 建立此索引之后,CPU 馬上降到了 80% 左右。看到找到了問題所在,于是檢查另一個反復(fù)出現(xiàn)在 show processlist 中的 sql 語句: SELECT COUNT(*) FROM _mydata AS t1, _mydata_key AS t2 WHERE t1.pid=t2.pid and t2.keywords = '孔雀' 經(jīng)檢查 _mydata_key 表的結(jié)構(gòu),發(fā)現(xiàn)它只為 pid 建了了 primary key, 沒有為 keywords 建立 index。_mydata_key 目前有 33 萬條記錄,在沒有索引的情況下對33萬條記錄進行文本檢索匹配,不耗費大量的 cpu 時間才怪??磥砭褪轻槍@個表的檢索出問題了。于是同樣為 _mydata_key 表根據(jù)字段 keywords 加上索引: mysql> ALTER TABLE `_mydata_key` ADD INDEX ( `keywords` ) 建立此索引之后,CPU立刻降了下來,在 50%~70%之間震蕩。 再次調(diào)用 show prosslist,網(wǎng)站A 的sql 調(diào)用就很少出現(xiàn)在結(jié)果列表中了。但發(fā)現(xiàn)此主機運行了幾個 Discuz 的論壇程序, Discuz 論壇的好幾個表也存在著這個問題。于是順手一并解決,cpu占用再次降下來了。(2007.07.09 附注:關(guān)于 discuz 論壇的具體優(yōu)化過程,我后來另寫了一篇文章,詳見:千萬級記錄的 Discuz! 論壇導(dǎo)致 MySQL CPU 100% 的 優(yōu)化筆記 http://www./dev/server/20070701-discuz-mysql-cpu-100-optimize.htm) 解決 MYSQL CPU 占用 100% 的經(jīng)驗總結(jié)http://www./weekly/20070307.htm
|
|