munin 以及 zabbix 的聚合(aggregate)

这类需求应该是评估监控系统是否合适的一个重要因素了。
munin 虽然具备,不过实现起来并不是很智能,需要人肉书写。以 mongo 的为例,我们需要聚合分布在不同机器上的 instance 上的 shard 的状态。
在 munin.conf 里面 include 一个名叫 mongo 的目录专门用来做聚合。先定义涉及到的 host:
[dc_shard;jaseywang-db9]
    address 192.168.1.43
    use_node_name yes

[dc_shard;jaseywang-db10]
        address 192.168.1.83
        use_node_name yes

[dc_shard;DailyCounter]
        update no

接下来就是定义需要聚合的 item 了,这个需要每个 host 都有对应的 plugin,比如这里叫 mongo_ops_xxx,xxx 是起 REST 端口:
dc_shard.graph_title DailyCounter
dc_shard.graph_category DailyCounter
dc_shard.graph_total total
dc_shard.total.graph no
dc_shard.graph_order insert update delete getmore
dc_shard.insert.label insert
dc_shard.insert.sum \
  jaseywang-db9:mongo_ops_28701.insert \
  jaseywang-db10:mongo_ops_28711.insert \
  jaseywang-db10:mongo_ops_28716.insert
dc_shard.update.label update
dc_shard.update.sum \
  jaseywang-db9:mongo_ops_28701.update \
  jaseywang-db10:mongo_ops_28711.update \
  jaseywang-db10:mongo_ops_28716.update

有点需要注意的是,需要严格遵循其语法,该是句号的使用句号,使用冒号的用冒号。

zabbix 的相对比较简单,既然是需要聚合的,划分到同一个 hostgroup,接着就是用其原生支持的 "Zabbix aggragate" 这个 Type 就好了。建立好了 item,trigger、graph 之类的就都有了,还是很简单的。顺便说下 Cacti,只要熟悉 rrdtool,问题也很好解决。
 

代码变更对系统的影响

某台 Mongo,监控的 agent 突然取不到所有的数据,ssh 也直接显示:
ssh_exchange_identification: Connection closed by remote host
前提是我已经加了 public key。

通过远程卡登录,出现大量的如下信息:
INFO: task dpkg:5206 blocked for more than 120 seconds.
"echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disable this message.

尝试登录,进不了 shell,报错:
login: failure forking: Cannot allocate memory

猜测可能是机器的某些资源耗尽引起的。不得以强行 warn boot。之后的一小段时间内没有出现此问题,但是大概 2h 之后,又出现了上面的情况,查看系统资源的占用的情况,下面三张图分别是那段时间的 inode table, interrupts and context switch 以及 threads 显示

可以发现在 18 号的 20 点出现了一次波动,reboot 之后稍有缓解,但是从 24 点又开始出现了 threads 直线上升的情况。在网络没有变动,系统没有变动的情况下,惟一的可能就是代码有问题了。经排查,确实是代码引起的问题。
除了 dev 对变更后的代码最好监控之外,以后对这类的问题应该更加敏感些。