天天看點

MYSQL的硬碟IO過高引起的CPU過高判斷

其實,為客戶提供相關日志,不就是rackspace主要作的事?

俺們以後也可以效仿的。不要去解決,而是協助客戶定位。

<a href="http://blog.const.net.cn/a/17275.htm">http://blog.const.net.cn/a/17275.htm</a>

上文的思路明顯的。

top指令 檢視伺服器負載,發現 mysql竟然百分之兩百的cpu,引起mysql 負載這麼高的原因,估計是索引問題和某些變态sql語句.

排查思路

1. 确定高負載的類型,top指令看負載高是cpu還是io。

2. mysql 下執行檢視目前的連接配接數與執行的sql 語句。

3. 檢查慢查詢日志,可能是慢查詢引起負載高。

4. 檢查硬體問題,是否磁盤故障問題造成的。

5. 檢查監控平台,對比此機器不同時間的負載。

~~~~~~~~~~~~~~~~~

記錄慢查詢 編輯mysql 配置檔案(my.cnf),在[mysqld]字段添加以下幾行:

log_slow_queries = /usr/local/mysql/var/slow_queries.log   #慢查詢日志路徑 

long_query_time = 10                                       #記錄sql查詢超過10s的語句 

log-queries-not-using-indexes = 1                          #記錄沒有使用索引的sql 

檢視慢查詢日志

tail /usr/local/mysql/var/slow_queries.log 

# time: 130305  9:48:13 

# user@host: biotherm[biotherm] @  [8.8.8.45] 

# query_time: 1294.881407  lock_time: 0.000179 rows_sent: 4  rows_examined: 1318033 

set timestamp=1363916893; 

select * from xxx_list where tid = '11xx'  and del = 0  order by  id desc  limit 0, 4;  

4個參數 query_time: 0 lock_time: 0 rows_sent: 1 rows_examined: 54 分别意思為:查詢時間 鎖定時間 查詢結果行數 掃描行數,主要看掃描行數多的語句,然後去資料庫加上對應的索引,再優化下變态的sql 語句。

極端情況kill sql程序

找出占用cpu時間過長的sql,在mysql 下執行如下指令: 

show processlist; 

确定後一條sql處于query狀态,且time時間過長,鎖定它的id,執行如下指令: 

kill query  269815764;  

注意:殺死 sql程序,可能導緻資料丢失,是以執行前要衡量資料的重要性。

MYSQL的硬碟IO過高引起的CPU過高判斷