磁盘性能测试工具-FIO的安装及使用

article/2025/10/15 22:42:03

文章目录

        • FIO介绍
        • FIO安装
          • 在线安装
          • 离线安装
        • 磁盘测试
          • 命令行方式
          • 测试结果说明
          • 命令参数说明
          • 配置文件方式
        • dd命令介绍
        • 使用方法

FIO介绍

FIO是一款测试IOPS的工具,用于对磁盘进行压力测试和验证,磁盘I/O是检查磁盘性能的重要指标,可以按照负载情况分成照顺序读写,随机读写两大类,FIO可产生很多线程或进程并执行用户指定的特定类型的I/O操作,典型用途是编写和模拟I/O负载匹配的作业文件,也就是说FIO是一个多线程I/O生成工具,可以生成多种I/O模式,用来测试磁盘设备的性能

FIO安装

本次是在CentOS 8.3中安装fio-3.32版本

在线安装

执行以下命令即可

yum install libaio-devel -y	# 安装libaio开发包
yum install fio -y			# 安装fio
fio -v		# 查看fio版本

如果执行fio命令,报fio: engine libaio not loadable fio: failed to load engine错误,则是libaio-devel未安装成功,重新安装成功后即可解决

离线安装
  1. 需先具备gcc环境,gcc安装请参考此文章

  2. 在此平台下载相应操作系统的libaio开发包,下载后上传至服务器,执行以下命令进行安装

    rpm -ivh libaio-devel-0.3.112-1.el8.x86_64.rpm	# 安装libaio开发包
    
  3. 在官网下载fio安装包,下载后上传至服务器,执行以下命令进行安装

    tar -xzf fio-3.32.tar.gz	# 解压
    cd fio-3.32/				# 进入解压后的目录
    ./configure					# 配置环境
    make && make install		# 编码后安装
    

    之后就可以使用fio命令啦

磁盘测试

新建两个磁盘,格式化后挂载到指定目录

lsblk				# 查看磁盘,可以看到磁盘名称、磁盘大小、磁盘类型。挂载点等信息
mkfs.ext4 /dev/sdb	# 将sdb的块设备格式化为ext4文件系统的标准磁盘
mkfs.ext4 /dev/sdc	# 将sdc的块设备格式化为ext4文件系统的标准磁盘
mount /dev/sdb T1/	# 将sdb挂载到T1目录
mount /dev/sdc T2/	# 将sdc挂载到T2目录
df -Th | grep ext4 	# 查看使用ext4类型的文件系统,可以看到容量、挂载点、使用量等信息,或者还使用lsblk查看

请添加图片描述

命令行方式

意思是使用libaio异步引擎测试磁盘文件/dev/sdb随机写入操作,测试配置为使用非缓存I/O,1个线程,I/O深度为2,汇总输出一份报告,允许写入磁盘,每次写入4k,总共写入1G,运行时间60秒,本次测试命名为fioTest

fio -filename=/dev/sdb -ioengine=libaio -direct=1 -thread=1 -iodepth=2 -group_reporting  -rw=randwrite -allow_mounted_write=1 -bs=4k -size=1G -runtime=60 -name=fioTest
测试结果说明
fioTest: (g=0): rw=randwrite, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=libaio, iodepth=2
fio-3.32
Starting 1 thread
Jobs: 1 (f=1): [w(1)][100.0%][w=26.8MiB/s][w=6873 IOPS][eta 00m:00s]
fioTest: (groupid=0, jobs=1): err= 0: pid=1949: Sun Oct 23 19:50:16 2022
# ↓写入测试结果,IOPS是每秒执行的平均I/O,BW是平均带宽速率,以2的n次幂为基础得到的值,括号内是以10的n次幂未基础得到的值),最后括号内的值是以2的n次幂为基础计算得到的总I/O和该线程的运行时长write: IOPS=6928, BW=27.1MiB/s (28.4MB/s)(1024MiB/37833msec); 0 zone resets# ↓slat是submit latency的缩写, 表示I/O的提交延时(同步I/O时不显示此项),单位是微秒(us),结果展示最小、最大、平均和标准偏差slat (usec): min=24, max=7873, avg=101.91, stdev=37.68# ↓clat是complete latency的缩写,表示I/O的完成延时,单位纳秒(ns)clat (usec): min=28, max=8590, avg=183.87, stdev=119.90# ↓lat是latency的缩写,表示I/O的总延时,单位也是微秒(us)lat (usec): min=63, max=8885, avg=285.78, stdev=125.51# ↓clat percentiles表示I/O完成延时百分位的数值,单位是微秒(us)clat percentiles (usec):|  1.00th=[   78],  5.00th=[   94], 10.00th=[  108], 20.00th=[  139],| 30.00th=[  149], 40.00th=[  155], 50.00th=[  163], 60.00th=[  172],| 70.00th=[  182], 80.00th=[  200], 90.00th=[  239], 95.00th=[  310],| 99.00th=[  742], 99.50th=[  898], 99.90th=[ 1270], 99.95th=[ 1483],| 99.99th=[ 2343]# ↓bw表示对采集到的样本的带宽统计,单位是(KiB/s),结果展示最小、最大、该线程在其组中接收总带宽的百分比、平均、标准偏差及本次测试采样数bw (  KiB/s): min=25848, max=35609, per=100.00%, avg=27741.13, stdev=1890.47, samples=75# ↓iops表示对采集到的样本每秒的输入/输出操作的统计,结果展示最小、最大、平均、标准偏差及本次测试采样数iops        : min= 6462, max= 8902, avg=6935.04, stdev=472.65, samples=75# ↓延时分布,表示I/O总延时的分布范围,如下表示小于50us的有0.15%,在50~100us中的有7.17%,……lat (usec)   : 50=0.15%, 100=7.17%, 250=84.05%, 500=6.06%, 750=1.61%lat (usec)   : 1000=0.65%lat (msec)   : 2=0.29%, 4=0.01%, 10=0.01%# ↓CPU利用率,用户(usr)和系统(sys)的占比,ctx指该线程上下文切换次数,majf指主要页面错误数,minf指次要页面错误数。CPU利用率取的是平均值,上下文切换次数和错误数则是相加求和后的结果cpu          : usr=0.28%, sys=74.03%, ctx=101519, majf=0, minf=2# ↓depth、submit和complete三者所涵盖的范围可以不同# ↓I/O深度在整个工作周期中的分布,数值划分为2的n次幂,每个条目覆盖从该值到下一个条目的深度,例如:2=100%表示覆盖从2到4的深度IO depths    : 1=0.1%, 2=100.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, >=64=0.0%# ↓一个提交调用中要提交的I/O,每个条目覆盖从该值到上一个条目为止,例如4=100%表示每个提交调用中提交了0~4个I/Osubmit    : 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/Ocomplete  : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%# ↓总共发出读取/写入/修剪/?请求的数量,及其中有多少个请求被缩短或丢弃(第4个s不清楚表示什么,等后续官方文档更新吧)issued rwts: total=0,262144,0,0 short=0,0,0,0 dropped=0,0,0,0# ↓用于latency_target和相关选项,打印满足指定延迟目标所需的I/O深度latency   : target=0, window=0, percentile=100.00%, depth=2# ↓输出各组统计信息
Run status group 0 (all jobs):# ↓bw指该组中线程的总带宽,然后是该组中所有线程的最小和最大带宽,I/O指该组中所有线程执行的聚合I/O,括号外的值是2的幂形式,括号内是10的幂的形式,run指运行时间WRITE: bw=27.1MiB/s (28.4MB/s), 27.1MiB/s-27.1MiB/s (28.4MB/s-28.4MB/s), io=1024MiB (1074MB), run=37833-37833msec# ↓输出磁盘状态
Disk stats (read/write):# ios表示所有组执行的I/O数,merge表示I/O调度程序执行的合并数,ticks表示处理I/O的总时间,in_queue表示在磁盘队列中花费的总时间,util表示磁盘利用率,若值为100%则表示磁盘一直处于繁忙状态sdb: ios=4/260966, merge=0/0, ticks=6/55631, in_queue=1141, util=99.85%

通常查看结果中IOPS、带宽和延时是否满足需求,从上面的测试结果可知,本次测试随机写入操作的结果:IOPS为6928,带宽为27.1MiB/s,延时为285.78微秒(0.28578毫秒)

请添加图片描述

具体测试参数配置请根据实际环境修改

# 测试单个磁盘文件
fio -filename=/dev/sdb -ioengine=libaio -direct=1 -iodepth=1 -thread=1 -numjobs=2 -group_reporting -allow_mounted_write=1 -rw=randwrite -bs=4k -size=1G -runtime=60 -name=fioTest
# 测试多个磁盘文件
fio -filename=/dev/sdb:/dev/sdc -ioengine=libaio -direct=1 -iodepth=1 -thread=1 -numjobs=2 -group_reporting -allow_mounted_write=1 -rw=rw -rwmixwrite=30 -bs=4k -size=1G -runtime=60 -name=fioTest
# 通过挂载目录测试磁盘,多个挂载点用:分隔
fio -directory=/root/T1:/root/T2 -ioengine=libaio -direct=1 -iodepth=1 -thread=1 -numjobs=2 -group_reporting -allow_mounted_write=1 -rw=randrw -rwmixread=70 -bs=4k -size=1G -runtime=60 -name=fioTest
命令参数说明

命令参数说明如下表所示,更详细的参数及说明见请查看官方文档

参数解释
directory=/root/T1被测文件挂载的目录,多个目录使用:符号分割
filename=/dev/sdb被测文件名,多个文件则使用:符号分割
direct=1使用非缓存I/O,使测试磁盘的结果更真实,默认为False,可以用0和1表示
rw=read顺序读(100%顺序读)
rw=write顺序写(100%顺序写)
rw=randread随机读写(100%随机读)
rw=randwrite随机写(100%随机写)
rw=randrw随机读写(读写各占50%)
rw=rw, rwmixread=70顺序读写(读写占比为7:3,占比可自行修改)
rw=randrw, rwmixwrite=30随机读写,读写占比为7:3
rw=trim/randtrim/trimwrite磁盘修剪,需要磁盘支持此功能,可根据读写一样进行配置
bs=4k单次I/O的块大小,默认4k
bs=4k,8K单次以4k块大小读取,以8k写入和修剪
bs=16k,32K,单次以16k读取,以32k大小写入,以默认大小4k修剪
bsrange=8k-1M与bs功能相同,只是使用范围表示单次I/O的块大小
size=1G每个线程读写的数据量为1GB
thread=1使用pthread_create创建线程,默认使用fork创建
numjobs=2克隆此次测试的线程/进程数量,可用于设置更多执行相同操作的线程/进程
group_reporting每个线程的测试结果汇总后输出,糖厂和
allow_mounted_write=1允许写入操作,某些平台可能即使有此参数也无法写入
runtime=100测试时间,若测试提取完成则提前结束并输出结果,若到达时间后测试尚未完成则会强制结束并输出结果
ramp_time=10在测试开始前先执行10秒,可以理解为忽略前10秒的测试结果,有助于得到更稳定的测试数据
ioengine=libaio|sync|自定义指定io引擎,可自定义,官方也提供了多种方式
iodepth=2队列深度为2,默认为1
name=fioTest定义本次测试任务名称
output=testRestult输出测试结果到指定文件中
lockmem=1G只使用1G内存进行测试,模拟较少内存时使用
stonewall等待上一个测试任务结束,再启动此当前任务

频繁测试可能会报file:filesetup.c:455, func=fstat, error=Structure needs cleaning 错误

这个是因为在测试写入操作时,实际上会真的写入一个指定size的文件,频繁测试最终导致磁盘满了,可以删除这些文件后再测试,或者重新格式化并挂载后再进行测试

配置文件方式

方式一

若嫌命令太长,可以将命令写入文件,使用shell命令执行此文件即可,比如,创建文件vim fiotest,写入如下命令

fio -directory=/root/T1:/root/T2 -ioengine=libaio -direct=1 -iodepth=1 -thread=2 -numjobs=2 -group_reporting -allow_mounted_write=1 -rw=randrw -rwmixread=70 -bs=4k -size=1G -runtime=60 -name=fioTest

执行文件中的命令sh fiotest

方式二

也可以使用配置文件的方式进行测试,每个文件中都可以进行全局配置(global),然后在下面配置要执行的任务,每个任务都共享全局配置信息。如下示例,创建vim dydtest文件,根据实际情况修改以下信息,保存退出

# ↓全局配置信息
[global]
directory=/root/T1:/root/T2
ioengine=libaio
size=1G
direct=1
thread=1
group_reporting# ↓测试顺序读,单次I/O为4k
[4k-read]
bs=4k
iodepth=64
rw=read
stonewall
# ↓测试顺序写,单次I/O为4k
[4k-write]
bs=8k
iodepth=64
rw=write
allow_mounted_write=1
stonewall
# ↓测试随机70%的读,30%的写,单次I/O为16k
[8k-randrw]
bs=16k
iodepth=128
rw=rw
rwmixread=70
allow_mounted_write=1
stonewall

执行命令fio dydtest开始测试,测试结果如下

4k-read: (g=0): rw=read, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=libaio, iodepth=64
4k-write: (g=1): rw=write, bs=(R) 8192B-8192B, (W) 8192B-8192B, (T) 8192B-8192B, ioengine=libaio, iodepth=64
8k-randrw: (g=2): rw=rw, bs=(R) 16.0KiB-16.0KiB, (W) 16.0KiB-16.0KiB, (T) 16.0KiB-16.0KiB, ioengine=libaio, iodepth=128
fio-3.32
Starting 3 threads
Jobs: 1 (f=1): [_(2),M(1)][100.0%][r=116MiB/s,w=48.7MiB/s][r=7436,w=3114 IOPS][eta 00m:00s]
4k-read: (groupid=0, jobs=1): err= 0: pid=1785: Sun Oct 23 22:52:43 2022read: IOPS=11.1k, BW=43.5MiB/s (45.6MB/s)(1024MiB/23549msec)slat (nsec): min=999, max=4417.0k, avg=84200.85, stdev=40409.01clat (usec): min=1741, max=13340, avg=5662.03, stdev=1148.72lat (usec): min=1765, max=13442, avg=5746.24, stdev=1163.61clat percentiles (usec):|  1.00th=[ 3195],  5.00th=[ 3982], 10.00th=[ 4359], 20.00th=[ 4883],| 30.00th=[ 5211], 40.00th=[ 5473], 50.00th=[ 5669], 60.00th=[ 5800],| 70.00th=[ 5932], 80.00th=[ 6063], 90.00th=[ 6980], 95.00th=[ 8291],| 99.00th=[ 9110], 99.50th=[ 9372], 99.90th=[10945], 99.95th=[11469],| 99.99th=[12518]bw (  KiB/s): min=31256, max=54448, per=99.90%, avg=44484.49, stdev=4808.79, samples=45iops        : min= 7814, max=13612, avg=11121.02, stdev=1202.24, samples=45lat (msec)   : 2=0.07%, 4=5.22%, 10=94.50%, 20=0.21%cpu          : usr=0.70%, sys=87.45%, ctx=1093, majf=0, minf=66IO depths    : 1=0.1%, 2=0.1%, 4=0.1%, 8=0.1%, 16=0.1%, 32=0.1%, >=64=100.0%submit    : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%complete  : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.1%, >=64=0.0%issued rwts: total=262144,0,0,0 short=0,0,0,0 dropped=0,0,0,0latency   : target=0, window=0, percentile=100.00%, depth=64
4k-write: (groupid=1, jobs=1): err= 0: pid=1786: Sun Oct 23 22:52:43 2022write: IOPS=9557, BW=74.7MiB/s (78.3MB/s)(1024MiB/13714msec); 0 zone resetsslat (nsec): min=1223, max=4289.9k, avg=98801.06, stdev=41816.87clat (usec): min=131, max=12273, avg=6594.02, stdev=906.57lat (usec): min=216, max=12526, avg=6692.82, stdev=916.59clat percentiles (usec):|  1.00th=[ 4015],  5.00th=[ 5145], 10.00th=[ 5473], 20.00th=[ 5932],| 30.00th=[ 6325], 40.00th=[ 6521], 50.00th=[ 6652], 60.00th=[ 6849],| 70.00th=[ 6980], 80.00th=[ 7177], 90.00th=[ 7504], 95.00th=[ 7832],| 99.00th=[ 9110], 99.50th=[ 9896], 99.90th=[11338], 99.95th=[11731],| 99.99th=[11994]bw (  KiB/s): min=71839, max=85408, per=99.95%, avg=76422.23, stdev=3043.87, samples=26iops        : min= 8979, max=10676, avg=9552.58, stdev=380.58, samples=26lat (usec)   : 250=0.01%, 500=0.01%, 750=0.01%, 1000=0.01%lat (msec)   : 2=0.01%, 4=0.97%, 10=98.57%, 20=0.44%cpu          : usr=0.55%, sys=97.56%, ctx=245, majf=0, minf=1IO depths    : 1=0.1%, 2=0.1%, 4=0.1%, 8=0.1%, 16=0.1%, 32=0.1%, >=64=100.0%submit    : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%complete  : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.1%, >=64=0.0%issued rwts: total=0,131072,0,0 short=0,0,0,0 dropped=0,0,0,0latency   : target=0, window=0, percentile=100.00%, depth=64
8k-randrw: (groupid=2, jobs=1): err= 0: pid=1787: Sun Oct 23 22:52:43 2022read: IOPS=7422, BW=116MiB/s (122MB/s)(718MiB/6194msec)slat (nsec): min=1328, max=2224.6k, avg=81351.07, stdev=35817.74clat (usec): min=32, max=19985, avg=11954.61, stdev=1424.43lat (usec): min=119, max=20072, avg=12035.97, stdev=1430.48clat percentiles (usec):|  1.00th=[ 7701],  5.00th=[ 9896], 10.00th=[10421], 20.00th=[10945],| 30.00th=[11338], 40.00th=[11731], 50.00th=[11994], 60.00th=[12256],| 70.00th=[12649], 80.00th=[13042], 90.00th=[13435], 95.00th=[13829],| 99.00th=[15533], 99.50th=[16450], 99.90th=[18220], 99.95th=[19006],| 99.99th=[20055]bw (  KiB/s): min=113216, max=124288, per=99.99%, avg=118743.83, stdev=3382.82, samples=12iops        : min= 7076, max= 7768, avg=7421.58, stdev=211.44, samples=12write: IOPS=3158, BW=49.4MiB/s (51.7MB/s)(306MiB/6194msec); 0 zone resetsslat (usec): min=4, max=1595, avg=105.72, stdev=39.79clat (usec): min=525, max=25257, avg=12095.70, stdev=1629.26lat (usec): min=660, max=25534, avg=12201.42, stdev=1637.94clat percentiles (usec):|  1.00th=[ 7832],  5.00th=[ 9896], 10.00th=[10421], 20.00th=[11076],| 30.00th=[11469], 40.00th=[11731], 50.00th=[11994], 60.00th=[12387],| 70.00th=[12780], 80.00th=[13173], 90.00th=[13566], 95.00th=[13960],| 99.00th=[17957], 99.50th=[19530], 99.90th=[23462], 99.95th=[23987],| 99.99th=[25297]bw (  KiB/s): min=46944, max=53600, per=100.00%, avg=50545.58, stdev=1980.76, samples=12iops        : min= 2934, max= 3350, avg=3158.92, stdev=123.89, samples=12lat (usec)   : 50=0.01%, 250=0.01%, 500=0.01%, 750=0.01%, 1000=0.01%lat (msec)   : 2=0.02%, 4=0.10%, 10=5.58%, 20=94.17%, 50=0.11%cpu          : usr=0.60%, sys=97.45%, ctx=112, majf=0, minf=1IO depths    : 1=0.1%, 2=0.1%, 4=0.1%, 8=0.1%, 16=0.1%, 32=0.1%, >=64=99.9%submit    : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%complete  : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.1%issued rwts: total=45972,19564,0,0 short=0,0,0,0 dropped=0,0,0,0latency   : target=0, window=0, percentile=100.00%, depth=128Run status group 0 (all jobs):READ: bw=43.5MiB/s (45.6MB/s), 43.5MiB/s-43.5MiB/s (45.6MB/s-45.6MB/s), io=1024MiB (1074MB), run=23549-23549msecRun status group 1 (all jobs):WRITE: bw=74.7MiB/s (78.3MB/s), 74.7MiB/s-74.7MiB/s (78.3MB/s-78.3MB/s), io=1024MiB (1074MB), run=13714-13714msecRun status group 2 (all jobs):READ: bw=116MiB/s (122MB/s), 116MiB/s-116MiB/s (122MB/s-122MB/s), io=718MiB (753MB), run=6194-6194msecWRITE: bw=49.4MiB/s (51.7MB/s), 49.4MiB/s-49.4MiB/s (51.7MB/s-51.7MB/s), io=306MiB (321MB), run=6194-6194msecDisk stats (read/write):dm-0: ios=307812/150496, merge=0/0, ticks=52792/31791, in_queue=84583, util=98.77%, aggrios=307369/150427, aggrmerge=747/212, aggrticks=50102/31622, aggrin_queue=2169, aggrutil=98.69%sda: ios=307369/150427, merge=747/212, ticks=50102/31622, in_queue=2169, util=98.69%

注意:不要用FIO工具测试系统盘的写入操作,会把系统搞崩溃的,仅测试读取的性能时对系统盘没什么影响,如果是在测试环境进行的,可以在开测前先快照备份系统,测试写入操作后再恢复备份,若只是简单测试磁盘的读写速度,可以使用下面介绍的dd命令进行测试

dd命令介绍

dd命令主要是用于文件读取、格式转换和数据拷贝的,它与cp命令不同,dd命令是对块进行复制操作,可以将原始数据按照数据源的格式原封不动的拷贝至目的地,而cp命令是对文件或目录进行复制操作,将文件和目录拷贝到目的地后会按照目的地的格式重新排列数据,因此通过dd命令的复制速度就能够知道磁盘的读写速度

使用方法

如下命令是备份/dev/sda全盘数据,并压缩后保存到到/root/目录下,压缩包命名为sdb_bak.gz

dd if=/dev/sdb | gzip > /root/sdb_bak.gz

常用参数说明如下,更多参数解释说明请执行命令man dd,查看帮助文档

参数解释
if=dev/sda从文件中读取
of=/dev/sdb写入到文件中
bs=4k单次读取/写入的字节数,默认512
count=1000读取/写入字节的次数
skip=10从文件中读取时跳过前10次的次数,即忽略前10次的测试结果,有助于得到更稳定的数据
seek=10写入到文件时跳过前10次的次数,同样有利于得到更稳定的测试数据
iflag=direct在执行从文件中读取数据时使用非缓存I/O
oflag=direct在执行写入到文件操作时使用非缓存I/O
oflag=dsync在执行写入到文件操作时每次都会进行同步操作,比如每次读取4k后就要先把这4k写入到磁盘
conv=fsync执行到最后会再执行一次同步操作,在命令结束前再同步data和metadata
conv=sync,noerror同步I/O和元数据,出现读取错误仍继续操作
time计时功能
  1. 磁盘写入测试

    在linux中存在一个/dev/zero文件,它是一个输入设备,会不断的输出0字节,因此并不会产生I/O,所以可用来测试写入速度,如下命令,意思是以每次4k大小从/dev/zero读取数据向/dyd_w文件中写入,共写入1G(4096*256000)并记录时间

    time dd if=/dev/zero of=/dyd_w bs=4k count=256000
    

    因为/dev/zero不会产生I/O,所以I/O只产生在了dyd_w文件上,因此该命令相当于测试磁盘的写入能力。此命令也可以理解为清空磁盘,因为/dev/zero只会不断的返回0字节,of文件中的数据都会变成空字符,所以,别of到重要的磁盘或文件哦

    请添加图片描述

  2. 磁盘读取测试

    在linux中还有存在一个 /dev/null文件,它是一个空设备,被称为回收站或无底洞,将数据输出到该设备下也不会产生I/O,所以可用来测试读取速度,如下命令,意思是从/dev/sda读取数据向/dev/null中写入,共写入1G(8192*128000)并记录时间

    time dd if=/dev/sda of=/dev/null bs=8k count=128000
    

    因为/dev/sda是一个物理分区,对它的读取会产生I/O,而输出到/dev/null则不会产生I/O,所以,I/O只产生在了/dev/sda上,因此该命令相当于测试磁盘的读取能力

    请添加图片描述

  3. 同时读写测试

    如下命令,指使用fsync同步方式,以每次16k大小从/dev/sda读取数据向dyd_rw文件中写入,共写入1G(16k*128000)并记录时间

    time dd if=/dev/sda of=/dyd_rw bs=16k count=64000 conv=fsync
    

    因为/dev/sda是一个物理分区,而/dyd_rw是一个普通的文件,若它们在同一个磁盘中,则对它们的读写操作都会产生I/O,所以该命令相当于测试磁盘的同时读写能力

    请添加图片描述

