前言
linux硬盘测速,项目中经常遇到在第三方虚拟化平台搭建的操作系统部署业务系统,由于服务器硬盘、虚拟化平台自身问题使得硬盘速度较慢,导致业务系统卡慢超时。
本文主要介绍linux下的硬盘读写速度以及IO测速
“
简单的硬盘读写测速:dd+hdparm
1、测试硬盘读速度:hdparm
硬盘在读写在过程中部分数据通过buffer和cache缓存在内存中从而提高读写速度,hdparm对两种缓存做了区分。
cache缓存:硬盘cache的目的是提高硬盘读/写信息的速度,在硬盘进行读写工作状态下,让更多的数据存储在缓存中,以提高硬盘的访问速度。
buffer缓存:从硬盘里取信息,我们先把读出的数据放在缓冲区,计算机再直接从缓冲区中取数据,等缓冲区的数据取完后再去硬盘中读取,这样就可以减少硬盘的读写次数,计算机对缓冲区的操作大大快于对硬盘的操作,故应用缓冲区可大大提高计算机的运行速度
a.测试buffer缓存下硬盘的读取速度
[root@localhost ~]# hdparm -t /dev/sda
/dev/sda:
Timing buffered disk reads: 1118 MB in 3.01 seconds = 371.97 MB/sec
b.测试cache缓存下硬盘读取速度
[root@localhost ~]# hdparm -T /dev/sda
/dev/sda:
Timing buffered disk reads: 1118 MB in 3.01 seconds = 371.97 MB/sec
c.测试不用buffer缓存情况下,读取10g数据的速度,默认一个offset =1G速度
[root@localhost ~]# hdparm -t --direct --offset 10 /dev/sda
/dev/sda:
Timing O_DIRECT disk reads (offset 10 GB): 1808 MB in 3.00 seconds = 602.32 MB/sec
2、测试硬盘读写速度:dd
dd用于复制,从if读出,写到of,测试出的结果均为顺序读写速度
if=/dev/zero不产生IO,因此可以用来测试纯写速度
同理of=/dev/null不产生IO,可以用来测试纯读速度
bs是每次读或写的大小,即一个块的大小,count是读写块的数量
a.测试纯写速度,8k的块大小写125000次
[root@localhost ~]# dd if=/dev/zero of=test bs=8k count=125000
125000+0 records in
125000+0 records out
1024000000 bytes (1.0 GB) copied, 5.10565 s, 201 MB/s
b.测试纯读速度,8k的块大小写125000次
[root@localhost ~]# dd if=test of=/dev/null bs=8k count=125000
125000+0 records in
125000+0 records out
1024000000 bytes (1.0 GB) copied, 0.361756 s, 2.8 GB/s
c.上述dd命令完成前并没有让系统真正把文件写到硬盘上,dd先把数据写到操作系统“写缓存”,就完成了写操作。需要调用sync函数,把“写缓存”中的数据刷入硬盘。
1、-fsync是将数据已经写入硬盘,但是是在经过缓存后最后再写入硬盘
[root@localhost ~]# dd if=/dev/zero of=test bs=8k count=125000 conv=fsync
125000+0 records in
125000+0 records out
1024000000 bytes (1.0 GB) copied, 5.31894 s, 193 MB/s
2、 -dsync 可以当成是模拟数据库插入操作,在/dev/zone中读出一条数据就立即写入硬盘,速度会很慢
[root@localhost ~]# dd if=/dev/zero of=test bs=8k count=1250 oflag=dsync
1250+0 records in
1250+0 records out
10240000 bytes (10 MB) copied, 1.18191 s, 8.7 MB/s
“
专业的硬盘压测工具:FIO
利用fio进行测试时,需要将旧的硬盘先卸载掉然后格式化。或者添加一块新硬盘后格式化。如果磁盘已经挂载,执行fio会提示/dev/sdb appears mounted, and 'allow_mounted_write' isn't set. Aborting.
umount /dev/sdb # 卸载硬盘
mkfs.ext4 /dev/sdb # 格式化硬盘
a.参数说明
filename=/dev/sdb 测试文件名称,通常选择需要测试的盘的data目录。
direct=1 测试过程绕过机器自带的buffer。使测试结果更真实。
rw=randwrite 测试随机写的I/O
rw=randrw 测试随机写和读的I/O
bs=16k 单次io的块文件大小为16k,如不写默认为4k
size=1g 测试文件大小为1g
iodepth 测试的io深度
numjobs=1 本次的测试线程数
runtime=60 测试时间为60秒
ioengine=psync io引擎使用pync方式
rwmixwrite=30 在混合读写的模式下,写占30%
group_reporting 关于显示结果的,汇总每个进程的信息
b.4K 随机写,队列深度为1,10g的数据,测试线程数为1,测试时间 60s
fio -name=fiotest -filename=/dev/sdb -group_reporting -direct=1 -ioengine=libaio -iodepth=1 -size=1g -rw=randwrite -bs=4k -numjobs=1 -runtime=60
c.测试 1M 顺序读,队列深度为1,10g的数据,测试线程数为1,测试时间 60s:
fio -name=fiotest -filename=/dev/vdb -group_reporting -direct=1 -ioengine=libaio -iodepth=1 -size=1g -rw=read -bs=1M -numjobs=1 -runtime=60
d.结果参数解析
磁盘的吞吐量bw,这个是顺序读写主要关注的参数
磁盘的每秒读写次数iops,这个是随机读写主要关注的参数
io=执行了多少M的IO
bw=平均IO带宽
iops=IOPS
runt=线程运行时间
slat=提交延迟
clat=完成延迟
lat=响应时间
bw=带宽
cpu=利用率
IO depths=io队列
IO submit=单个IO提交要提交的IO数
IO latencies=IO完延迟的分布
io=总共执行了多少size的IO
aggrb=group总带宽
minb=最小.平均带宽.
maxb=最大平均带宽.
mint=group中线程的最短运行时间.
maxt=group中线程的最长运行时间.
ios=所有group总共执行的IO数.
merge=总共发生的IO合并数.
ticks=Number of ticks we kept the disk busy.
io_queue=花费在队列上的总共时间.
util=磁盘利用率
版权归原作者 jiakaxi 所有, 如有侵权,请联系我们删除。