iostat用法与sysbench测试数据库主机注意事项和部分linux/MySQL部分磁盘参数调优
记录一下用iostat对磁盘进行的测试。
测试用例:iostat -xm 3

结果的上半部分是cpu的平均数据。
通常是user所占的cpu会多一点。
%idle表示cpu空闲时间。

device表示目前的设备。
rrqm/s 每秒发起合并读的请求。每秒这个设备相关的读取请求有多少被Merge了(当系统调用需要读取数据的时候,VFS将请求发到各个FS,如果FS发现不同的读取请求读取的是相同Block的数据,FS会将这个请求合并Merge)。
wrqm/s 每秒合并写的请求。合并写的原理如上
r/s 每秒读的次数。
w/s每秒写的次数。
r/s + w/s 就是我们常说的IOPS。(IOPS还有另一种计算方法,比如说某SSD厂商,标注我的磁盘4k random write能达到100mb/s。那么IOPS的计算方式就是:1mb/4k * 100。当然这个并不能代表实际的IOPS,因为这里的4k是操作系统的页大小,mysql的是16k,而且你线上环境肯定还做了raid。目前SSD技术非常好了,基本上读写的IOPS都差不多,尤其是PCIE的不会差很多。但是除PCIE的sata和sas,可能会有读写不对称的情况,写入可能只有读取的一半左右。)
rMB/s和wMB/s只是将上面的读取转化为带宽。就是上面括号里举的例子。
avgrq-sz 每秒读取的扇区数量,扇区是固定512字节的,这个值乘512就是整个块大小了。我这边跑出来是8,乘以512 就是4k,等于linux默认的块大小了。
avgqu-sz 平均队列长度。对于SSD,差不多是2位数左右。
await 等待时间。毫秒
r_await 读的等待时间。毫秒
w_await 写的等待时间。毫秒
svctm 服务时间。这个值不用关注,这个值本身取得不准确。
%util 磁盘使用率。通常来说,直接看这个参数就行了,90%以上就代表这个磁盘比较繁忙了。尤其是对于HDD。对于SSD,即使它比较繁忙,也能工作得不错。SSD需要结合avgqu-sz来看,如果avgqu-sz只是个位数,那么这个磁盘还能再繁忙一点。
而在这,我想插入谈一下怎么用sysbench去测试数据库主机的注意事项。
语句:sysbench --test=fileio --file-num=1 --file-block-size=4096 --file-total-size=25G --file-extra-flags=direct --file-test-mode=rndwr --max-time=300 --max-requests=0 --file-fsync-freq=1 --num-theads=16 --report-interval=1 run
这里面有2个参数要特别注意,一个是 --file-block-size=4096 4096是linux的默认页大小,如果只是测试linux写入性能,用4096就行了,如果是要测试mysql,需要和你的数据库页大小对齐,默认是16k。
其次是--file-fsync-freq=1和--file-extra-flags=direct,对于数据库的测试,有且只有一个值,就是1和direct。为什么设置成1。请让我先画一幅图再做解释:

我们在向Linux写入数据时。首先fopen(file,wb)获取文件句柄,获取句柄后fwrite(fd,offset,data,len)。
问题就在fwrite,他实际写入是写入os的page size。他是没有写入file system的。也就是说,在这个时候,假设服务器挂了,那么数据就没了。想要保证数据完整,那么你得做fsync()。
而在MySQL中,有这么一个参数:innodb_flush_method,通常设置为O_DIRECT,意思是MySQL不经过OS,直接写入file system,也就是调用的fopen(file,wb,O_DIRECT)。sysbench中--file-fsync-freq=1的意思就是每写入几次,调用一次fsync()。为了保证和数据库一致。这里必须是1。即:每次调用完fwrite后都要调用fsync()。而--file-extra-flags=direct就是启用O_DIRECT。
当然你启用了--file-extra-flags=direct的情况下,--file-fsync-freq就无所谓了,直接改成0就行了。
最后提一嘴,很多人将这个参数调大,会发现写入很不均衡,假设保持10秒100mb的写入,突然一下子调到10mb。原因就是page size大小是有限的。OS会有自己的算法,将page size中的数据落盘。所以这样测出来的磁盘性能是不严谨的。
顺带一提innodb_io_capacity,指的是每秒写入的IOPS,这个参数就要根据你的压测结果和线上业务的读写比去设置,与业务相关的参数都很难调。我觉得设置成你测试出来的IOPS一半就行了。而且这个业务的读写比是很难去测定的,因为你业务有redis去做缓存,实际发生在磁盘上的读写比太难去测量了。
而对于SSD,还有个参数innodb_flush_neighbors,一定要调为0。然后把innodb_log_file_size调高,目前调个16G,对于整个磁盘应该是完全没有问题的,最少来个4G吧。
然后对于linux,推荐xfs和ext4的文件系统。
然后关闭swap。
然后mount -o noatime,nobarrier /dev/sdb1 /data
echo deadline > /sys/block/vda/queue/scheduler

浙公网安备 33010602011771号