Postgresql

查找導致大量讀取 IO 的查詢

  • March 27, 2019

我試圖在 AWS 上的 Aurora Postgres 實例中找到更高數量的 VolumeReadIOP 的原因。這是過去 6 週的樣子:

在此處輸入圖像描述

我找到了最大周期(02/27 到 03/12)的原因,這是一個非常糟糕的查詢,幾乎一直在執行。

但是,自 03/12 以來,我看到的讀取量比 02/27 之前的時間段要多。但是僅通過查看程式碼中的更改,我無法找到其來源。

  • 我啟用了什麼樣的日誌記錄來找到它的來源?
  • 是否有任何其他 CloudWatch 指標可以幫助我解決這個問題?

您關注的是性能,還是按 IO 收費?

啟動“pg_stat_statements”並打開“track_io_timing”。然後您可以查看“blk_read_time”列以查找花費大量時間從磁碟讀取數據的查詢。我建議查看時間列,而不是計數列“shared_blks_read”,因為許多“讀取”實際上將由作業系統的文件系統記憶體完成,因此計數並不能為您提供真實磁碟 IO 的準​​確圖片. 時間應該可以更準確地描述這一點。

pg_stat_statements 不會為您提供有關何時執行查詢的資訊,除了“自上次 pg_stat_statements_reset() 呼叫以來”。如果您希望能夠將查詢與圖表對齊,那麼您需要在打開“track_io_timing”後再次啟用“auto_explain”,並採用以下設置:

auto_explain.log_min_duration = '50ms' ## need to tweak for your needs
auto_explain.log_analyze=on
auto_explain.log_timing=off  ## this may have high overhead, so turn off
auto_explain.log_buffers=on

然後從伺服器日誌文件中探勘數據。這確實會帶來成本,因此一旦發現問題,您可能會再次將其關閉。成本的數量取決於您的硬體和核心,在現代系統上,我發現它足夠低,值得一直保持開啟,只需將“log_min_duration”調高到當我不主動跟踪時很少有查詢被記錄一個問題下來。

引用自:https://dba.stackexchange.com/questions/233220