最近遇到了一个问题,
问题现象:ganglia监控主机系统响应慢,正常的命令行操作有卡顿现象,特别是打开、编辑文件时更加明显。
问题分析:通过对ganglia监控主机的监控、top、iotop、vmstat等工具排查,发现时时刻刻都有大量磁盘写io,本身这台服务器上还跑了生产环境的mongo及mysql的从库等其他应用,通过iotop定位到磁盘写io操作主要是gmond进程产生,每次采集到监控数据后会写入到rrd文件带来的大量写操作。
进一步背景分析:我们采用ganglia监控生产环境系统及应用的各项指标(约15000项),监控频率为默认的15秒,rrds目录大小9.3GB,磁盘为3块2T SAS硬盘做的AID5。
这就说明每15秒都有9.3GB的磁盘写入量(9.3*1000M/15=620MB/s),又是机械硬盘又是RAID5又是mongodb备份库,长时间如此系统没挂都谢天谢地了。
遇到问题总得解决吧,经过进一步的分析:在监控指标不变的情况下,rrd文件的大小不会有明显的变化(rrd环状数据库的优势特点),即rrds目录大小基本维持在9.3GB左右,且写入巨大且频繁,读操作相对少,看来此种场景只有ssd磁盘和内存能搞定了,ssd暂时没法换了,用内存吧(还好我的内存是16GB的,目前够用,以后监控指标多了就得加内存了),但内存是易丢失性的,如遇服务器重启数据就丢失了,所以就搞个crontab每10分钟将这9.3GB的rrds同步到磁盘文件系统备份保存,监控数据虽很重要但为了系统能正常工作,减轻磁盘压力及对其他业务的影响,10分钟的监控数据丢失还是可以接受的,经测试9.3GB同步到磁盘文件耗时1分钟之内,实在不行就5分钟同步一次磁盘呗。
下面开始具体操作:
停止ganglia
/etc/init.d/gmetad stop
/etc/init.d/gmond stop
备份当前的rrds目录
mv /var/lib/ganglia/rrds/ /var/lib/ganglia/rrds.mirror/
创建tmpfs文件系统
mount -t tmpfs -o size=14G tmpfs /mnt/ramdisk/
符号连接ramdisk到ganglia的rrds目录
ln -s /mnt/ramdisk/ /var/lib/ganglia/rrds
修改rrds目录权限为ganglia.ganglia,ganglia需要此目录的写入权限
chown ganglia.ganglia /var/lib/ganglia/rrds -R
chown ganglia.ganglia /mnt/ramdisk/ -R
启动ganglia
/etc/init.d/gmetad start
/etc/init.d/gmond start
去看看ganglia监控图表,都正常了就ok了。扩展1:
因内存文件系统是易失性的,特别是在断电、系统重启、tmpfs文件系统卸载、重挂载的时候,tmpfs文件系统的数据文件会丢失,为使这些情况下丢失的数据最少(自己平衡),设置crontab每10分钟将ramdisk中的数据同步到磁盘文件系统做备份,我们允许10分钟的监控数据丢失,即监控图像会有10分钟的中断。
[root@min40]# crontab -l
##每10分钟同步内存中的ganglia rrds文件到磁盘文件备份 laijingli 20151202
*/10 * * * * time rsync -av /var/lib/ganglia/rrds/ /var/lib/ganglia/rrds.mirror/ > /tmp/rsync_ganglia_rrds_to_disk.log
9.3GB约15000个rrds文件同步时间大概43秒,还可以接受
[root@min40 ]# time rsync -av /var/lib/ganglia/rrds/ /var/lib/ganglia/rrds.mirror/
real 0m42.122s
user 0m41.545s
sys 0m22.430s
扩展2:
为保证ganglia监控服务器下次重启后监控系统正常工作,需要将将如上操作加入到开机启动,并自动加载最新的rrds文件到ramdisk,以保证监控历史图像的连续性。
[root@ynadmin40]# more /etc/rc.local
扩展3:
tmpfs并不适合所有应用场景,有数据丢失的风险,但对本文中的ganglia监控场景、squid缓存文件场景还是很适合的,适合自己的就是最好的。
优化前后效果对比截图:
将ganglia的rrds目录采用内存磁盘(tmpfs)后,优化效果还是非常明显的(差不多有10倍的提升吧),详见监控截图: