Linux

高 IO 負載時 rrdgraph 生成失敗

  • October 18, 2014

我們有一個 4 核 CPU 生產系統,它執行大量的 cronjobs,具有恆定的 proc 隊列和通常的負載 ~1.5。

在夜間,我們使用 postgres 做一些 IO 密集型的工作。我們生成一個顯示負載/記憶體使用情況的圖表 (rrd-updates.sh) 這有時會在高 IO 負載情況下“失敗”。幾乎每晚都會發生這種情況,但並非在所有高 IO 情況下都會發生。

我的“正常”解決方案是對 postgres 的內容進行優化和離子化,並增加圖形生成的優先級。然而,這仍然失敗。使用flock 生成圖是半執行緒證明的。我確實記錄了執行時間,對於圖形生成,在高 IO 負載期間最多需要 5 分鐘,這似乎會導致圖形失去長達 4 分鐘。

時間範圍與 postgres 活動完全匹配(這有時也發生在白天,但並不經常發生)離子化到實時 prio(C1 N6 graph_cron vs C2 N3 postgres),在 postgres 之上(-5 graph_cron vs 10 postgres) ) 沒有解決問題。

假設沒有收集數據,額外的問題是 ionice/nice 仍然無法正常工作。

即使有 90% 的 IOwait 和 100 的負載,我仍然能夠免費使用數據生成命令,延遲可能不超過 5 秒(至少在測試中)。

可悲的是,我無法在測試中準確地重現這一點(只有一個虛擬化的開發系統)

版本:

核心2.6.32-5-686-bigmem

Debian Squeeze rrdtool1.4.3 硬體:SAS 15K RPM HDD 與硬體 RAID1 中的 LVM

掛載選項:ext3與 rw,errors=remount-ro

調度程序:CFQ

crontab:

* * * * *               root    flock -n /var/lock/rrd-updates.sh nice -n-1 ionice -c1 -n7 /opt/bin/rrd-updates.sh

Oetiker 先生在 github 上似乎有一個可能與 rrdcache 相關的錯誤:

https ://github.com/oetiker/rrdtool-1.x/issues/326

這實際上可能是我的問題(並發寫入),但它並不能解釋 cronjob 不會失敗。假設我實際上有 2 個並發寫入flock -n將返回退出程式碼 1(每個手冊頁,在測試中確認)因為我也沒有收到帶有輸出的電子郵件,並且觀察到 cronjob 在我其他時候確實執行良好不知何故失去了。

範例輸出: 缺少行的 CPU 負載圖

根據評論,我添加了更新腳本的重要來源。

rrdtool update /var/rrd/cpu.rrd $(vmstat 5 2 | tail -n 1 | awk '{print "N:"$14":"$13}')
rrdtool update /var/rrd/mem.rrd $(free | grep Mem: | awk '{print "N:"$2":"$3":"$4}')
rrdtool update /var/rrd/mem_bfcach.rrd $(free | grep buffers/cache: | awk '{print "N:"$3+$4":"$3":"$4}')

我想念什麼或在哪裡可以進一步檢查?

請記住:生產系統因此沒有開發,沒有堆棧跟踪或類似的可用或可安裝。

我想這不是 rrdtool 無法更新圖表,而是此時無法測量數據。順便說一句,您測量 CPU 和記憶體統計數據的方法是錯誤的,因為它會給您即時結果。CPU 和記憶體負載可能會在 60 秒間隔內發生巨大變化,但您只需要一個值。您真的應該考慮獲取 SNMP 數據,它會給出一個間隔的平均數據。另外,整個管道似乎比 snmpget 呼叫更昂貴和更慢。可能是差距的主要原因。

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