dd命令不能实现随机读写测试,对于测试磁盘性能方面相较于FIO工具而言,具有局限性,但dd命令也是一款功能很强大的工具,能够备份数据、数据恢复、磁盘清理、生成随机文件、文件格式转换、数据大小写转换、制作U盘启动盘等功能,此处就不介绍啦,自行了解吧!


http://chatgpt.dhexx.cn/article/P13x0Yuf.shtml

相关文章

NuGet学习笔记(1)——初识NuGet及快速安装使用

http://kb.cnblogs.com/page/143190/ 1. NuGet是什么? NuGet is a Visual Studio 2010 extension that makes it easy to add, remove, and update libraries and tools in Visual Studio projects that use the .NET Framework. This topic lists documentation t…

Nuget路径问题

VS NetGet包管理器 问题场景: 装了两遍VS2019,第一次装D盘卸载了,然后装C盘,结果生成 .netCore项目时就悲剧了,报错:error MSB4018: “ResolvePackageAssets”任务意外失败。Microsoft.PackageDependencyResolution.t…

使用nuget 打包并上传 nuget.org

使用nuget 打包并上传 nuget.org 一、准备工作二、打包你的项目三、上传 nug.org 服务器 前言:今天又玩了个新东西,那就是 使用nuget 打包并上传 nuget.org,在这里即时记录一下,废话不多说,直接上教程。 一、准备工作…

