概述
如果你的資料庫執行緩慢,或者出於某種原因無法響應查詢,技術棧中每個依賴資料庫的元件都會遭受效能問題。為了保證資料庫的平穩執行,你可以主動監控以下這個與效能及資源利用率相關的指標:緩衝池使用情況。
緩衝池使用情況MySQL 預設的儲存引擎 InnoDB 使用了一片稱為緩衝池的記憶體區域,用於快取資料表與索引的資料。緩衝池指標屬於資源指標,而非工作指標。
預設設定下,緩衝池的大小通常相對較小,為 128MiB。不過,MySQL 建議可將其擴大至專用資料庫伺服器實體記憶體的 80% 大小。然而,MySQL 也指出了一些注意事項:InnoDB 的記憶體開銷可能提高超過緩衝池大小 10% 的記憶體佔用。並且,如果你耗盡了實體記憶體,系統會求助於分頁,導致資料庫效能嚴重受損。
緩衝池大小調整操作是分塊進行的,緩衝池的大小必須為塊的大小乘以例項的數目再乘以某個倍數。
innodb_buffer_pool_size = N * innodb_buffer_pool_chunk_size * innodb_buffer_pool_instances
塊的預設大小為 128 MiB,但是從 MySQL 5.7.5 開始可以自行配置。以上兩個引數的值都可以通過如下方式進行檢查:
監控指標:指標 Innodb_buffer_pool_read_requests 及 Innodb_buffer_pool_reads 對於理解緩衝池利用率都非常關鍵。Innodb_buffer_pool_read_requests 追蹤合理讀取請求的數量,而Innodb_buffer_pool_reads 追蹤緩衝池無法滿足,因而只能從磁碟讀取的請求數量。我們知道,從記憶體讀取的速度比從磁碟讀取通常要快好幾個數量級,因此,如果 Innodb_buffer_pool_reads 的值開始增加,意味著資料庫效能大有問題。
緩衝池利用率是在考慮擴大緩衝池之前應該檢查的重要指標。利用率指標無法直接讀取,但是可以通過下面的方式簡單地計算得到:
(Innodb_buffer_pool_pages_total - Innodb_buffer_pool_pages_free) / Innodb_buffer_pool_pages_total
如果你的資料庫從磁碟進行大量讀取,而緩衝池還有許多閒置空間,這可能是因為快取最近才清理過,還處於熱身階段。如果你的緩衝池並未填滿,但能有效處理讀取請求,則說明你的資料工作集相當適應目前的記憶體配置。
將緩衝池指標轉化為位元組:
大多數緩衝池指標都以記憶體頁面為單位進行記錄,但是這些指標也可以轉化為位元組,從而使其更容易與緩衝池的實際大小相關聯。例如,你可以使用追蹤緩衝池中記憶體頁面總數的伺服器狀態變數找出緩衝池的總大小(以位元組為單位):
Innodb_buffer_pool_pages_total * innodb_page_size
InnoDB 頁面大小是可調整的,但是預設設定為 16 KiB,或 16,384 位元組。你可以使用 SHOW VARIABLES 查詢了解其當前值: