解決問題:
- 怎樣查看Mysql最大連接數(max_connections)?怎樣修改max_connections?
- 怎樣查看Mysql線程緩存池數量(thread_cache_size)?thread_cache_size的作用?優化?
- 怎樣查看Mysql線程的狀態(Threads_cached/Threads_connected/Threads_running/Threads_running)?
- 怎樣理解Threads_cached/Threads_connected/Threads_running/Threads_running?以及它們和並發量的關系?
- 怎樣使用doDBA工具?
1. 怎樣查看Mysql最大連接數?怎樣修改?
1.1 查看MySQL最大連接數?
登錄Mysql:mysql -u username -p password
show variables like '%max_connections%';
1.2 修改MySQL最大連接數?
修改mysql的配置文件。
vi /etc/my.cnf
修改或添加:max_connections=1000(需要的值)
重啟mysql:systemctl restart mysqld
如果修改失敗,參見博客:MySQL 修改最大連接數(max_connections)失效,上限214問題
2.怎樣查看Mysql線程緩存池數量(thread_cache_size)?thread_cache_size的作用?優化?
2.1 查看
登錄mysql
show variables like '%thread_cache_size%';
2.2 理解
“每個Mysql客戶端連接都會在服務器進程中擁有一個線程,這個連接的查詢只會在這個單獨的線程中執行,該線程只能輪流在某個CPU核心或者CPU中運行。服務器會負責緩存線程,因此不需要為每一個新建的連接創建或者銷毀線程。”(來着《高性能MySQL》)
意思是如果Mysql客戶端新建一個連接,那么Mysql服務器就需要為這個連接創建一個線程。如果Mysql線程緩存池中有線程,那么就直接從緩存區刪除這個線程,並且把它分配給這個新的連接使用。節省了創建連接的開銷。當連接關閉時,如果線程緩存還有空間的話,MySQL又會把線程返回緩存。如果沒有空間,Mysql會銷毀這個線程。
2.3 修改
修改mysql的配置文件。
vi /etc/my.cnf
修改或添加:thread_cache_size=300(需要的值)
重啟mysql:systemctl restart mysqld
2.4 優化建議(優化建議來自《高性能MySQL》)
thread_cache_size變量指定了MySQL可以保持在緩存中的線程數。一般不需要配置這個值,除非服務器有很多連接請求。如果我們觀察到很少有每秒創建的新線程數少於10個的時候,通常應該嘗試保持線程緩沖足夠大,但是實際上經常可能看到每秒少於1個新線程的情況。
一個好的辦法是觀察Threads_connected變量並且嘗試設置thread_cache_size足夠大以便能處理業務壓力正常的波動。如果它保持在100-120,則可以設置為20;如果保持在500-700,200的線程緩存應該足夠大了。
3.怎樣查看Mysql線程的狀態?
登錄mysql
show status like 'thread%';
Threads_cached:當前線程緩存還有多少線程。
Threads_connected:當前已連接的MySQL線程數。這個值不會超過max_connections,也許會超過1或2個,不用管它。
Threads_created:這個值是個累加值,表示MySQL服務器為連接創建的線程數?有待考證!
Threads_running:表示當前正在運行的連接數,這個數會遠小於Threads_connected,這是正常情況。
4. 怎樣理解Threads_cached/Threads_connected/Threads_running/Threads_running?以及它們和並發量的關系?
沒有高並發時,這四個狀態為:
1000並發時,這四個狀態為:(參考)
當高並發開始時,Threads_cached的值會減少,Threads_created值幾乎不變,Threads_connected值持續增加;當Threads_cached的值減少為0后,Threads_createds值增加(波動會大於10),Threads_connected值持續增加;直到Threads_connected值穩定,這個值和max_connections有關系,此時Threads_cached值為0,Thread_created值不變,Threads_connected值不變。
當高並發結束后,Threads_connected值會減少,Threads_cached值會恢復成最初值(thread_cache_size配置決定。)
以上就是高並發時,MySQL線程的變化情況。
優化建議:(以下建議,來自踩坑)
合理的Threads_cached值,能在高並發開始時,讓MySQL更快的進入狀態,因為它會節省很多創建線程的開銷。Threads_connected值上不去,首先看看max_connections的值是多少,如果有連接池,看看連接池配置的最大連接數是多少,如果數據庫連接池(比如Druid)最大Active連接數只有500,那Threads_connected最多只能到501(用MySQL性能檢測工具可以看到),如果還是上不去,就需要具體分析了。
5. 怎樣使用doDBA工具?
5.1 在linux上部署doDBA
安裝:
wget https://raw.githubusercontent.com/dblucyne/dodba_tools/master/doDBA --no-check-certificate wget https://raw.githubusercontent.com/dblucyne/dodba_tools/master/doDBA.conf --no-check-certificate chmod +x doDBA
修改配置文件:
運行:
監控Mysql:./doDBA -h 192.168.43.167 -mysql
監控系統:./doDBA -h 192.168.43.167 -sys
(轉載請標明出處)