今天上班例行的查看了下服務器的運行情況,發現服務器特卡,是mysqld這個進程佔用CPU到了99%致使的。php
比較好奇是那個程序在使用mysql致使cpu這麼高的,經過show processlist命令查看了當前正在執行的sql語句,從而定位到了對應的程序,發現代碼中有一個死循環在不停的查詢致使cpu佔用99%,緣由找到了問題就好解決了。mysql
這裏簡單的記錄一下processlist的用法:sql
processlist 命令的輸出結果顯示了有哪些線程在運行,能夠幫助識別出有問題的查詢語句,兩種方式使用這個命令。數據庫
1. 進入 mysql/bin 目錄下輸入 mysqladmin processlist;服務器
2. 啓動 mysql ,輸入 show processlist;.net
若是有 SUPER 權限,則能夠看到所有的線程,不然,只能看到本身發起的線程(這是指,當前對應的 MySQL 賬戶運行的線程)。線程
獲得數據形式以下(只截取了三 條):進程
mysql> show processlist;ip
+-----+-------------+--------------------+-------+---------+-------+----------------------------------+----------ssl
| Id | User | Host | db | Command | Time| State | Info
+-----+-------------+--------------------+-------+---------+-------+----------------------------------+----------
|207|root |192.168.0.20:51718 |mytest | Sleep | 5 | | NULL
|208|root |192.168.0.20:51719 |mytest | Sleep | 5 | | NULL
|220|root |192.168.0.20:51731 |mytest |Query | 84 | Locked |
select bookname,culture,value,type from book where id=001
先簡單說一下各列的含義和用途,第一列, id , 不用說了吧,一個標識,你要 kill 一個語句的時候頗有用。 user列, 顯示單前用戶,若是不是 root ,這個命令就只顯示你權限範圍內的 sql 語 句。 host 列,顯示這個語句是從哪一個 ip 的哪 個端口上發出的。呵呵,能夠用來追蹤出問題語句的用戶。 db 列,顯示這個進程目前鏈接的是 哪一個數據庫 。command 列,顯示當前鏈接的執行的命令,通常就是休眠( sleep ),查詢( query ),鏈接( connect )。 time 列,此這個狀態持續的時間,單位是秒。 state 列,顯示使用當前鏈接的 sql 語句的狀態,很重要的列,後續會有全部的狀態的描述,請注意, state 只是語句執行中的某一個狀態,一個 sql 語 句,已查詢爲例,可能須要通過 copying to tmp table ,Sorting result , Sending data 等狀態才 能夠完成, info 列,顯示這個 sql 語 句,由於長度有限,因此長的 sql 語句就顯示不全,可是一個判斷問題語句的重要依據。
當MySQL繁忙的時候運行show processlist,會發現有不少行輸出,每行輸出對應一個MySQL鏈接。怎麼診斷髮起鏈接的進程是哪一個?它當前正在幹嗎呢?
首先,須要經過TCP Socket而不是Unix Socket鏈接MySQL,這樣在show processlist的輸出中就會有來源端口號。以下,
mysql> show processlist;
+——–+——–+—————–+——+———+——+——-+——————+
| Id | User | Host | db | Command | Time | State | Info |
+——–+——–+—————–+——+———+——+——-+——————+
| 277801 | mydbuser | localhost:35558 | mydb | Sleep | 1 | | NULL |
| 277804 | mydbuser | localhost:35561 | mydb | Sleep | 1 | | NULL |
| 277805 | mydbuser | localhost:35562 | mydb | Sleep | 0 | | NULL |
+——–+——–+—————–+——+———+——+——-+——————+
在Host列有來源IP和端口號,而後咱們從鏈接機器查看端口號是誰打開的,
[root@localhost ~]# netstat -ntp | grep 35558
… 124.115.0.68:35558 ESTABLISHED 18783/httpd
可知進程18783發起的MySQL鏈接來源端口是35558,而後就能夠用strace觀察這個進程了。若是是Apache的PHP腳本,還能夠 用proctitle模塊( http://pecl.php.net/package/proctitle/ )設置腳本的狀態信息。
lsof也能根據端口號顯示進程號,細節請參考手冊。