Postgresql

postgresql 伺服器上奇怪的高 CPU I/O 等待

  • November 30, 2012

目前,我真的在為一個性能問題苦苦掙扎,當我的數據庫伺服器處於“重”負載下時,我所有的數據庫查詢佔用的時間是正常情況的 1000 倍。

我有一台執行 ubuntu 12.04 並託管我的 postgresql 9.2 數據庫的伺服器。該伺服器位於 Hetzner.de 上,它是 EX6s(8 核氙氣,32Gb 記憶體和兩個 3T 硬碟,RAID1 設置使用 ubuntus 軟體 RAID)。當我執行大量查詢(我經常在晚上完成)時,我發現幾乎所有的 CPU 使用都花在了 CPU I/O 等待上。我安裝了新的遺跡監控,我似乎找不到任何其他跡象表明這種 CPU I/O 等待的根本原因可能是什麼,這顯然是我的性能和吞吐量的瓶頸。

所以問題是,這個 CPU I/O 等待是什麼,它在等待什麼?

我添加了我可以從下面的新遺物中獲得的所有概覽圖表。我在看什麼?一定有明顯的瓶頸?我應該在哪裡潛水?

數據庫伺服器 CPU 使用率 - 告訴我有問題的邪惡者 https://rpm.newrelic.com/public/charts/cEdIvvoQZCr

數據庫伺服器平均負載 https://rpm.newrelic.com/public/charts/cMNdrYW51QJ

數據庫伺服器物理記憶體 https://rpm.newrelic.com/public/charts/c3dZBntNpa1

數據庫伺服器磁碟 I/O 使用 - 如您所見,磁碟似乎沒有被充分利用(幾乎沒有) https://rpm.newrelic.com/public/charts/9YEVw6RekFG

數據庫伺服器網路 I/O (Mb/s) - 網路是一個千兆位內部網路,所有通信都在該網路上進行。 https://rpm.newrelic.com/public/charts/lKiZ0Szmwe7

按掛鐘時間排名前 5 位的數據庫操作 https://rpm.newrelic.com/public/charts/dCt45YH12FK

數據庫吞吐量 https://rpm.newrelic.com/public/charts/bIbtQ1mDzMI

數據庫響應時間 https://rpm.newrelic.com/public/charts/fPcNL8WA6xx

更新:

做完之後sudo iostat -k 1我開始懷疑了。我得到了很多這樣的輸出,我在 NR 中看不到:

Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
sda               0.00         0.00         0.00          0          0
sdb               0.00         0.00         0.00          0          0
sdc             546.00      2296.00      6808.00       2296       6808
sdd             593.00      1040.00      7416.00       1040       7416
md1               0.00         0.00         0.00          0          0
md0               0.00         0.00         0.00          0          0
md2            1398.00      3328.00     13064.00       3328      13064
md3               0.00         0.00         0.00          0          0

簡而言之,您需要更快的磁碟。

當程序處於 iowait 中時,這意味著它們已發出 IO 請求,並正在等待該請求的結果。有了足夠的 RAM,您的大部分工作集都將記憶體在 RAM 中,因此,讀取不會導致這種 IO 爭用,因此寫入通常是罪魁禍首。

關於您的磁碟 IO 圖,我懷疑 New Relic 出於某種原因沒有正確收集 IO 指標。我建議可能研究像 Munin 這樣的輔助數據收集系統。除此之外,您可以通過發出以下命令來實時查看磁碟 IO:

$ iostat -k 1

這將以 kbps 為單位輸出實時磁碟讀取和寫入。我懷疑你會在那裡看到很多 New Relic 沒有看到的活動。

引用自:https://serverfault.com/questions/453686