第03問:磁盤 IO 報警,MySQL 讀寫哪個文件慢了?


第03問:磁盤 IO 報警,MySQL 讀寫哪個文件慢了?


問題:

磁盤 IO 報警,說 IO 飽和了。

那麼 MySQL 讀寫哪個文件慢了?binlog?redo log?還是哪張表?


構造環境:

根據先前的 實驗 02,構造環境,模仿 binlog 的磁盤 IO 慢。


實驗:

想觀察 IO 相關的行為,需啟用 performance_schema 的 instrument(生產者)和 consumer(消費者)。

將 performance_schema 的配置重置為默認配置,IO 相關的 instrument(生產者)在默認配置裡開啟。


第03問:磁盤 IO 報警,MySQL 讀寫哪個文件慢了?

啟用 waits 相關的 consumer(消費者)


第03問:磁盤 IO 報警,MySQL 讀寫哪個文件慢了?

將已記錄的性能數據清零


第03問:磁盤 IO 報警,MySQL 讀寫哪個文件慢了?

向 MySQL 施加壓力


第03問:磁盤 IO 報警,MySQL 讀寫哪個文件慢了?

在另一個 session 中,觀察最近的 IO 行為。


第03問:磁盤 IO 報警,MySQL 讀寫哪個文件慢了?

可以看到 binlog 的刷盤 IO 明顯比其他操作慢,符合我們構造的實驗場景。這樣我們就快速定位了哪個文件的 IO 變慢了。

有了線程號,我們還可以定位其對應的操作:


第03問:磁盤 IO 報警,MySQL 讀寫哪個文件慢了?


結論:

我們通過 sys.x$latest_file_io,找到最近的 IO 操作的記錄,進行了排序。

需注意:

1. 這裡不用 sys.latest_file_io 的原因是無法對操作延遲進行排序。

小知識:

以 sys 中, 以 x$ 開頭的視圖,是原始數據。

不以 x$ 開頭的視圖,是給人類看的視圖(比如時間顯示會帶單位,顯示成 123 ns)。

2. sys.x$latest_file_io 視圖涉及到兩張表:performance_schema. events_waits_history_long 和 performance_schema. threads 如果某個線程退出,就不會出現在 sys.x$latest_file_io 視圖。所以 sys.x$latest_file_io 不是"最近的 IO 操作記錄",而是"當前活躍線程的最近的 IO 操作記錄"。


關於 MySQL 的技術內容,你們還有什麼想知道的嗎?趕緊留言告訴小編吧!


第03問:磁盤 IO 報警,MySQL 讀寫哪個文件慢了?


分享到:


相關文章: