mysql佔用服務器cpu過高的原因以及解決辦法

排查方法 :

> mysql -uroot -p      #登陸數據庫

>********                    #輸入數據庫密碼

mysql> show processlist;             

show processlist 命令詳解:

processlist命令的輸出結果顯示了有哪些線程在運行,可以幫助識別出有問題的查詢語句。

 

+-----+-------------+--------------------+-------+---------+-------+----------------------------------+----------

| Id | User  | Host             | db    | Command | Time| State      | Info                                                                                            

+-----+-------------+--------------------+-------+---------+-------+----------------------------------+----------

|207|root  |192.168.0.20:51718 |mytest | Sleep     | 5     |          | NULL             

     先簡單說一下各列的含義和用途,第一列,id,不用說了吧,一個標識,你要kill一個語句的時候很有用。user列,顯示單前用戶,如果不是root,這個命令就只顯示你權限範圍內的sql語句。host列,顯示這個語句是從哪個ip的哪個端口上發出的。呵呵,可以用來追蹤出問題語句的用戶。db列,顯示這個進程目前連接的是哪個數據庫 。command列,顯示當前連接的執行的命令,一般就是休眠(sleep),查詢(query),連接(connect)。time列,此這個狀態持續的時間,單位是秒。state列,顯示使用當前連接的sql語句的狀態,很重要的列,後續會有所有的狀態的描述,請注意,state只是語句執行中的某一個狀態,一個sql語句,已查詢爲例,可能需要經過copying to tmp tableSorting resultSending data等狀態纔可以完成,info列,顯示這個sql語句,因爲長度有限,所以長的sql語句就顯示不全,但是一個判斷問題語句的重要依據。

常見問題 :

一般是睡眠連接過多,嚴重消耗mysql服務器資源(主要是cpu, 內存),並可能導致mysql崩潰。

解決辦法 :

mysql的配置my.ini文件中,有一項: 

wait_timeout, 即可設置睡眠連接超時秒數,如果某個連接超時,會被mysql自然終止。 

wait_timeout過大有弊端,其體現就是MySQL裏大量的SLEEP進程無法及時釋放,拖累系統性能,不過也不能把這個指設置的過小,否則你可能會遭遇到“MySQL has gone away”之類的問題,通常來說,我覺得把wait_timeout設置爲10是個不錯的選擇,但某些情況下可能也會出問題,比如說有一個CRON腳本,其中兩次SQL查詢的間隔時間大於10秒的話,那麼這個設置就有問題了(當然,這也不是不能解決的問題,你可以在程序裏時不時mysql_ping一下,以便服務器知道你還活着,重新計算wait_timeout時間):

mysql> show global variables like 'wait_timeout'; 

+----------------------------+-------+ 

| Variable_name              | Value | 

+----------------------------+-------+ 

| wait_timeout               | 120    | 

+----------------------------+-------+

mysql> set global wait_timeout=20;

至此,mysql佔用cpu下降了--

****看此文章了給我指明瞭debug的根源。。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章