熱門文章
電 話:023-6276-4481
郵箱:broiling@qq.com
地址:重慶市南岸區(qū)亞太商谷6幢25-2
萬圣節(jié)已經過去很久了,該是把注意力集中在即將到來的假日季節(jié)的時候了。首先是感恩節(jié),接著就是黑色星期五和網絡星期一,最終在圣誕節(jié)/節(jié)禮周(從12月26日的節(jié)禮日開始,到12月31日的除夕結束為期六天或更長時間。這個詞是由零售業(yè)在2000年代中期左右發(fā)明的,試圖延長他們的節(jié)禮日銷售)達到購物高潮。對于企業(yè)主來說,一年的這個時候標志著人們期待已久的年底獲利了結。對于一些DBA來說,它會帶來恐懼,不安,甚至是不眠之夜,他們要努力使系統(tǒng)重新上線。
值得慶幸是,情況并非如此。通過對MySQL性能變量做一些主動調整,可以使數據庫服務器免受購物旺季帶來的需求增加的沖擊。
對于MySQL的最大連接數,一次最好是發(fā)送5個請求到Web服務器。對Web服務器的5個請求中的一部分將用于CSS樣式表,圖像和腳本等資源。由于諸如瀏覽器緩存等原因,要獲得準確的MySQL到Web服務器的請求比率可能很困難; 要想得到一個確切的數字,就需要分析Web服務器的日志文件。例如,可以手動訪問Apache的“access_log”日志文件,也可以通過Analog或Webalizer等實用程序訪問日志文件。
一旦有了對特定使用情況的準確估計,請將該比率乘以Web服務器的最大連接數。例如,如果Web服務器配置為最多為256個客戶端提供服務,MySQL請求與Web請求的比率為1/8,則最好將最大數據庫連接數設置為32。還要考慮留有安全余量,把這個數乘以2,得到最終的數量。只有在基礎設施支持的情況下,才能嘗試將數據庫連接數的最大數量與Web服務器的客戶端限制相匹配。在大多數情況下,最好保持接近32。
在Monyog中查看MySQL連接
在MySQL數據庫中,MySQL的最大并發(fā)連接數是存儲在全局變量max_connections中的。Monyog報告變量“max_connections”作為當前連接監(jiān)控組中的“最大允許”指標。它還將該數字除以打開的連接數,以生成連接使用百分比:
還有一個連接歷史記錄監(jiān)控,可以幫助計算最佳的最大并發(fā)連接數。它包括嘗試,拒絕和成功連接的數量。此外,允許達到的最大指標的百分比顯示為一個進度條,可以讓你快速評估服務器在過去達到的最大并發(fā)連接數:
在某些情況下,服務器在處理語句時會創(chuàng)建內部臨時表。臨時表用于內部操作如GROUP BY和distinct,還有一些ORDER BY查詢以及UNION和FROM子句(派生表)中的子查詢。這些都是在內存中創(chuàng)建的內存表。內存中臨時表的最大大小由tmp_table_size和max_heap_table_size中較小的值確定。如果臨時表的大小超過這個閾值,則將其轉換為磁盤上的InnoDB或MyISAM表。此外,如果查詢涉及BLOB或TEXT列,而這些列不能存儲在內存表中,臨時表總是直接指向磁盤。
這種轉換的代價很大,所以考慮增加max_heap_table_size和tmp_table_size變量的大小來幫助減少在磁盤上創(chuàng)建臨時表的數量。請記住,這將需要大量內存,因為內存中臨時表的大小是基于“最壞情況”的。例如,內存表總是使用固定長度的列,所以字符列使用VARCHAR(255)。這可以使內存中的臨時表比想象的要大得多—事實上,這比查詢表的總大小要大很多倍!當增加max_heap_table_size和tmp_table_sizevariables的大小時,一定要監(jiān)視服務器的內存使用情況,因為內存中的臨時表可能會增加達到服務器內存容量的風險。
一般來說,32M到64M是建議值,從這兩個變量開始并根據需要進行調優(yōu)。
在Monyog中的臨時表監(jiān)測
臨時表的監(jiān)測是許多預定義的Monyog監(jiān)測之一。它提供了一些臨時表使用的指標,包括:
允許的最大值:顯示tmp_table_size服務器變量的值,它定義了在內存中創(chuàng)建的臨時表的最大大小。與max_heap_table_size一起,這個值定義了可以在內存中創(chuàng)建的臨時表的最大大小。如果內存臨時表大于此大小,則將其存儲在磁盤上。
內存表的最大大小:顯示max_heap_table_size服務器變量的值,該值定義了顯式創(chuàng)建的MEMORY存儲引擎表的最大大小。
創(chuàng)建的臨時表總數:顯示created_tmp_tables服務器變量的值,它定義了在內存中創(chuàng)建的臨時表的數量。
在磁盤上創(chuàng)建的臨時表:顯示created_tmp_disk_tables服務器變量的值,該變量定義了在磁盤上創(chuàng)建的臨時表的數量。如果這個值很高,則應該考慮增加tmp_table_size和max_heap_table_size的值,以便增加創(chuàng)建內存臨時表的數量,從而減少在磁盤上創(chuàng)建臨時表的數量。
磁盤:總比率:基于created_tmp_disk_tables除以created_tmp_tables的計算值。由于tmp_table_size或max_heap_table_size不足而在磁盤上創(chuàng)建的臨時表的百分比。Monyog將這個數字顯示為一個進度條和百分比,以便快速確定有多少磁盤用于臨時表,而不是內存。
趨勢圖可用于創(chuàng)建的總表,磁盤上創(chuàng)建的表和磁盤的總比值。這些讓我們看到了它們隨著時間的演變:
連接管理器線程處理服務器監(jiān)聽的網絡接口上的客戶端連接請求。連接管理器線程將每個客戶端連接與專用于它的線程關聯,該線程負責處理該連接的身份驗證和所有請求處理。因此,線程和當前連接的客戶端之間是一對一的比例。確保線程緩存足夠大以容納所有傳入請求是非常重要的。
MySQL提供了許多與連接線程相關的服務器變量:
線程緩存大小由thread_cache_size系統(tǒng)變量決定。默認值為0(無緩存),這將導致為每個新連接設置一個線程,并在連接終止時需要處理該線程。如果希望服務器每秒接收數百個連接請求,那么應該將thread_cache_size設置的足夠高,以便大多數新連接可以使用緩存線程??梢栽诜掌鲉踊蜻\行時設置max_connections的值。
還應該監(jiān)視緩存中的線程數(Threads_cached)以及創(chuàng)建了多少個線程,因為無法從緩存中獲取線程(Threads_created)。關于后者,如果Threads_created繼續(xù)以每分鐘多于幾個線程的增加,請考慮增加thread_cache_size的值。
使用MySQL show status命令顯示MySQL的變量和狀態(tài)信息。這里有幾個例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | SHOW GLOBAL STATUS LIKE '%Threads_connected%';
+-------------------+-------+
| Variable_name | Value |
+-------------------+-------+
| Threads_connected | 2 |
+-------------------+-------+ SHOW GLOBAL STATUS LIKE '%Threads_running%';
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| Threads_running | 1 |
+-----------------+-------+
|
Monyog線程緩存監(jiān)測
Monyog提供了一個監(jiān)控線程緩存的屏幕,名為“線程”。與MySQL線程相關的服務器變量映射到以下Monyog指標:
thread_cache_size:可以緩存的線程數。
Threads_cached:緩存中的線程數。
Threads_created:創(chuàng)建用于處理連接的線程。
Monyog線程屏幕還包括“線程緩存命中率”指標。這是一個提示線程緩存命中率的指標。如果值較低,則應該考慮增加線程緩存。在狀態(tài)欄以百分比形式顯示該值;它的值越接近100%越好。
如果這些指標的值等于或超過指定值,則可以將每一個指標配置為發(fā)出警告和/或嚴重警報。