本文主要和大家介紹了mysql服務器線程數的查看方法,結合實例形式分析了mysql線程數查看的相關命令、配置、參數及相關使用技巧,需要的朋友可以參考下,希望能幫助到大家。
mysql重啟命令:
/etc/init.d/mysql?restart
MySQL服務器的線程數需要在一個合理的范圍之內,這樣才能保證MySQL服務器健康平穩地運行。Threads_created表示創建過的線程數,通過查看Threads_created就可以查看MySQL服務器的進程狀態。
mysql>?show?global?status?like?'Thread%'; +-------------------+-------+ |?Variable_name?|?Value?| +-------------------+-------+ |?Threads_cached?|?46?| |?Threads_connected?|?2?| |?Threads_created?|?570?| |?Threads_running?|?1?| +-------------------+-------+
如果我們在MySQL服務器配置文件中設置了thread_cache_size,當客戶端斷開之后,服務器處理此客戶的線程將會緩存起來以響應下一個客戶而不是銷毀(前提是緩存數未達上限)。
Threads_created表示創建過的線程數,如果發現Threads_created值過大的話,表明MySQL服務器一直在創建線程,這也是比較耗資源,可以適當增加配置文件中thread_cache_size值,查詢服務器
thread_cache_size配置:
mysql>?show?variables?like?'thread_cache_size'; +-------------------+-------+ |?Variable_name?|?Value?| +-------------------+-------+ |?thread_cache_size?|?64?| +-------------------+-------+
示例中的服務器還是挺健康的。
解析MySQL與連接數相關的幾個參數
MySQL的variables和status是管理維護的利器,就類似oracle的spfile和v$表。
MySQL通過系統變量記錄很多配置信息,比如最大連接數max_connections:
mysql>?show?variables?like?'%connect%'; +--------------------------+-----------------+ |?Variable_name?|?Value?| +--------------------------+-----------------+ |?character_set_connection?|?utf8?| |?collation_connection?|?utf8_general_ci?| |?connect_timeout?|?10?| |?init_connect?|?SET?NAMES?utf8?| |?max_connect_errors?|?10?| |?max_connections?|?200?| |?max_user_connections?|?0?| +--------------------------+-----------------+ 7?rows?in?set?(0.00?sec)
這 個參數是指同時連接上來的客戶端數量,在5.1版本里默認的值是151,那么實際支持的連接數是這個值加一,也就是152,因為要為系統管理員登錄上來查 看信息保留一個連接。這個參數的大小要綜合很多因素來考慮,比如使用的平臺所支持的線程庫數量(windows只能支持到2048)、服務器的配置(特別 是內存大小)、每個連接占用資源(內存和負載)的多少、系統需要的響應時間等。一般linux系統支持到幾百并發是沒有任何問題的。可以在global或 Session范圍內修改這個參數:
mysql>?set?global?max_connections=151; Query?OK,?0?rows?affected?(0.00?sec) mysql>?show?variables?like?'%connect%'; +--------------------------+-----------------+ |?Variable_name?|?Value?| +--------------------------+-----------------+ |?character_set_connection?|?utf8?| |?collation_connection?|?utf8_general_ci?| |?connect_timeout?|?10?| |?init_connect?|?SET?NAMES?utf8?| |?max_connect_errors?|?10?| |?max_connections?|?151?| |?max_user_connections?|?0?| +--------------------------+-----------------+ 7?rows?in?set?(0.00?sec)
但是要注意的是,連接數的增加會帶來很多連鎖反應,需要在實際中避免由此產生的負面影響。
首先我們看一下status的輸出:
mysql>?status -------------- mysql?Ver?14.14?Distrib?5.1.49,?for?pc-linux-gnu?(i686)?using?readline?5.1 Connection?id:?255260 Current?database:?mysql Current?user:?root@localhost SSL:?Not?in?use Current?pager:?stdout Using?outfile:?'' Using?delimiter:?; Server?version:?5.1.49-log?MySQL?Community?Server?(GPL) Protocol?version:?10 Connection:?Localhost?via?UNIX?socket Server?characterset:?utf8 Db?characterset:?utf8 Client?characterset:?utf8 Conn.?characterset:?utf8 UNIX?socket:?/var/lib/mysql/mysql.sock Uptime:?161?days?3?hours?42?min?38?sec Threads:?14?Questions:?160655492?Slow?queries:?71?Opens:?8124?Flush?tables:?3?Open?tables:?64?Queries?per?second?avg:?11.538 --------------
這 里有個Open tables輸出時64,這就是說當前數據庫打開的表的數量是64個,要注意的是這個64并不是實際的64個表,因為MySQL是多線程的系統,幾個不同 的并發連接可能打開同一個表,這就需要為不同的連接session分配獨立的內存空間來存儲這些信息以避免沖突。因此連接數的增加會導致MySQL需要的 文件描述符數目的增加。另外對于MyISAM表,還會建立一個共享的索引文件描述符。
那么在MySQL數據庫層面,有幾個系統參數決定了可同時打開的表的數量和要使用的文件描述符,那就是table_open_cache、max_tmp_tables和open_files_limit.
mysql>?show?variables?like?'table_open%'; +------------------+-------+ |?Variable_name??|?Value?| +------------------+-------+ |?table_open_cache?|?64??| +------------------+-------+ 1?row?in?set?(0.00?sec)
這 里的table_open_cache 參數是64,這就是說所有的MySQL線程一共能同時打開64個表,我們可以搜集系統的打開表的數量的歷史記錄和這個參數來對比,決定是否要增加這個參數 的大小。查看當前的打開表的數目的辦法一個是用上邊提到過的status命令,另外可以直接查詢這個系統變量的值:
mysql>?show?status?like?'open%'; +--------------------------+-------+ |?Variable_name??????|?Value?| +--------------------------+-------+ |?Open_files????????|?3???| |?Open_streams???????|?0???| |?Open_table_definitions??|?8???| |?Open_tables???????|?8???| |?Opened_files???????|?91768?| |?Opened_table_definitions?|?0???| |?Opened_tables??????|?0???| +--------------------------+-------+ 7?rows?in?set?(0.00?sec) mysql>?show?global?status?like?'open%'; +--------------------------+-------+ |?Variable_name??????|?Value?| +--------------------------+-------+ |?Open_files????????|?3???| |?Open_streams???????|?0???| |?Open_table_definitions??|?10??| |?Open_tables???????|?11??| |?Opened_files???????|?91791?| |?Opened_table_definitions?|?1211?| |?Opened_tables??????|?8158?| +--------------------------+-------+ 7?rows?in?set?(0.00?sec)
這 里有Open_tables就是當前打開表的數目,通過flush tables命令可以關閉當前打開的表。而全局范圍內查看的Opened_tables是個歷史累計值。 這個值如果過大,并且如果沒有經常的執行flush tables命令,可以考慮增加table_open_cache參數的大小。
接下來看max_tmp_tables 參數:
mysql>?show?variables?like?'max_tmp%'; +----------------+-------+ |?Variable_name?|?Value?| +----------------+-------+ |?max_tmp_tables?|?32??| +----------------+-------+ 1?row?in?set?(0.00?sec)
這個參數指定的是單個客戶端連接能打開的臨時表數目。查看當前已經打開的臨時表信息:
mysql>?show?global?status?like?'%tmp%table%'; +-------------------------+-------+ |?Variable_name??????|?Value?| +-------------------------+-------+ |?Created_tmp_disk_tables?|?10478?| |?Created_tmp_tables???|?25860?| +-------------------------+-------+ 2?rows?in?set?(0.00?sec)
也 可以對比這兩個值來判斷臨時表的創建位置,一般選取BLOB和TEXT列、Group by 和 Distinct語句的數據量超過512 bytes,或者union的時候select某列的數據超過512 bytes的時候,就直接在磁盤上創建臨時表了,另外內存中的臨時表變大的時候,也可能被MySQL自動轉移到磁盤上(由tmp_table_size和 max_heap_table_size參數決定)。
繼續原來的討論,增加table_open_cache或 max_tmp_tables 參數的大小后,從操作系統的角度看,mysqld進程需要使用的文件描述符的個數就要相應的增加,這個是由 open_files_limit參數控制的。但是這個參數是OS限制的,所以我們設定的值并不一定總是生效。如果OS限制MySQL不能修改這個值,那 么置為0。如果是專用的MySQL服務器上,這個值一般要設置的盡量大,就是沒有報Too many open files錯誤的最大值,這樣就能一勞永逸了。當操作系統無法分配足夠的文件描述符的時候,mysqld進程會在錯誤日志里記錄警告信息。
mysql>?show?variables?like?'open_files%';+------------------+-------+|?Variable_name??|?Value?|+------------------+-------+|?open_files_limit?|?1024?|+------------------+-------+1?row?in?set?(0.00?sec) mysql>?show?variables?like?'open_files%'; +------------------+-------+ |?Variable_name??|?Value?| +------------------+-------+ |?open_files_limit?|?1024?| +------------------+-------+ 1?row?in?set?(0.00?sec)
對應的,有兩個狀態變量記錄了當前和歷史的文件打開信息:
mysql>?show?global?status?like?'%open%file%'; +---------------+-------+ |?Variable_name?|?Value?| +---------------+-------+ |?Open_files??|?3???| |?Opened_files?|?91799?| +---------------+-------+ 2?rows?in?set?(0.01?sec)
MySQL為每個連接分配線程來處理,可以通過threads_connected參數查看當前分配的線程數量:
mysql>?show?status?like?'%thread%'; +------------------------+--------+ |?Variable_name?|?Value?| +------------------------+--------+ |?Delayed_insert_threads?|?0?| |?Slow_launch_threads?|?0?| |?Threads_cached?|?0?| |?Threads_connected?|?14?| |?Threads_created?|?255570?| |?Threads_running?|?2?| +------------------------+--------+ 6?rows?in?set?(0.00?sec)
比較這個threads_connected參數和前面提到的max_connections參數,也可以作為目前的系統負載的參照,決定是否需要修改連接數。
如果查看每個thread的更詳細的信息,可以使用processlist命令:
mysql>?show?processlist; +--------+-----------+--------------------+----------+-------------+----------+----------------------------------------------------------------+------------------+ |?Id?|?User?|?Host?|?db?|?Command?|?Time?|?State?|?Info?| +--------+-----------+--------------------+----------+-------------+----------+----------------------------------------------------------------+------------------+ |?8293?|?repl?|?192.168.0.33:47208?|?NULL?|?Binlog?Dump?|?11574424?|?Has?sent?all?binlog?to?slave;?waiting?for?binlog?to?be?updated?|?NULL?| |?140991?|?mogile?|?192.168.0.33:41714?|?mogilefs?|?Sleep?|?0?|?|?NULL?| |?140992?|?mogile?|?192.168.0.33:41715?|?mogilefs?|?Sleep?|?3?|?|?NULL?| |?140993?|?mogile?|?192.168.0.33:41722?|?mogilefs?|?Sleep?|?2?|?|?NULL?| |?140994?|?mogile?|?192.168.0.33:41723?|?mogilefs?|?Sleep?|?1?|?|?NULL?| |?140995?|?mogile?|?192.168.0.33:41724?|?mogilefs?|?Sleep?|?3?|?|?NULL?| |?254914?|?mogile?|?192.168.0.33:43028?|?mogilefs?|?Sleep?|?11074?|?|?NULL?| |?254915?|?mogile?|?192.168.0.33:43032?|?mogilefs?|?Sleep?|?11091?|?|?NULL?| |?255144?|?mogile?|?192.168.0.33:47514?|?mogilefs?|?Sleep?|?11090?|?|?NULL?| |?255157?|?mogile?|?192.168.0.33:47535?|?mogilefs?|?Sleep?|?11087?|?|?NULL?| |?255162?|?mogile?|?192.168.0.33:47549?|?mogilefs?|?Sleep?|?11074?|?|?NULL?| |?255260?|?root?|?localhost?|?mysql?|?Query?|?0?|?NULL?|?show?processlist?| |?255352?|?maopaodev?|?192.168.0.78:55399?|?maopaodb?|?Sleep?|?3172?|?|?NULL?| |?255353?|?maopaodev?|?192.168.0.78:55400?|?NULL?|?Sleep?|?8926?|?|?NULL?| +--------+-----------+--------------------+----------+-------------+----------+----------------------------------------------------------------+------------------+ 14?rows?in?set?(0.00?sec)
執行這個命令需要有Process_priv權限,具體的權限分配信息可以查看mysql.user表。
對于影響系統運行的thread,可以狠一點,用kill connection|query threadid的命令殺死它。
相關推薦: