在高IO负载下rrdgraph生成失败


8

我们有一个4核CPU生产系统,它执行很多cronjobs,具有恒定的proc队列和通常的〜1.5负载。

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

我的“正常”解决方案将是使postgres内容好看,使之离子化并增加图形生成的优先级。但是,这仍然失败。图形生成是带有群的半线程证明。我确实记录了执行时间,并且在高IO负载下,图形生成最多需要5分钟,这似乎导致图形丢失最多需要4分钟。
时间范围与postgres活动完全匹配(有时也会在一天中发生,尽管并不经常发生)进行实时Prio(C1 N6 graph_cron与C2 N3 postgres)之间的联系,在postgres上方进行联系(-5 graph_cron vs 10 postgres) )没有解决问题。

假设没有收集数据,另一个问题是ionice / nice仍然无法正常工作。
即使有90%的IOwait和100的负载,我仍然能够免费使用数据生成命令,而不会有超过5秒的延迟(至少在测试中)。

可悲的是,我无法在测试中准确地再现这一点(只有虚拟化的开发系统)

版本:

内核2.6.32-5-686-bigmem
Debian Squeeze rrdtool 1.4.3 硬件:硬件LSAS的SAS 15K RPM HDD,硬件RAID1
挂载选项: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}')

我想念什么或在哪里可以进一步检查?

切记:高效的系统,因此没有开发人员,没有堆栈跟踪或类似的可用或可安装的。


1
MRTG被RRDgraph取代的年代。从旧到新的惊人变化之一是RRDgraph仅在有视图请求时才实际生成图像。旧的MRTG每五分钟为每个数据点生成一个全新的图形。您的问题在于数据收集,而不是图形渲染。
ericx 2014年

@ericx谢谢您的评论。我添加了数据生成源。您是否仍然认为问题是vmstat命令而不是IOnice / nice不能正常工作?如果是这样,您为什么这样认为?
丹尼斯·诺尔特

cron可以在任何地方捕获STDERR吗?在FreeBSD上,我通常在以下环境下运行它们,periodic every5并且我/var/log/periodic.every5通常会捕获任何错误。我还将错开这三个脚本,并可能旋转顺序以查看某个脚本是否挂起。我在RRDTool上的大部分经验都是使用cricket它自己的日志记录。该cricket日志是优秀查找的麻烦。您真的在收集每一分钟吗?(* * * * *代替* / 5 * * * *)图形的粒度是多少?RRD默认为5分钟间隔。
ericx 2014年

这是最初用来创建它们的命令:create cpu.rrd --step 300 DS:sys:GAUGE:70:U:U DS:user:GAUGE:70:U:U RRA:AVERAGE:0.01:1: 6351,所以这意味着您刚刚发现了另一个错误,谢谢。我确实为该脚本重写了STDOUT和STDERR进行测试,但是没有记录任何日志,这在我第一次尝试时对我有所帮助。我明天将增加输出
Dennis Nolte 2014年

1
在无法理解“失败”方面,rrdtool的显示基于5分钟的轮询周期。如果您没有在下一个周期开始之前就结束一个周期的处理,并且如果您的数据收集和图形生成属于同一处理操作的一部分,那么您将得到一个丢失的数据点。
mc0e 2014年

Answers:


2

我猜不是不是rrdtool无法更新图形,但是此时无法测量数据。顺便说一句,您测量CPU和内存统计信息的方法是错误的,因为它可以立即为您提供结果。在60秒的间隔内,CPU和内存负载可能会发生巨大变化,但是您只能使用一个值。您应该真正考虑采用SNMP数据,该数据可以按间隔提供平均数据。另外,整个管道似乎比snmpget调用更昂贵且更慢。可能是差距的主要原因。


只是作为跟进,就是这样。一旦我们能够将一些资源匮乏的流程移至另一台服务器,就可以生成图形。
丹尼斯·诺尔特
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.