高IO负载导致rrdgraph生成失败

我们有一个4核心的CPU生产系统,它有很多的cronjobs,拥有恒定的proc队列和一般的负载约1.5。

在晚上,我们用postgres做一些IO密集的东西。 我们生成一个显示负载/内存使用情况(rrd-updates.sh)的图表,有时在高IO负载情况下“失败”。 这几乎每天都在发生,但并不是每个高IO情况都会发生。

我的“正常”解决scheme将是好的和离子postgres的东西,并增加graphics生成的prio。 但是,这仍然失败。 图生成是与鸡群的半线程certificate。 我logging了执行时间,对于graphics生成,在高IO负载期间高达5分钟,似乎导致长达4分钟的丢失图。
时间框架与postgres活动完全匹配(这有时也会发生在白天,虽然不是那么经常),离开postgres(c1 N6 graph_cron vs C2 N3 postgres),在postgres之上(-5 graph_cron vs 10 postgres )没有解决这个问题。

假设没有收集数据,额外的问题是离子/好点子仍然不工作。
即使有90%的IOwait和100的负载,我仍然可以使用数据生成命令,而不会超过5秒的延迟(至less在testing中)。

可悲的是我还没有能够在testing中重现这一点(只有虚拟化的开发系统)

版本:

内核2.6.32-5-686-bigmem
Debian Squeeze rrdtool 1.4.3硬件:硬件RAID1中带有LVM的SAS 15K RPM HDD
mount选项: 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似乎有一个可能相关的BUG:
https://github.com/oetiker/rrdtool-1.x/issues/326

这实际上可能是我的问题(并发写入),但它不解释cronjob不失败。 在asumption我实际上有2个并发写flock -n会返回退出代码1(每个手册页,在testing中确认)因为我没有得到一个电子邮件与输出或者观察到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数据,这个数据会在一个时间间隔内提供平均数据。 另外,整个pipe道似乎是更昂贵和慢snmpget调用。 可能是差距的主要原因。