采用tmpfs文件系统极速优化ganglia磁盘IO性能20151203


最近遇到了一个问题,

问题现象: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/

挂载tmpfs到ganglia的rrds目录

mount /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

###优化ganglia写rrd文件性能,解决磁盘io问题
###开机自动挂载tmpfs-->mount rrds to ramdisk-->加载最近的rrds数据到ramdisk-->修改rrds目录权限为ganglia
#mount -t tmpfs -o size=14G tmpfs /mnt/ramdisk/
#ln -s /mnt/ramdisk/ /var/lib/ganglia/rrds
#rsync -av /var/lib/ganglia/rrds.mirror/ /var/lib/ganglia/rrds/ > /tmp/rsync_ganglia_rrds_to_ramdisk.log
#chown ganglia.ganglia /var/lib/ganglia/rrds -R
#chown ganglia.ganglia /mnt/ramdisk/ -R

 

扩展3:

tmpfs并不适合所有应用场景,有数据丢失的风险,但对本文中的ganglia监控场景、squid缓存文件场景还是很适合的,适合自己的就是最好的。

 

优化前后效果对比截图:

将ganglia的rrds目录采用内存磁盘(tmpfs)后,优化效果还是非常明显的(差不多有10倍的提升吧),详见监控截图:

\

\

\

\

\

 

 

 

 

相关内容