1-hdparm
hdparm是一个Linux硬盘性能测试工具,可以用来测试磁盘的读取速度。
$ sudo yum install hdparm # 安装hdparm
$ sudo hdparm -Tt /dev/vda1 # 测试vda1分区的读取速度
[root@VM-12-14-centos ~]# sudo hdparm -Tt /dev/vda1
/dev/vda1:
Timing cached reads: 16198 MB in 1.99 seconds = 8145.06 MB/sec
Timing buffered disk reads: 494 MB in 3.21 seconds = 153.84 MB/sec
2-dd dd命令也是一个常用的Linux性能测试工具,可以测试磁盘的写入/读取速度。
例如,我们可以执行以下命令来测试磁盘的写入速度:
$ dd if=/dev/zero of=./testfile bs=1M count=1000 conv=fdatasync
该命令将在当前目录下创建一个大小为1G的文件,并在写入时强制同步到硬盘。执行完毕后,我们可以看到dd的输出信息,其中:
if=/dev/zero 表示输入流来自/dev/zero,即输入的全是0;
of=./testfile 表示输出到当前目录下的testfile文件;
bs=1M 表示块大小为1M;
count=1000 表示写入1G数据;
conv=fdatasync 表示写入时强制同步到硬盘。
测试结果
针对不同的硬盘类型,测试结果也会有较大差异。以下是测试结果的样例:
机械硬盘
当VPS采用机械硬盘时,测试结果如下:
$ sudo hdparm -Tt /dev/vda1
/dev/vda1:
Timing cached reads: 12596 MB in 2.00 seconds = 6307.68 MB/sec
Timing buffered disk reads: 6 MB in 3.28 seconds = 1.83 MB/sec
$ dd if=/dev/zero of=./testfile bs=1M count=1000 conv=fdatasync
1000+0 records in
1000+0 records out
1048576000 bytes (1.0 GB, 1000 MiB) copied, 139.432 s, 7.5 MB/s
可以看到,机械硬盘的读取速度和写入速度都非常低,只有1.83 MB/s和7.5 MB/s。这也是为什么VPS服务商们都推荐使用SSD的原因之一。
SSD
当VPS采用SSD时,测试结果如下:
$ sudo hdparm -Tt /dev/vda1
/dev/vda1:
Timing cached reads: 16792 MB in 2.00 seconds = 8414.11 MB/sec
Timing buffered disk reads: 1512 MB in 3.01 seconds = 502.65 MB/sec
$ dd if=/dev/zero of=./testfile bs=1M count=1000 conv=fdatasync
1000+0 records in
1000+0 records out
1048576000 bytes (1.0 GB, 1000 MiB) copied, 6.83593 s, 153 MB/s
可以看到,SSD的读取速度和写入速度都非常高,能够达到502.65 MB/s和153 MB/s左右。
3-fio
FIO(Flexible I/O Tester)是一个用于测试磁盘、文件系统、块设备和网络设备性能的工具。它可以模拟不同类型的I/O负载,包括随机读写、顺序读写、混合读写、顺序或随机访问等[2],常见的用途是编写和模拟I/O负载匹配的作业文件,也就是说FIO是一个多线程I/O生成工具。FIO还提供了丰富的选项和参数,可以对测试进行高度定制化配置,并且会记录每个测试任务的性能指标(包括IOPS、吞吐量、延迟、CPU占用率等),最后还会生成结果报告,测试结果详细又准确。
FIO是一个开源软件,可在Linux、Windows等多种平台上运行。安装方式可分为离线安装和在线安装两种,本次介绍Linux操作系统离线安装的方法[3]。
1、下载并安装相应操作系统的libaio开发包
2、下载FIO安装包,下载后上传至服务器
3、执行命令解压安装包:tar -xzf fio-X.XX.tar.gz
4、进入解压目录:cd fio-X.XX/
5、执行配置环境命令:./configure
6、执行编译命令:make
7、执行安装命令:make install
然后就可以使用FIO命令啦。
FIO工具使用
基础命令(例) fio --name=TESTXX --filename=/dev/vdX --bs=4k --numjobs=1
–iodepth=64 --rw=randwrite --ioengine=libaio --direct=1 --norandommap --group_reporting --runtime=1800 --time_based
参数解释
–name 标识整个测试任务的名称
–filename 测试的磁盘文件名
–bs 单次写入的IO的块文件大小
–numjobs 定义测试的并发线程数
–iodepth 每个线程的队列深度
–rw 定义测试时的读写策略,可选的参数:write顺序写;read顺序读;readwrite顺序混合读写;randwrite随机写;randread随机读;randrw随机混合读写
–ioengine 采用的文件读写方式,可选参数:
sync:采用read、write,使用fseek定位读写位置。psync:采用pread、pwrite进行文件读写操作
vsync:采用readv(2) or writev(2)进行文件读写操作 libaio:Linux异步读写IO
posixaio:glibc POSIX异步IO读写
–direct 测试是否采用直接IO方式进行读写,如果采用直接IO,则取值direct=1;否则取值direct=0。采用直接IO写测试,会使得测试结果更加真实[4]
–norandommap 在进行随机I/O时,FIO将覆盖文件的每个块。若给出此参数,则将选择新的偏移量而不查看I/O历史记录
–group_reporting 显示结果
–runtime 测试任务运行时间,单位为s
–time_based 如果设置的job已被完全读写或写完,也会执行完runtime规定的时间,它是通过循环执行相同的负载来实现的,加上这个参数可以防止job提前结束
–size 测试文件的大小
读写注意事项
1、没有写过数据的盘做读操作之前需要进行一遍写操作,否则会存在读空数据的情况[5],测试结果会不准确,其中体现的性能会很高,不能代表存储实际性能。
2、每次测试前建议执行echo 3 > /proc/sys/vm/drop_caches清理缓存。
FIO执行结果分析
1、Jobs: 1 (f=1): [w(1)][100.0%][w=197MiB/s][w=50.4k IOPS][eta 00m:00s]
当前运行和执行I/O的线程数为1,当前打开的文件数(f=)为1。
第一组括号中的字符表示每个线程的当前状态,示例中为W,表示写。当为R时,表示顺序读;r表示随机读;w表示随机写;M表示混合顺序读/写;m表示混合随机读/写。
第二组括号显示当前估计完成百分比,因为已经命令已经执行完,所以是100%。
第三组括号分别显示读取和写入I/O速率,由于当前执行写测试,故只显示写入的I/O速率。
第四组括号以带宽和IOPS表示第三组括号的内容。
最后一组括号显示预估的作业剩余运行时间。
2、write: IOPS=41.1k, BW=160MiB/s (168MB/s)(282GiB/1800002msec); 0 zone resets
写入测试结果,IOPS是每秒执行的平均I/O,BW是平均带宽速率,最后括号内的值是执行的总I/O和该线程的运行时长。
3、slat (nsec): min=1461, max=498016, avg=4173.78, stdev=2610.17 slat是submit latency的缩写,表示I/O的提交延时(同步I/O时不显示此项),单位是纳秒(ns),结果展示最小、最大、平均和标准偏差。
4、clat (μsec): min=286, max=1157.8k, avg=1553.71, stdev=8662.21 clat是complete latency的缩写,与slat的名称类似,表示从提交到完成I/O的时间,单位是微秒(μs)。
5、lat (μsec): min=390, max=1157.8k, avg=1557.88, stdev=8662.23 lat是latency的缩写,表示总延迟。与slat和clat的名称类似,表示从fio创建I/O单元到完成I/O操作的时间,单位是微秒(μs)。
6、clat percentiles (μsec):
| 1.00th=[529], 5.00th=[635], 10.00th=[709], 20.00th=[816],
| 30.00th=[914], 40.00th=[1004], 50.00th=[1090], 60.00th=[1205],
| 70.00th=[1336], 80.00th=[1500], 90.00th=[1795], 95.00th=[2147],
| 99.00th=[3720], 99.50th=[5735], 99.90th=[152044], 99.95th=[217056],
| 99.99th=[312476]
clat percentiles表示I/O完成延时百分位的数值,单位是微秒(μs)。
7、bw(KiB/s):min=504,max=235760,per=100%,avg=164324.11,stdev=45964.06,samples=3599
bw表示对采集到样本的带宽统计,单位是(KiB/s),结果展示最小、最大、该线程在其组中接收总带宽的百分比、平均、标准偏差及本次测试采样数。
8、iops : min=126, max=58940, avg=41080.99, stdev=11491.01, samples=3599
iops表示对采集到样本每秒的输入/输出操作的统计,结果展示最小、最大、平均、标准偏差及本次测试采样数。
9、lat (μsec) : 500=0.47%, 750=12.96%, 1000=26.45%
lat (msec) : 2=53.67%, 4=5.57%, 10=0.57%, 20=0.07%, 50=0.06%
lat (msec) : 100=0.04%, 250=0.11%, 500=0.02%, 750=0.01%, 1000=0.01%
lat (msec) : 2000=0.01%
I/O完成延迟的分布,是从I/O离开fio到完成的时间。本例中,500=0.47%表示0.47%的I/O在500μs以下完成,750=12.96% 意味着12.96%的I/O需要750到500μs完成,以此类推。
10、cpu : usr=4.50%, sys=17.58%, ctx=18177571, majf=0, minf=12
CPU利用率,用户(usr)和系统(sys)的占比,ctx指该线程上下文切换次数,majf指主要页面错误数,minf指次要页面错误数。CPU利用率取的是平均值,上下文切换次数和错误数则是相加求和后的结果。
11、IO depths : 1=0.1%, 2=0.1%, 4=0.1%, 8=0.1%, 16=0.1%, 32=0.1%, >=64=100.0%
在作业生命周期内I/O深度的分布。数字被划分为2的幂,每个条目覆盖从该值到低于下一个条目的深度。
12、submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
一个提交调用中要提交的I/O,每个条目覆盖从该值到上一个条目为止,例如4=100%表示每个提交调用中提交了0~4个I/O。
13、complete : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.1%, >=64=0.0% 一个完成调用中要提交的I/O,每个条目覆盖从该值到上一个条目为止,例如4=100%表示每个提交调用中完成了0~4个I/O。
14、issued rwts: total=0,73923277,0,0 short=0,0,0,0 dropped=0,0,0,0
发出的读/写/修改请求的数量,以及其中短请求和丢弃的数量。
15、latency : target=0, window=0, percentile=100.00%, depth=64
打印满足指定延迟目标所需的I/O深度。
16、Run status group 0 (all jobs):
WRITE: bw=160MiB/s (168MB/s), 160MiB/s-160MiB/s (168MB/s-168MB/s), io=282GiB (303GB), run=1800002-1800002msec
bw表示此组中线程的聚合带宽,然后是此组中所有线程的最小和最大带宽。io表示该组中所有线程执行的I/O,格式与bw相同,run表示此组中线程的最短和最长运行时间。
17、Disk stats (read/write):
vdb: ios=40/73917700, merge=0/0, ticks=103/112920852, in_queue=26848192, util=100.00%
最后,打印磁盘统计信息。每个参数都会输出读和写的值,读的值在前,写的值在后。ios表示所有组执行的I/O数。merge表示I/O计划程序执行的合并数。ticks表示磁盘忙的滴答数。in_queue表示在磁盘队列中花费的总时间[6]。util表示磁盘利用率,值越大意味着磁盘越繁忙,100%意味着磁盘一直处于繁忙状态。
1、fio评测硬盘IO性能
2、fio性能测试-环境搭建,功能介绍,测试讲解
3、磁盘性能测试工具-FIO的安装及使用
4、fio性能测试工具
5、fio常见使用方法
6、fio执行结果说明
4-磁盘检查
磁盘的 S.M.A.R.T. 监控机制
S.M.A.R.T. 全称 Self-Monitoring, Analysis and Reporting Technology 即“自我监测分析与报告技术”,SMART技术可以对硬盘的温度、内部电路、盘片表面介质材料等进行实时监测,旨在及时发现可能出现的问题并发出警告。现在的硬盘基本上都支持此技术。
磁盘检查修复一般需要卸载磁盘(不能挂载到系统中正在使用),有些分区是系统分区,使用中无法卸载,不能磁盘修复,可以使用winPE工具箱,或者Linux的Live-CD模式,从U盘启动系统进行操作
Linux系统可以用smartctl命令
sudo apt-get install smartmontools
sudo smartctl -H /dev/sda
sudo smartctl --all /dev/sda
linux使用如下命令对某个磁盘或分区进坏块检查:
badblocks -svo badblock_sda8.log /dev/sda8
对于ext2、ext3、ext4文件系统可以使用e2fsck命令,它可以检查修复文件系统的错误,调用上文提到的badblocks命令检测坏块,在inode中屏蔽坏块。
sudo e2fsck -fccky /dev/sdXX
其他Linux文件系统,可以使用fsck命令,它可以自动调用fsck.ex4、fsck.fat 等命令进行磁盘检查修复。
Windows可以使用各种磁盘工具,比如DiskGenius, CrystalDiskInfo
chkdsk命令 ,是Windows文件系统格式磁盘修复的王者,其可以修复文件系统问题,检查坏道,而且速度非常快。
一般需要在管理员权限下运行:
chkdsk /f D:
参考文献
https://mp.weixin.qq.com/s/ksYpCspW8fS2DT_IquUVcA
https://mp.weixin.qq.com/s/31aB9CP0QJQ5xi2n3p8qvA