0


Linux硬盘测速

前言

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=磁盘利用率

标签: 硬件架构

本文转载自: https://blog.csdn.net/qq_52604591/article/details/129040324
版权归原作者 jiakaxi 所有, 如有侵权,请联系我们删除。

“Linux硬盘测速”的评论:

还没有评论