nuget 的生成、发布、使用和更新

nuget 的生成、发布、使用和更新 一、nuget 的生成1.生成.dll1.1创建.net项目(类库)1.2 打包生成 .dll 2.打包成.nupkg文件2.1安装 [NuGetPackageExplorer.exe](https://github.com/NuGetPackageExplorer/NuGetPackageExplorer)程序2.2打开软件,完成打包…

修改NuGet包默认存放位置

默认情况下,NuGet下载的包存放在系统盘(C盘中),这样一来,时间长了下载的包越多,C盘占用的空间也就越多。 1、问题描述 默认情况下,NuGet下载的包存放在系统盘(C盘中,一般在路径C:\Users\用户\.nuget\packag…

Nuget使用简介

1.什么是Nuget Nuget是 ASP .NET Gallery 的一员。NuGet 是免费、开源的包管理开发工具,专注于在 .NET 应用开发过程中,简单地合并第三方的组件库。 当需要分享开发的工具或是库,需要建立一个Nuget package,然后把这个package放到…

Nuget的使用说明

在做项目的时候,经常需要添加一些第三方引用,Visual Studio 2019环境下,最推荐的是Nuget安装方式,好处就是可以将所有依赖的包全部打包下载安装。 1.nuget.org,搜索需要的nuget包,复制相应的安装命令&…

NuGet的了解

目录 1..NuGet 的使用目的 2..Net 的工具 NuGet 1.NuGet 包的下载 2.NuGet 包的分析 3.NuGet 的使用 1.通过命令行使用 2.在 visual studio 里通过图形化界面进行添加。 3.在添加包的时候 4.特点 1..NuGet 的使用目的 在引入第三方程序集(dll)的…

初识NuGet - 概念, 安装和使用

1. NuGet是什么? NuGet is a Visual Studio 2010 extension that makes it easy to add, remove, and update libraries and tools in Visual Studio projects that use the .NET Framework. This topic lists documentation that will help you use NuGet packages…

NuGet的介绍及使用

介绍 NuGet是什么? NuGet是.NET的软件包管理器。NuGet客户端工具提供了生成和使用软件包的功能。NuGet 是所有软件包作者和使用者都使用的中央软件包存储库。 下面是百度百科的介绍 在我看来NuGet类似于Java的Maven和Javascript的npm。 使用 1、通过图形化客户端安…

NuGet包介绍

前言 什么是NuGet? NuGet是.NET的软件包管理器。NuGet客户端工具提供了生成和使用软件包的功能。NuGet Gallery是所有软件包作者和使用者都使用的中央软件包存储库。 包的安装和卸载 (以Newtonsoft.Json举例) 1.控制台 安装:Install-Package Newtonsoft…

NuGet使用

1.创建类库方法 2.双击项目配置 <Project Sdk"Microsoft.NET.Sdk"><PropertyGroup><TargetFramework>net6.0</TargetFramework><ImplicitUsings>enable</ImplicitUsings><Nullable>enable</Nullable><!--以下是…

NuGet学习

NuGet学习 文章目录 NuGet学习1.简介2.Visual Studio安装3.安装包3.1 打开NuGet3.2 搜索安装包 4.使用包 1.简介 NuGet包是一个zip文件&#xff0c;其中包含程序集&#xff08;或多个程序集&#xff09;、配置信息和PowerShell脚本。NuGet包可以从微软找到&#xff0c;也可以从…

什么是nuget?nuget包是如何管理

做windows开发的&#xff0c;迟早会接触到nuget这个东西&#xff0c;那么今天我们就来研究一下什么是nuget&#xff1f; 我们先从另外一些大家熟悉的概念入手&#xff0c;做linux的大家应该应该听说过apt-get&#xff0c;yum&#xff0c;deb等等&#xff0c;是的这些都是包管理…

NuGet包管理器

在.NET应用程序编程开发中&#xff0c;开发者通常使用类库来管理、维护属于同一分类的程序代码&#xff0c;以便代码的重用。一般情况下&#xff0c;处于同一类库的所有类都位于同一程序集。 这些类库被编译器编译后会生成扩展名为.dll的动态链接库文件&#xff0c;你可以在其…

VS Nuget的使用

目录 VS Nuget的使用 一、引言 二、认识Nuget 三、如何使用Nuget 1.常规使用 2.安装类库的历史版本 3.常见问题 4.离线安装nuget包 VS Nuget的使用 一、引言 最古老的时候我们想引用一个第三方类库&#xff0c;方法就是先下载第三方的dll文件&#xff0c;然后放置到我…

nuget使用教程

1.打开文件夹 E:\工具\PackageExplorer.4.4.72 双击 NyGetPackageExplorer.exe 文件。 2.点击Open a package from online feed 得到右图&#xff0c;输入自己的package source&#xff1b;选中自己要升级的nuget包&#xff0c;双击。 √ > File > Publish

NuGet安装使用

一.NuGet 1.介绍 在.NET应用程序编程开发中&#xff0c;开发者通常使用类库来管理、维护属于同一分类的程序代码&#xff0c;以便代码的重用。一般情况下&#xff0c;处于同一类库的所有类都位于同一程序集。 这些类库被编译器编译后会生成扩展名为.dll的动态链接库文件&…

NuGet的使用

什么是NuGet&#xff1f; NuGet&#xff08;读作New Get&#xff09;是用于微软.NET开发平台的软件包管理器&#xff08;相当于NPM&#xff09;&#xff0c;是一个Visual Studio的扩展。在使用Visual Studio开发基于.NET Framework的应用时&#xff0c;NuGet能够令你在项目中添…

NuGet是什么?理解与使用(上)

如果你了解python&#xff0c;那么它类似pip。 如果你了解nodejs&#xff0c;那么它类似npm。 如果你了解ruby&#xff0c;那么它类似gem。 对&#xff0c;它就是一个包&#xff08;package&#xff09;管理平台&#xff0c;确切的说是 .net平台的包管理工具&#xff0c;它提…