通常會關注一下四個與性能和資源利用率相關的指標:
查詢吞吐量、
連接情況、
緩沖池使用情況以及
查詢執行性能等。
數據庫吞吐量
對於數據庫而言,最重要的工作就是實現對數據的增、刪、改、查。為了
衡量數據庫服務器當前的吞吐量變化情況。
在MySQL內部通過一個名為
Questions的計數器,
當客戶端發送一個查詢語句后,其值就會+1。
可以通過以下MySQL指令查詢Questions等服務器狀態變量的值:
show global status like "Questions";
一般還可以從監控
讀操作和寫操作的執行情況進行判斷。通過MySQL全局狀態中的
Com_select可以查詢到當前服務器執行
查詢語句的總次數:
相應的,也可以通過
Com_insert、
Com_update以及
Com_delete的總量衡量當前服務器
寫操作的總次數,
例如,可以通過以下指令查詢當前MySQL實例insert語句的執行次數總量:
show global status like "Com_insert";
連接情況
在MySQL中通過全局設置
max_connections限制了當前服務器允許的最大客戶端連接數量。一旦可用連接數被用盡,新的客戶端連接都會被直接拒絕。
因此當監控MySQL運行狀態時,需要時刻關注MySQL服務器的連接情況。用戶可以通過以下指令查看當前MySQL服務的max_connections配置:
show variables like "max_connections";
MySQL默認的最大鏈接數為200(這個數值是上述命令查出的結果值)。
臨時調整最大連接數,可以通過以下指令進行設置:
set global max_connections = 210;
如果想永久化設置,則需要通過修改MySQL配置文件my.cnf,添加以下內容:
max_connections = 210
通過Global Status中的
Threads_connected、Aborted_connects、Connection_errors_max_connections以及Threads_running可以查看當前MySQL實例的連接情況。
例如,通過以下指令可以直接當前MySQL實例的連接數:
show global status like "Threads_connected";
當
所有可用連接都被占用時,如果一個客戶端嘗試連接至MySQL,會出現“Too many connections(連接數過多)”錯誤,
同時Connection_errors_max_connections的值也會增加。為了防止出現此類情況,你應該監控可用連接的數量,
並
確保其值保持在max_connections限制以內。同時
如果Aborted_connects的數量不斷增加時,說明客戶端嘗試連接到MySQL都失敗了。
此時可以通過Connection_errors_max_connections以及Connection_errors_internal分析連接失敗的問題原因。
-
mysql_global_variables_max_connections: 允許的最大連接數;
-
mysql_global_status_threads_connected: 當前開放的連接;
-
mysql_global_status_threads_running:當前開放的連接;
-
mysql_global_status_aborted_connects:當前開放的連接;
-
mysql_global_status_connection_errors_total{error="max_connections"}:由於超出最大連接數導致的錯誤;
-
mysql_global_status_connection_errors_total{error="internal"}:由於系統內部導致的錯誤;
監控緩沖池使用情況
MySQL默認的存儲引擎InnoDB使用了一片稱為緩沖池的內存區域,
用於緩存數據表以及索引的數據。 當
緩沖池的資源使用超出限制后,可能會導致
數據庫性能的下降,
同時很多查詢命令會直接在磁盤中執行,導致磁盤I/O不斷攀升。 因此,應該
關注MySQL緩沖池的資源使用情況,並且在合理的時間擴大緩沖池的大小可以優化數據庫的性能。
Innodb_buffer_pool_pages_total反映了當前緩沖池中的內存頁的總頁數。可以通過以下指令查看:
show global status like "Innodb_buffer_pool_pages_total";
Innodb_buffer_pool_read_requests記錄了
正常從緩沖池讀取數據的請求數量。可以通過以下指令查看:
show global status like "Innodb_buffer_pool_read_requests";
當
緩沖池無法滿足時,MySQL只能從磁盤中讀取數據。
Innodb_buffer_pool_reads即記錄了從磁盤讀取數據的請求數量。
通常來說從
內存中讀取數據的速度要比從磁盤中讀取快很多,因此,如果
Innodb_buffer_pool_reads的值開始增加,可能
意味着數據庫的性能有問題。
可以通過以下命令查看Innodb_buffer_pool_reads的數量:
show global status like "Innodb_buffer_pool_reads";
查詢性能
MySQL還提供了一個
Slow_queries的計數器,當查詢的執行時間超過long_query_time的值后,計數器就會+1,其默認值為10秒,
可以通過以下指令在MySQL中查詢當前long_query_time的設置:
show variables like "long_query_time";
通過以下指令可以查看當前MySQL實例中Slow_queries的數量:
show global status like "Slow_queries";
通過
監控Slow_queries的增長率,可以
反映出當前MySQL服務器的性能狀態 ;