分类: LINUX
2013-11-25 13:35:51
最近我们的redis服务在晚上定时重写aof的时候,经常出现IO跑满、swap增加以致服务拒绝的现象,所以花了些时间研究下dd工具,测试下是否是IO瓶颈引起的服务问题。
比较简单好用的磁盘压力测试工具,只适合用来测试磁盘的顺序读写能力,理论上文件越大测试结果越准确。
redis持久化的两种方式中,无论是生成rdb,还是重写aof,都是顺序的:
首先,redis重写aof或生成rdb,都只需直接遍历内存后写成特定格式,所以不存在磁盘的物理读;
其次,写aof或者rdb,都是批量的append模式,不存在随机写。
所以,可以用dd来模拟redis重写aof或生成rdb的过程:
dd benchmark (dd_benchmark.sh)
1
2
3
4
|
dd if=/dev/zero bs=4K count=2000000 of=data.file oflag=direct,nonblock dd if=/dev/zero bs=8K count=2000000 of=data.file oflag=direct,nonblock ... dd if=/dev/zero bs=64K count=2000000 of=data.file oflag=direct,nonblock |
其中,bs size为16K时,dstat输出如下。IOPS为12600,平均大小为16K,每秒写入差不多200M,结果吻合。
采用不同的bs size,逐渐增加每次批量写入的数据块大小,使dd在每次写入的时候,尽量节省寻址时间和旋转时间,只剩下数据传输时间,这样才能得到最大的吞吐量,测试结果如下:
1. 当bs size为48K的时候,IOPS约为8000,吞吐量达到390M,此后再增加bs size,已经无法再提高吞吐量,说明磁盘的最大吞吐量就是390M。
2. dstat的输出中可以看到,采用了direct IO模式后,page cache的量一直稳定不变,避免测试被page cache影响。dd默认会使用page cache,如果不指定oflag=direct,测试过程中你可能会看到page cache不断增加,导致测试结果不太准确。
3. dstat-0.6的某些版本有bug,在计算磁盘吞吐量的时候与iostat的输出不同,已经证实这是,建议大家升级到0.7版本。
dstat是一个用来替换 vmstat,iostat netstat,nfsstat和ifstat这些命令的工具, 是一个全能系统信息统计工具. 与sysstat相比, dstat拥有一个彩色的界面, 在手动观察性能状况时, 数据比较显眼容易观察; 而且dstat支持即时刷新, 譬如输入dstat
3, 即每三秒收集一次, 但最新的数据都会每秒刷新显示. 和sysstat相同的是, dstat也可以收集指定的性能资源, 譬如 dstat
-c 即显示CPU的使用情况.
下载安装文件dstat-0.6.7-1.el*.rf.noarch.rpm:
# cd /tmp
# rz (上传安装包)
# rpm -Uvh dstat-0.6.7-1.el*.rf.noarch.rpm
# which dstat
/usr/bin/dstat
# dstat
安装完成后, 执行 dstat 命令, 默认情况它会收集-cpu-,-disk-,-net-,-paging-,-system-的数据, 一秒钟收集一次. 默认输入dstat等于输入了dstat -cdngy 1或dstat -a 1. 推荐使用 date
&& dstat -tclmdny 60 一分钟监视一次(注意调节显示的宽度, 或去掉-t选项).
-c, -cpu 显示CPU情况
-C 0,3,total include cpu0, cpu3 and total
-d, -disk 显示磁盘情况
-D total,hda include hda and total
-g, -page enable page stats
-i, -int enable interrupt stats
-I 5,eth2 include int5 and interrupt used by
eth2
-l, -load enable load stats
-m, -mem 显示内存情况
-n, -net 显示网络情况
-N eth1,total 可以指定网络接口
-p, -proc enable process stats
-s, -swap 显示swap情况
-S swap1,total 可以指定多个swap
-t, -time enable time counter
-y, -sys enable system stats
-ipc 报告IPC消息队列和信号量的使用情况
-lock enable lock stats
-raw enable raw stats
-tcp enable tcp stats
-udp enable udp stats
-unix enable unix stats
-M stat1,stat2 enable external stats
-mods stat1,stat2
-a, -all 使用-cdngy 缺省的就是这样显示
-f, -full 使用 -C, -D, -I, -N and -S 显示
-v, -vmstat 使用-pmgdsc -D 显示
-integer show integer values
-nocolor disable colors (implies -noupdate)
-noheaders 只显示一次表头以后就不显示了,使用重定向写入文件时很有用
-noupdate disable intermediate updates
-output file 写入到CVS文件中
这个软件和vmstat很像, 不过和vmstat相比好像少了io部份的显示, dstat只能显示磁盘的吞吐量而不是显示负载情况, dstat和几乎所有监控软件一样, 只能对整个系统进行监控而不能对某一个进程或某一个程序进行深入分析. 我常使用的参数是dstat -cdlmnpsy, 做个别名链接alias dstat='dstat -cdlmnpsy'