postgresql 伺服器上奇怪的高 CPU I/O 等待
目前,我真的在為一個性能問題苦苦掙扎,當我的數據庫伺服器處於“重”負載下時,我所有的數據庫查詢佔用的時間是正常情況的 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 沒有看到的活動。