磁盘测试工具FIO

2023-11-18

磁盘测试工具FIO

https://www.cnblogs.com/klb561/p/11939355.html

目前主流的第三方IO测试工具有fio、iometer和Orion,这三种工具各有千秋。

fio在Linux系统下使用比较方便,iometer在window系统下使用比较方便,Orion是oracle的IO测试软件,可在没有安装oracle数据库的情况下模拟oracle数据库场景的读写。

如下是在Linux系统上采用fio工具来对SAN存储进行的IO测试。

1、安装fio

在fio官网下载fio-2.1.10.tar文件,解压后./configure、make、make install之后就可以使用fio了。

2、fio参数解释

FIO工具使用方法:
参数说明:
filename=/dev/sdb1 测试文件名称,通常选择需要测试的盘的data目录。
direct=1 测试过程绕过机器自带的buffer。使测试结果更真实。
rw=randwrite 测试随机写的I/O
rw=randrw 测试随机写和读的I/O
bs=16k 单次io的块文件大小为16k
bsrange=512-2048 同上,提定数据块的大小范围
size=5g 本次的测试文件大小为5g,以每次4k的io进行测试。
numjobs=30 本次的测试线程为30.
runtime=1000 测试时间为1000秒,如果不写则一直将5g文件分4k每次写完为止。
ioengine=psync io引擎使用pync方式
rwmixwrite=30 在混合读写的模式下,写占30%
group_reporting 关于显示结果的,汇总每个进程的信息。
此外
lockmem=1g 只使用1g内存进行测试。
zero_buffers 用0初始化系统buffer。
nrfiles=8 每个进程生成文件的数量。
磁盘读写常用测试点:
1. Read=100% Ramdon=100% rw=randread (100%随机读)
2. Read=100% Sequence=100% rw=read (100%顺序读)
3. Write=100% Sequence=100% rw=write (100%顺序写)
4. Write=100% Ramdon=100% rw=randwrite (100%随机写)
5. Read=70% Sequence=100% rw=rw, rwmixread=70, rwmixwrite=30
(70%顺序读,30%顺序写)
6. Read=70% Ramdon=100% rw=randrw, rwmixread=70, rwmixwrite=30
(70%随机读,30%随机写)
1) 顺序写:
描述:向/dev/sda分区存储上以2M块文件大小顺序写1100GB文件

fio -output=/tmp/100S100W -name=100S100W -filename=/dev/sda -ioengine=libaio -direct=1 -blocksize=2M -size=1100GB -rw=write -iodepth=8 -numjobs=1

2)随机写:
描述:向/dev/sda分区存储上以2M块文件大小随机写1100GB文件

fio -output=/tmp/100R100W -name=100R100W -filename=/dev/sdb:/dev/sdc:/dev/sdd -ioengine=libaio -direct=1 -blocksize=2M -size=3356GB -rw=randwrite -iodepth=8 -numjobs=1

3)顺序读:

fio -output=/tmp/100S100W -name=100S100W -filename=/dev/sda -ioengine=libaio -direct=1 -blocksize=2M –runtime=1800 -rw=read -iodepth=8 -numjobs=1

4) 随机读:

fio -output=/tmp/100S100Wsdbsdcsdd -name=100S100W -write_bw_log=bw_log -write_lat_log=lat_log -filename=/dev/sdb:/dev/sdc:/dev/sdd -ioengine=libaio -direct=1 -blocksize=2M -runtime=1800 -rw=randread -iodepth=32 -numjobs=1

5)混合随机读写:
描述:70%随机读,30%随机写,以2M块文件大小向/dev/sdb:/dev/sdc:/dev/sdd三个分区存储上随机读写300s时间

fio -output=/tmp/100S100W -name=100S100W -filename=/dev/sdb:/dev/sdc:/dev/sdd -ioengine=libaio -direct=1 -blocksize=2M -runtime=300 -rw=randrw -rwmixread=70 -rwmixwrite=30 -iodepth=32 -numjobs=1

结果报告查看:

复制代码

复制代码

[root@rac01-node02]# fio -filename=/dev/sdc4 -direct=1 -iodepth 1 -thread -rw=randrw -rwmixread=70 -ioengine=psync -bs=4k -size=1000G -numjobs=50 -runtime=180 -group_reporting -name=randrw_70read_4k_local
randrw_70read_4k_local: (g=0): rw=randrw, bs=4K-4K/4K-4K/4K-4K, ioengine=psync, iodepth=1
...
fio-2.1.10
Starting 50 threads
Jobs: 21 (f=21): [____m____m_m___m____mmm__mmm__mm_m_mmm_m__m__m_m_m] [3.4% done] [7004KB/2768KB/0KB /s] [1751/692/0 iops] [eta 01h:27m:00s]
randrw_70read_4k_local: (groupid=0, jobs=50): err= 0: pid=13710: Wed May 31 10:23:31 2017
  read : io=1394.2MB, bw=7926.4KB/s, iops=1981, runt=180113msec
    clat (usec): min=39, max=567873, avg=24323.79, stdev=25645.98
     lat (usec): min=39, max=567874, avg=24324.23, stdev=25645.98
    clat percentiles (msec):
     |  1.00th=[    3],  5.00th=[    5], 10.00th=[    6], 20.00th=[    7],
     | 30.00th=[    9], 40.00th=[   12], 50.00th=[   16], 60.00th=[   21],
     | 70.00th=[   27], 80.00th=[   38], 90.00th=[   56], 95.00th=[   75],
     | 99.00th=[  124], 99.50th=[  147], 99.90th=[  208], 99.95th=[  235],
     | 99.99th=[  314]
    bw (KB  /s): min=   15, max=  537, per=2.00%, avg=158.68, stdev=38.08
  write: io=615280KB, bw=3416.8KB/s, iops=854, runt=180113msec
    clat (usec): min=167, max=162537, avg=2054.79, stdev=7665.24
     lat (usec): min=167, max=162537, avg=2055.38, stdev=7665.23
    clat percentiles (usec):
     |  1.00th=[  201],  5.00th=[  227], 10.00th=[  249], 20.00th=[  378],
     | 30.00th=[  548], 40.00th=[  692], 50.00th=[  844], 60.00th=[  996],
     | 70.00th=[ 1160], 80.00th=[ 1304], 90.00th=[ 1720], 95.00th=[ 3856],
     | 99.00th=[40192], 99.50th=[58624], 99.90th=[98816], 99.95th=[123392],
     | 99.99th=[148480]
    bw (KB  /s): min=    6, max=  251, per=2.00%, avg=68.16, stdev=29.18
    lat (usec) : 50=0.01%, 100=0.03%, 250=3.15%, 500=5.00%, 750=5.09%
    lat (usec) : 1000=4.87%
    lat (msec) : 2=9.64%, 4=4.06%, 10=21.42%, 20=18.08%, 50=19.91%
    lat (msec) : 100=7.24%, 250=1.47%, 500=0.03%, 750=0.01%
  cpu          : usr=0.07%, sys=0.21%, ctx=522490, majf=0, minf=7
  IO depths    : 1=100.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, >=64=0.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.0%, >=64=0.0%
     issued    : total=r=356911/w=153820/d=0, short=r=0/w=0/d=0
     latency   : target=0, window=0, percentile=100.00%, depth=1

Run status group 0 (all jobs):
   READ: io=1394.2MB, aggrb=7926KB/s, minb=7926KB/s, maxb=7926KB/s, mint=180113msec, maxt=180113msec
  WRITE: io=615280KB, aggrb=3416KB/s, minb=3416KB/s, maxb=3416KB/s, mint=180113msec, maxt=180113msec

Disk stats (read/write):
  sdc: ios=356874/153927, merge=0/10, ticks=8668598/310288, in_queue=8978582, util=99.99%

复制代码

复制代码

io=执行了多少M的IO

bw=平均IO带宽
iops=IOPS
runt=线程运行时间
slat=提交延迟
clat=完成延迟
lat=响应时间
bw=带宽
cpu=利用率
IO depths=io队列
IO submit=单个IO提交要提交的IO数
IO complete=Like the above submit number, but for completions instead.
IO issued=The number of read/write requests issued, and how many of them were short.
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=磁盘利用率

4、扩展之IO队列深度

在某个时刻,有N个inflight的IO请求,包括在队列中的IO请求、磁盘正在处理的IO请求。N就是队列深度。
加大硬盘队列深度就是让硬盘不断工作,减少硬盘的空闲时间。
加大队列深度 -> 提高利用率 -> 获得IOPS和MBPS峰值 ->注意响应时间在可接受的范围内,
增加队列深度的办法有很多,使用异步IO,同时发起多个IO请求,相当于队列中有多个IO请求,多线程发起同步IO请求,相当于队列中有多个IO请求。
增大应用IO大小,到达底层之后,会变成多个IO请求,相当于队列中有多个IO请求 队列深度增加了。
队列深度增加了,IO在队列的等待时间也会增加,导致IO响应时间变大,这需要权衡。

为何要对磁盘I/O进行并行处理呢?主要目的是提升应用程序的性能。这一点对于多物理磁盘组成的虚拟磁盘(或LUN)显得尤为重要。
如果一次提交一个I/O,虽然响应时间较短,但系统的吞吐量很小。
相比较而言,一次提交多个I/O既缩短了磁头移动距离(通过电梯算法),同时也能够提升IOPS。
假如一部电梯一次只能搭乘一人,那么每个人一但乘上电梯,就能快速达到目的地(响应时间),但需要耗费较长的等待时间(队列长度)。
因此一次向磁盘系统提交多个I/O能够平衡吞吐量和整体响应时间。

Linux系统查看默认队列深度:

 

监控磁盘IO命令:iostat –mx 1 (iostat的安装方法:yum install sysstat)

复制代码

复制代码

[root@localhost tmp]# iostat -mx 1
Linux 2.6.32-220.el6.x86_64 (localhost.localdomain) XXXX年XX月XX日 _x86_64_ (32 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
12.74 0.00 8.95 0.04 0.00 78.27
Device: rrqm/s wrqm/s r/s w/s rMB/s wMB/s avgrq-sz avgqu-sz await svctm %util
sda 0.18 10.05 0.31 7.67 0.01 0.07 18.77 0.00 0.28 0.14 0.11
sdb 0.69 0.10 15.74 11.21 0.17 2.45 190.77 0.34 12.10 0.23 0.63


rrqms:每秒这个设备相关的读取请求有多少被Merge了(当系统调用需要读取数据的时候,VFS将请求发到各个FS,如果FS发现不同的读取请求读取的是相同Block的数据,FS会将这个请求合并Merge)
wrqm/s:每秒这个设备相关的写入请求有多少被Merge了。
rsec/s:The number of sectors read from the device per second.
wsec/s:The number of sectors written to the device per second.
rKB/s:The number of kilobytes read from the device per second.
wKB/s:The number of kilobytes written to the device per second.
avgrq-sz:平均请求扇区的大小,The average size (in sectors) of the requests that were issued to the device.
avgqu-sz:是平均请求队列的长度。毫无疑问,队列长度越短越好,The average queue length of the requests that were issued to the device.   
await:每一个IO请求的处理的平均时间(单位是微秒毫秒)。这里可以理解为IO的响应时间,一般地系统IO响应时间应该低于5ms,如果大于10ms就比较大了。
这个时间包括了队列时间和服务时间,也就是说,一般情况下,await大于svctm,它们的差值越小,则说明队列时间越短,反之差值越大,队列时间越长,说明系统出了问题。
svctm:表示平均每次设备I/O操作的服务时间(以毫秒为单位)。如果svctm的值与await很接近,表示几乎没有I/O等待,磁盘性能很好。
如果await的值远高于svctm的值,则表示I/O队列等待太长,系统上运行的应用程序将变慢。
%util: 在统计时间内所有处理IO时间,除以总共统计时间。例如,如果统计间隔1秒,该设备有0.8秒在处理IO,而0.2秒闲置,那么该设备的%util = 0.8/1 = 80%,
所以该参数暗示了设备的繁忙程度,一般地,如果该参数是100%表示磁盘设备已经接近满负荷运行了(当然如果是多磁盘,即使%util是100%,因为磁盘的并发能力,所以磁盘使用未必就到了瓶颈)



FIO使用指南:https://blog.csdn.net/sch0120/article/details/76154205

[参数备注]

对于混合io类型,混认是50%的读,50%的写,对于特定的io类型,因为速度可能不同,结果可能会有稍有偏差.

通过在在str之后加“:<nr>”可以配置在执行一下获取offset操作之前要执行的IO次数。For a random read, it would lik ’rw=randread:8′ for passing in an offset modifier with a value of 8.如果后缀用于顺序IO类型的话,,那么将在每次IO之后,将这个值加到产生的offset之后。e.g. rw=write:4k每次写之后将会跳过4K。它将顺序的IO转化为带有洞的顺序IO。参考‘rw_sequencer’选项。

<2>rw_sequencer=str

如果rw=<str>后有offset修饰的话,这个选项可以控制这个数字<nr>如何修饰产生的IO offset.可以接收的值是:

sequential 产生顺序的offset

identical 产生相同的offset

[参数备注]

‘sequential’仅用于随机IO。通常情况下,fio在每次IO之后,将会生成一个新的随机IO。e.g.rw=randread:8,将会在每8次IO之后执行seek,而不是每次IO之后。顺序IO已经是顺序的,再设置为‘sequential’将不会产生任何不同。‘identical’会产生同‘sequential’相似的行为,只是它会连续产生8次相同的offset,然后生成一个新的offset.

2)block size

产生的IO单元的大小,可以是一个孤立的值,也可以是一个范围。

<1>blocksize=int,bs=int

单次IO的block size,默认为4k。如果是单个值的话,将会对读写都生效。如果是一个逗号,再跟一个int值的话,则是仅对于写有效。也就是说,格式可以是bs=read_end_write或是bs=read,write。e.g. bs=4k,8k读使用4k的块,写使用8k的块。e.g.bs=,8k将使得写采用8k的块,读采用默认的值。

3)IO size

将会读/写多少数据

<1>size=int

这个job IO总共要传输的数据的大小。FIO将会执行到所有的数据传输完成,除非设定了运行时间(‘runtime’选项)。除非有特定的‘nrfiles’选项和‘filesize’选项被设置,fio将会在job定义的文件中平分这个大小。如果这个值不设置的话,fio将会使用这个文件或设备的总大小。如果这些文件不存在的话,size选项一定要给出。也可以给出一个1到100的百分比。e.g. size=20%,fio将会使用给定的文件或设备的20%的空间。

4)IO引擎

发起IO的方式。

<1>ioengine=str

定义job向文件发起IO的方式

sync 基本的read,write.lseek用来作定位

psync 基本的pread,pwrite

vsync 基本的readv,writev

libaio Linux专有的异步IO。linux仅支持非buffered IO的队列行为。

posixaio glibc posix异步IO

solarisaio solaris独有的异步IO

windowsaio windows独有的异步IO

mmap 文件通过内存映射到用户空间,使用memcpy写入和读出数据

splice 使用splice和vmsplice在用户空间和内核之间传输数据

syslet-rw 使用syslet 系统调用来构造普通的read/write异步IO

sg SCSI generic sg v3 io.可以是使用SG_IO ioctl来同步,或是目标是一个sg字符设备,我们使用read和write执行异步IO

null 不传输任何数据,只是伪装成这样。主要用于训练使用fio,或是基本debug/test的目的。

net 根据给定的host:port通过网络传输数据。根据具体的协议,hostname,port,listen,filename这些选项将被用来说明建立哪种连接,协议选项将决定哪种协议被使用。

netsplice 像net,但是使用splic/vmsplice来映射数据和发送/接收数据。

cpuio 不传输任何的数据,但是要根据cpuload=和cpucycle=选项占用CPU周期.e.g. cpuload=85将使用job不做任何的实际IO,但要占用85%的CPU周期。在SMP机器上,使用numjobs=<no_of_cpu>来获取需要的CPU,因为cpuload仅会载入单个CPU,然后占用需要的比例。

guasi GUASI IO引擎是一般的用于异步IO的用户空间异步系统调用接口

rdma RDMA I/O引擎支持RDMA内存语义(RDMA_WRITE/RDMA_READ)和通道主义(Send/Recv)用于InfiniBand,RoCE和iWARP协议

external 指明要调用一个外部的IO引擎(二进制文件)。e.g. ioengine=external:/tmp/foo.o将载入/tmp下的foo.o这个IO引擎

5)IO depth

如果IO引擎是异步的,这个指定我们需要保持的队列深度

<1>iodepth=int

加于文件之上的保持的IO单元。默认对于每个文件来说是1,可以设置一个更大的值来提供并发度。iodepth大于1不会影响同步IO引擎(除非verify_async这个选项被设置)。even async engines may impose OS restrictions causing the desired depth not to be achieved.这会在Linux使用libaio并且设置direct=1的时候发生,因为buffered io在OS中不是异步的。在外部通过类似于iostat这些工具来观察队列深度来保证这个IO队列深度是我们想要的。这个可以参考褚霸的博客http://blog.yufeng.info/archives/2104

6)IO type

<1>direct=bool

true,则标明采用non-buffered io.同O_DIRECT效果一样。ZFS和Solaris不支持direct io,在windows同步IO引擎不支持direct io

<2>buffered=bool

true,则标明采用buffered io。是direct的反义词,默认是true

7)Num files

负载将分发到几个文件之中

<1>nrfiles=int

用于这个job的文件数目,默认为1

<2>openfiles=int

在同一时间可以同时打开的文件数目,默认同nrfiles相等,可以设置小一些,来限制同时打开的文件数目。

8)Num threads

<1>numjobs=int

创建特定数目的job副本。可能是创建大量的线程/进程来执行同一件事。我们将这样一系列的job,看作一个特定的group

详细参数:

<1>name=str

job名,用于输出信息用的名字。如果不设置的话,fio输出信息时将采用job name,如果设置的话,将用设置的名字。在命令行中,这个参数有特殊的作用,标明一个新job的开始。

<2>description=str

job的说明信息,在job运行的时候不起作用,只是在输出文件描述信息的时候才起作用。

<3>directory=str

使用的文件的路径前缀,默认是./

<4>filename=str

一般情况下,fio会根据job名,线程号,文件名来产生一个文件名。如果,想在多个job之间共享同一个文件的话,可以设定一个名字来代替默认的名字.如果ioengine是‘net’的话,文件名则是以这种格式=host,port,protocol.如果ioengine是基于文件的话,可以通过‘:’分割来设定一系列的文件。e.g. filename=/dev/sda:/dev/sdb 希望job打开/dev/sda和/dev/sdb作为两个工作文件。

<5>opendir=str

让fio递归的添加目录下和子目录下的所有文件。

<6>lockfile=str

fio在文件上执行IO之前默认是不锁文件的,这样的话,当有多个线程在此文件上执行IO的话,会造成结果的不一致。这个选项可以用来共享文件的负载,支持的锁类型:

none 默认不使用锁

exclusive 排它锁

readwrite 读写锁

在后面可以加一个数字后缀,如果设置的话,每一个线程将会执行这个数字指定的IO后才会放弃锁,因为锁的开销是比较大的,所以这种方式可以加速IO。

<7>kb_base=int

size换算单位,1000/1024,默认为1024

<8>randrepeat=bool

对于随机IO负载,配置生成器的种子,使得路径是可以预估的,使得每次重复执行生成的序列是一样的。

<9>use_os_rand=bool

fio可以使用操作系统的随机数产生器,也可以使用fio内部的随机数产生器(基于tausworthe),默认是采用fio内部的产生器,质量更数,速度更快。

<7>fallocate=str

如何准备测试文件

none 不执行预分配空间

posix 通过posix_fallocate()预分配空间

keep 通过fallocate()(设置FALLOC_FL_KEEP_SIZE)预分配空间

0 none的别名,出于兼容性

1 posix的别名,出于兼容性

并不是在所有的平台上都有效,‘keep’仅在linux上有效,ZFS不支持。默认为‘posix’

<8>fadvise_hint=bool

默认fio将使用fadvise()来告知内核fio要产生的IO类型,如果不想告诉kernel来执行一些特定的IO类型的话,可行关闭这个选项。如果设置的话,fio将使用POSIX_FADV_SEWUENTIAL来作顺序IO,使用POSIX_FADV_RANDOM来做随机IO

<9>filesize=int

单个文件的大小,可以是一个范围,在这种情况下,fio将会在一个范围内选择一个大小来决定单个文件大小,如果没有设置的话,所有的文件将会是同样的大小。

<10>fill_device=bool,fill_fs=bool

填满空间直到达到终止条件ENOSPC,只对顺序写有意义。对于读负载,首行要填满挂载点,然后再启动IO,对于裸设备结点,这个设置则没有什么意义,因为,它的大小已被被文件系统知道了,此外写的超出文件将不会返回ENOSPC.

<11>blockalign=int,ba=int

配置随机io的对齐边界。默认是与blocksize的配置一致,对于direct_io,最小为512b,因为它与依赖的硬件块大小,对于使用文件的随机map来说,这个选项不起作用。

<14>blocksize_range=irange,bsrange=irange

不再采用单一的块大小,而是定义一个范围,fio将采用混合io块大小.IO单元大小一般是给定最小值的备数。同时应用于读写,当然也可以通过‘,’来隔开分别配置读写。

<15>bssplit=str

可以更为精确的控制产生的block size.这个选项可以用来定义各个块大小所占的权重.格式是

bssplit=blocksize/percentage;blocksize/percentage

bssplit=4k/10:64k/50;32k/40

产生的这样的负载:50% 64k的块,10% 4k的块, 40% 32k的块

可以分别为读和写来设置

e.g. bssplit=2k/50:4k/50,4k/90:8k/10

产生这样的负载:读(50% 64k的块,50% 4k的块),写(90% 4k的块, 10% 8k的块)

<16>blocksize_unaligned,bs_unaligned

如果这个选项被设置的,在bsrange范围内的大小都可以产生,这个选项对于direct io没有作用,因为对于direct io至少需要扇区对齐

<17>zero_buffers

如果这个选项设置的话,IO buffer全部位将被初始为0,如果没有置位的话,将会是随机数.

<18>refill_buffers

如果这个选项设置的话,fio将在每次submit之后都会将重新填满IO buffer,默认都会在初始是填满,以后重复利用。这个选项只有在zero_buffers没有设置的话,这个选项才有作用。

<19>scramble_buffer=bool

如果refilee_buffers成本太高的话,但是负载要求不使用重复数据块,设置这个选项的话,可以轻微的改动IO buffer内容,这种方法骗不过聪明的块压缩算法,但是可以骗过一些简单的算法。

<20>buffer_compress_percentage=int

如果这个设置的话,fio将会尝试提供可以压缩到特定级别的Buffer内容。FIO是能完提供混合的0和随机数来实现的。Note that this is per block size unit, for file/disk wide compression level that matches this setting, you’ll also want to set refill_buffers.

<21>buffer_compress_chunk=int

See buffer_compress_percentage. This setting allows fio to manage how big the ranges of random data and zeroed data is. Without this set, fio will provide buffer_compress_percentage of blocksize random data, followed by the remaining zeroed. With this set to some chunk size smaller than the block size, fio can alternate random and zeroed data throughout the IO buffer.

<22>file_service_type=str

fio切换job时,如何选择文件,支持下面的选项

random 随机选择一个文件 

roundrobin 循环使用打开的文件,默认

sequential 完成一个文件后,再移动到下一个文件

这个选项可以加后缀数字,标明切换到下一个新的频繁程度。

e.g. random:4 每4次IO后,将会切换到一下随机的文件

<23>iodepth_batch_submit=int,iodepth_batch=int

这个定义了一次性提交几个IO,默认是1,意味着一旦准备好就提交IO,这个选项可以用来一次性批量提交IO

<24>iodepth_batch_complete=int

这个选项定义了一次取回多少个IO,如果定义为1的话,意味着我们将向内核请求最小为1个IO.The IO retrieval will Go on until we hit the limit set by iodetph_low.If this variable is set to 0, then fi will always check for completed events before quuing more IO.This helps reduce IO latency, at the cost of more retrieval sysstem calls.

<25>iodepth_low=int

这个水位标志标明什么时候开始重新填充这个队列,默认是同iodepth是一样的,意味着,每时每刻都在尝试填满这个队列。如果iodepth设置为16,而iodepth设置为4的话,那么fio将等到depth下降到4才开始重新填充

<26>offset=int

在文件特定的偏移开始读数据,在这个offset之前的数据将不会被使用,有效的文件大小=real_size-offset

<27>offset_increment=int

如果这个选项被设置的话,实际的offset=offset+offset_increment * thread_number,线程号是从0开始的一个计数器,对于每一个job来说是递增的。这个选项对于几个job同时并行在不交界的地方操作一个文件是有用的。

<28>fsync=int

如果写一个文件的话,每n次IO传输完block后,都会进行一次同步脏数据的操作。

e.g. fsync=int

fio每32次写之后,同步一次文件。如果采用non-buffered io,不需要使用sync同步文件

对于sg io引擎的话,可以在任何情况下同步磁盘cache.

<29>fdatasync=int

同fsync,但是采用fdatasync()来同步数据,但不同步元数据

<30>sync_file_range=str:val

对于每‘val’个写操作,将执行sync_file_range()。FIO将跟踪从上次sync_file_range()调用之扣的写范围,‘str’可以是以下的选择

wait_before SYNC_FILE_RANGE_WAIT_BEFORE

write SYNC_FILE_RANGE_WRITE

wait_after SYNC_FILE_RANGE_WAIT_AFTER

e.g.sync_file_range=wait_before,write:8,fio将在每8次写后使用SYNC_FILE_RANGE_WAIT_BEFORE|SYNC_FILE_RANGE_WRITE

<31>overwrite=bool

如果是true的话,写一个文件的话,将会覆盖已经存在的数据。如果文件不存在的话,它将会在写阶段开始的时候创建这个文件。

<32>end_fsync=bool

如果是true的话,当job退出的话,fsync将会同步文件内容

<33>fsync_on_close=bool

如果是true的话,关闭时,fio将会同步脏文件,不同于end_fsync的时,它将会在每个文件关闭时都会发生,而不是只在job结束时。

<34>rwmixread=int

混合读写中,读占的百分比

<35>rwmixwrite=int

混合读写中,写占的百分比;如果rwmixread=int和rwmixwrite=int同时使用的话并且相加不等于100%的话,第二个值将会覆盖第一个值。这可能要干扰比例的设定,如果要求fio来限制读和写到一定的比率。在果在这种情况下,那么分布会的有点的不同。

<36>norandommap

一般情况下,fio在做随机IO时,将会覆盖文件的每一个block.如果这个选项设置的话,fio将只是获取一个新的随机offset,而不会查询过去的历史。这意味着一些块可能没有读或写,一些块可能要读/写很多次。在个选项与verify=互斥,并只有多个块大小(bsrange=)正在使用,因为fio只会记录完整的块的重写。

<37>softrandommap=bool

See norandommap. If fio runs with the random block map enabled and it fails to allocate the map, if this option is set it will continue without a random block map. As coverage will not be as complete as with random maps, this option is disabled by default.

<38>nice=int

根据给定的nice值来运行这个job

<39>prio=int

设置job的优先级,linux将这个值限制在0-7之间,0是最高的。

<40>prioclass=int

设置优先级等级。

<41>thinktime=int

上一个IO完成之后,拖延x毫秒,然后跳到下一个。可以用来访真应用进行的处理。

<42>thinktime_spin=int

只有在thinktime设置时才有效,在为了sleep完thinktime规定的时间之前,假装花费CPU时间来做一些与数据接收有关的事情。

<43>thinktime_blocks

只有在thinktime设置时才有效,控制在等待‘thinktime’的时间内产生多少个block,如果没有设置的话,这个值将是1,每次block后,都会将等待‘thinktime’us。

<44>rate=int

限制job的带宽。

e.g.rate=500k,限制读和写到500k/s

e.g.rate=1m,500k,限制读到1MB/s,限制写到500KB/s

e.g.rate=,500k , 限制写到500kb/s

e.g.rate=500k, 限制读到500KB/s

<45>ratemin=int

告诉fio尽最在能力来保证这个最小的带宽,如果不能满足这个需要,将会导致程序退出。

<46>rate_iops=int

将带宽限制到固定数目的IOPS,基本上同rate一样,只是独立于带宽,如果job是指定了一个block size范围,而不是一个固定的值的话,最小blocksize将会作为标准。

<47>rate_iops_min=int

如果fio达不到这个IOPS的话,将会导致job退出。

<48>ratecycle=int

几个毫秒内的平均带宽。用于‘rate’和‘ratemin’

<49>cpumask=int

设置job使用的CPU.给出的参数是一个掩码来设置job可以运行的CPU。所以,如果要允许CPU在1和5上的话,可以通过10进制数来设置(1<<1 | 1<<5),或是34。查看sched_setaffinity的man page。它可能并不是支持所有的操作系统和kernel版本。This option doesn’t work well for a higher CPU count than what you can store in an integer mask, so it can only control cpus 1-32. For boxes with larger CPU counts, use cpus_allowed.

<50>cpus_allowed=str

功能同cpumask一样,但是允许通过一段文本来设置允许的CPU。e.g.上面的例子可是这样写cpus_allowed=1,5。这个选项允许设置一个CPU范围,如cpus_allowed=1,5,8-15

<51>startdelay=time

fio启动几秒后再启动job。只有在job文件包含几个jobs时才有效,是为了将某个job延时几秒后执行。

<52>runtime=time

控制fio在执行设定的时间后退出执行。很难来控制单个job的运行时间,所以这个参数是用来控制总的运行时间。

<53>time_based

如果设置的话,即使file已被完全读写或写完,也要执行完runtime规定的时间。它是通过循环执行相同的负载来实现的。

<54>ramp_time=time

设定在记录任何性能信息之前要运行特定负载的时间。这个用来等性能稳定后,再记录日志结果,因此可以减少生成稳定的结果需要的运行时间。Note that the ramp_time is considered lead in time for a job, thus it will increase the total runtime if a special timeout or runtime is specified.

<55>invalidate=bool

Invalidate the buffer/page cache parts for this file prior to starting io. Defaults to true.

<56>sync=bool

使用sync来进行buffered写。对于多数引擎,这意味着使用O_SYNC

<57>iomem=str,mem=str

fio可以使用各种各样的类型的内存用来io单元buffer.

malloc 使用malloc()

shm 使用共享内存.通过shmget()分配

shmhuge 同shm一样,可以使用huge pages

mmap 使用mmap。可以是匿名内存,或是支持的文件,如果一个文件名在选项后面设置的话,格式是mem=mmap:/path/to/file

mmaphuge 使用mmapped huge file.在mmaphuge扣面添加文件名,alamem=mmaphuge:/hugetlbfs/file

分配的区域是由job允许的最大block size * io 队列的长度。对于shmhuge和mmaphuge,系统应该有空闲的页来分配。这个可以通过检测和设置reading/writing /proc/sys/vm/nr_hugepages来实现(linux)。FIO假设一个huge page是4MB。所以要计算对于一个JOB文件需要的Huge page数量,加上所有jobs的队列长度再乘以最大块大小,然后除以每个huge page的大小。可以通过查看/proc/meminfo来看huge pages的大小。如果通过设置nr_hugepages=0来使得不允许分配huge pages,使用mmaphug或是shmhuge将会失败。

mmaphuge需要挂载hugelbfs而且要指定文件的位置,所以如果要挂载在/huge下的话,可以使用mem=mmaphuge:/huge/somefile

<58>iomem_align=int

标明IO内存缓冲的内存对齐方式。Note that the given alignment is applied to the first IO unit buffer, if using iodepth the alignment of the following buffers are given by the bs used. In other words, if using a bs that is a multiple of the page sized in the system, all buffers will be aligned to this value. If using a bs that is not page aligned, the alignment of subsequent IO memory buffers is the sum of the iomem_align and bs used.

<59>hugepage-size=int

设置huge page的大小。至少要与系统的设定相等。默认是4MB,必然是MB的倍数,所以用hugepage-size=Xm是用来避免出现不是2的整数次方的情况。

<60>exitall

当一个job退出时,会终止运行其它的job,默认是等待所有的job都完成,fio才退出,但有时候这并不是我们想要的。

<61>bwavgtime=int

在给定时间内的平均带宽。值是以毫秒为单位的

<62>iopsavgtime=int

在给定时间内的平均IOPS,值是以毫秒为单位的

<63>create_serialize=bool

job将会串行化创建job,这将会用来避免数据文件的交叉,这依赖于文件系统和系统的CPU数

<64>create_fsync=bool

创建后同步数据文件,这是默认的值

<65>create_on_open=bool

不会为IO预先创建文件,只是在要向文件发起IO的时候,才创建open()

<66>create_only=bool

如果设置为true的话,fio将只运行到job的配置阶段。如果文件需要部署或是更新的磁盘的话,只有上面的事才会做,实际的文件内容并没有执行。

<67>pre_read=bool

如果这个选项被设置的话,在执行IO操作之前,文件将会被预读到内存.这会删除‘invalidate’标志,因为预读数据,然后丢弃cache中的数据的话,是没有意义的。这只是对可以seek的IO引擎有效,因为这允许读相同的数据多次。因此对于network和splice不起作用。

<68>unlink=bool

完成后将删除job产生的文件。默认是not,如果设置为true的话,将会花很多时间重复创建这些文件。

<69>loops=int

重复运行某个job多次,默认是1

<70>do_verify=bool

写完成后,执行一个校验的阶段,只有当verify设置的时候才有效。默认是true

<80>verify=str

写一个文件时,每次执行完一个job后,fio可以检验文件内容.允许的校验算法是:

md5,crc64,crc32c,crc32c-intel,crc32,crc16,crc7,sha512,sha256,sha1,meta,null.

这个选项可以用来执行重复的burn-in测试,来保证写数据已经正确的读回。如果是read或随机读,fio将假设它将会检验先前写的文件。如果是各种格式的写,verify将会是对新写入的数据进行校验。

<81>verifysort=bool

如果设置的话,fio will sort written verify blocks when it deems it faster to read them back in a sorted manner. This is often the case when overwriting an existing file, since the blocks are already laid out in the file system. You can ignore this option unless doing huge amounts of really fast IO where the red-black tree sorting CPU time becomes significant.

<82>verify_offset=int

Swap the verification header with data somewhere else in the block before writing. Its swapped back before verifying.

<83>verify_interval=int

Write the verification header at a finer granularity than the blocksize. It will be written for chunks the size of header_interval. blocksize should divide this evenly

<84>verify_pattern=str

<85>verify_fatal=bool

<86>verify_dump=bool

<87>verify_async=int

<88>verify_async_cpus=str

<89>verify_backlog=int

<90>verify_backlog_batch=int

<91>stonewall,wait_for_previous

等待先前的job执行完成后,再启动一个新的job。可以用来在job文件中加入串行化的点。stone wall也用来启动一个新reporting group

<92>new_group

启动一个新的reporting group。如果这个选项没有设置的话,在job文件中的job将属于相同的reporting group,除非通过stonewall隔开

<93>group_reporting

如果‘numjobs’设置的话,我们感兴趣的可能是打印group的统计值,而不是一个单独的job。这在‘numjobs’的值很大时,一般是设置为true的,可以减少输出的信息量。如果‘group_reporting’设置的话,fio将会显示最终的per-groupreport而不是每一个job都会显示

<94>thread

fio默认会使用fork()创建job,如果这个选项设置的话,fio将使用pthread_create来创建线程

<95>zonesize=int

将一个文件分为设定的大小的zone

<96>zoneskip=int

跳过这个zone的数据都被读完后,会跳过设定数目的zone.

<97>write_iolog=str

将IO模式写到一个指定的文件中。为每一个job指定一个单独的文件,否则iolog将会分散的的,文件将会冲突。

<98>read_iolog=str

将开一个指定的文件,回溯里面的日志。这可以用来存储一个负载,并进行重放。给出的iolog也可以是一个二进制文件,允许fio来重放通过blktrace获取的负载。

<99>replay_no_stall

当使用read_iolog重放I/O时,默认是尝试遵守这个时间戳,在每个IOPS之前会有适当的延迟。通过设置这个属性,将不会遵守这个时间戳,会根据期望的顺序,尝试回复,越快越好。结果就是相同类型的IO,但是不同的时间

<101>replay_redirect

当使用read_iolog回放IO时,默认的行为是在每一个IOP来源的major/minor设备上回放IOPS。这在有些情况是不是期望的,比如在另一台机器上回放,或是更换了硬件,使是major/minor映射关系发生了改变。Replay_redirect将会导致所有的IOPS回放到单个设备上,不管这些IO来源于哪里。e.g.replay_redirect=/dev/sdc将会使得所有的IO都会重定向到/dev/sdc.这就意味着多个设备的数据都会重放到一个设置,如果想来自己多个设备的数据重放到多个设置的话,需要处理我们的trace,生成独立的trace,再使用fio进行重放,不过这会破坏多个设备访问的严格次序。

<102>write_bw_log=str

在job file写这个job的带宽日志。可以在他们的生命周期内存储job的带宽数据。内部的fio_generate_plots脚本可以使用gnuplot将这些文本转化成图。

<103>write_lat_log=str

同write_bw_log类似,只是这个选项可以存储io提交,完成和总的响应时间。如果没有指定文件名,默认的文件名是jobname_type.log。即使给出了文件名,fio也会添加两种类型的log。

e.g.如果我们指定write_lat_log=foo

实际的log名将是foo_slat.log,foo_slat.log和foo_lat.log.这会帮助fio_generate_plot来自动处理log

<104>write_iops_log=str

类似于write_bw_log,但是写的是IOPS.如果没有给定文件名的话,默认的文件名是jobname_type.log。

<105>log_avg_msec=int

默认,fio每完成一个IO将会记录一个日志(iops,latency,bw log)。当向磁盘写日志的时候,将会很快变的很大。设置这个选项的话,fio将会在一定的时期内平均这些值,指少日志的数量,默认是0

<106>lockmem=int

使用mlock可以指定特定的内存大小,用来访真少量内存

<107>exec_preren=str

运行job之前,通过过system执行指定的命令

<108>exec_postrun=str

job执行完成后,通过system执行指定的命令

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

磁盘测试工具FIO 的相关文章

  • 安装 VMware 出现 failed to install the hcmon driver

    安装 VMware 出现 failed to install the hcmon driver 1 先删除所有带vmware注册表 删除后重启电脑 在装一遍 无还是无效 2 在c盘搜索hcmon sys文件 有就删除 删除之后重启电脑 再重
  • VMware虚拟机禁止防火墙启动

    每次打开虚拟机时候 都会启动防火墙 使用起来很不方便 可以做到永久关闭防火墙 查看firewall状态 systemctl status firewalld service 停止firewall systemctl stop firewal
  • Navicat15工具连接PostgreSQL15失败

    1 错误现象及原因 错误现象 错误原因 postgresql 15版本中 pg database 系统表把 datlastsysoid 列删除了 所以造成了此错误 2 解决方法 1 将Navicat工具更新到官网最新版本 2 更换 post
  • Linux怎么使用U盘

    方案一 Linux不像Windows一样 接上新硬件后可以自动识别 在Linux下无法自动识别新硬件的 需要手动去识别 USB移动存储设备通常被识别为sda1 具体可以通过fdisk l命令查询 在使用U盘前 我们先要为外挂点新建一个子目录
  • Vmware安装vmware-tools后,仍无法上网

    步骤总结 保证vmware tools安装完成 参考下文步骤一 上一步骤如遇到问题 重启vmware的操作系统 步骤总结 1 保证vmware tools安装完成 2 参考下文 步骤一 VMware Workstation虚拟机不能联网的解
  • VMware CentOS 虚拟机 Hadoop集群网络 配置静态IP

    一 虚拟机集群IP分配与规划 二 操作步骤 1 打开虚拟机 点击导航栏上面的 编辑 gt 虚拟网络编辑器 2 首先选中上面的VMnet8 不要勾选 使用本地DHCP服务将IP地址分配给虚拟机 D 在到下面的 子网IP 处编辑IP地址 可以改
  • 如何访问虚拟机中的Web服务

    需求 1 在虚拟机Vmware中安装了CentOS6 5 虚拟机使用NAT的方式 2 在CentOS中安装了APACHE 并且使用 http 192 168 237 128可以正常访问 3 想在其他windows机器上访问该虚拟机的web服
  • VMware虚拟机安装Ubuntu系统步骤详解

    VMware虚拟机安装Ubuntu系统步骤详解 Ubuntu系统介绍 VMware安装Ubuntu步骤 一 Ubuntu系统的下载 二 VMware workstation的下载安装 三 配置Ubuntu虚拟机系统 四 VMware安装Ub
  • ESXI 7.0 版本配置N卡显卡直通

    ESXI 7 版本配置N卡显卡直通 前因 ESXI版本太新 网上啥参考资料没有 显卡直通各种问题 虚机一装显卡驱动就直接把宿主机直接整挂了 于是各种查资料 各种尝试 终于搞定直通问题 配置 名称 版本 服务器 DELL R720 ESXI
  • 在VMware中给win10/win7虚拟机配置静态IP地址(保姆级教学,全是干货)

    1 点击VMware菜单栏的编辑 进入虚拟网络编辑器 2 点击更改设置 3 选择NAT模式 取消勾选 使用本地DHCP服务将IP地址分配给虚拟机 然后点击NAT设置 查看并记住网关IP 然后关闭NAT设置窗口 回到虚拟编辑器页面 点击确定
  • 无 RDP 时自动发送密钥失败

    我有一个虚拟机 我希望在其上运行自动化任务 即自动化任务在实际虚拟机上运行 VM 是 Windows 2008 服务器 我已将该任务添加到任务计划程序中 当我通过 RDP 登录到计算机时 我可以通过右键单击 运行 来运行该任务 但是 当我的
  • 在 Windows 主机上调试 VMWare 中的 Linux 内核

    我正在开发我的第一个内核模块 所以我对此有点陌生 我的模块偶尔会产生恐慌 并且我无法使用 printk 深入了解它 据我所知 我的调试选项是 1 找到生成的OOPS消息并使用ksymoops or 2 尝试使用 kgdb 进行远程调试 我正
  • VM 快照期间 BizTalk 与 SQL 的连接问题

    我们有一个用于 BizTalk 的虚拟机和一个用于 SQL 后端的单独虚拟机 我们使用 Veeam 进行备份 这基本上会启动虚拟机的快照 当此快照在 SQL VM 上最终确定时 应用程序服务器上的 BizTalk 服务将失败 通常它们会自动
  • VM 上的 Windows Phone 7 模拟器?

    Windows Phone 7 SDK 似乎不支持在虚拟机内运行 在 Parallels 上 当模拟器启动时 整个虚拟机就会崩溃 不过 在网络上 一些人报告说他们可以通过更改大量虚拟机设置来使用它 我必须更改什么才能运行它 我对 Paral
  • 区分 VMware 网络适配器和物理网络适配器 - 或 - 检测虚拟网络适配器

    我必须使用任何 Windows API 来区分真实地址和虚拟机地址 我在用着GetAdaptersAddresses用于填充本地计算机的 IP 地址列表的 API 我只需要提取除与 VMware 网络适配器关联的地址和其他地址 自动配置和隧
  • Java Process.waitFor() 和 Readline 挂起

    首先 这是我的代码 import java io import java util Date import com banctecmtl ca vlp shared exceptions public class PowershellTes
  • 自动化 VMWare 或 VirtualPC

    我目前正在尝试使用构建脚本 并且由于我有一个受源代码控制的 ASP net Web 部件 因此我的构建脚本应该在最后执行此操作 从网络获取 裸 Windows 2003 IIS VMWare 或 Virtual PC 映像 启动它 将文件从
  • 无法创建自定义 Spring Boot Starter/AutoConfiguration

    自定义启动项目命名为 hello service spring boot start 项目目录结构为 hello service spring boot start 目录结构 https i stack imgur com iHsvw pn
  • PySphere 和 PyVmomi 之间有什么区别?

    我需要编写 python 脚本来自动配置在 ESX ESXi 主机上运行的虚拟机的时间 我不知道该使用哪个 API 我能够找到 VMWare API 的 python 绑定 即 PySphere 和 PyVmomi 谁能解释一下它们之间有什
  • 由于频繁断网,repo 同步卡在 99%

    我尝试重新同步cyanogenmod源 一直到99 阶段 但是这个阶段好像有一个大文件 而且由于我的网络连接经常断开 所以无法下载它 每次发生断开连接时 fatal early EOF被打印出来 则repo sync停止 似乎在下次运行时

随机推荐

  • 使用MATLAB搭建深度神经网络(DNN)

    使用MATLAB搭建深度神经网络 DNN 深度神经网络 Deep Neural Network DNN 是一种强大的机器学习模型 常用于解决图像识别 自然语言处理 语音识别等任务 在本文中 我们将使用MATLAB搭建一个简单的DNN 并提供
  • 异常分类

    异常数据挖掘其中又包含 时间序列和非时间序列 非时间序列主要为发现异常的点集 其中各事件的发生无先后顺序 一般的探测手法为使用距离度量进行聚类 分类等操作 发现事件中的离群点 时间序列各点 各时间的发生需要考虑先后顺序 各点 各事件之间存在
  • C++弱引用智能指针weak_ptr的用处

    weak ptr也是一个引用计数型智能指针 但是它不增加对象的引用计数 即弱引用 与之相对 shared ptr是强引用 只要有一个指向对象的shared ptr存在 该对象就不会析构 直到指向对象的最后一个shared ptr析构或res
  • 我也是从寒门走出来的,程序员这个职业是我最好的选择!

    本文原创作者是 雷小帅 禁止任何未授权形式转载 目录 我们是极其普通的一类人 平凡而坚毅的过去 努力而自信的向阳而生 本文是有感而发 少图 尽量用文字描述自己的感受 我们是极其普通的一类人 前段时间有位博士的论文致谢走红了 读完后有强烈的共
  • TCP/IP网络江湖——物理层护江山:网络安全的铁壁防线(物理层下篇:物理层与网络安全)

    TCP IP网络江湖 物理层护江山 网络安全的铁壁防线 物理层下篇 物理层与网络安全 引言 一 物理层的隐私与保密 1 1 加密技术的护盾 1 2 安全传输协议的密约 1 3 物理层的安全控制 1 4 面对未知威胁的准备 二 电磁干扰与抵御
  • 使用正则表达式爬虫抓取猫眼电影排行Top100

    目标站点分析 分析网址 首页 https maoyan com 点击榜单 https maoyan com board 点击Top100 https maoyan com board 4 目标站点为 https maoyan com boa
  • 工具 - windows(PowerShell) 常用命令

    1 拷贝cp命令 例子 PS D Project test jni gt cp libs arm64 v8a NetU VTest app src main jniLibs Recurse Force 备注 Recurse 递归到子目录 F
  • vuescroll-一款基于vuejs2.x的虚拟滚动条

    介绍 Vuescroll 一个功能强大 有多种模式的基于Vue js的滚动条插件 它的原理是创建 div 用于包裹要滚动的内容 操后操作容器的样式或者scrollTop或scrollLeft完成内容的滚动 设计它的目的是用来美化和增强你的滚
  • 2023年3月股份行GX评测盘点:招商银行稳居榜首,各项指标均居前列

    易观 2023 年3月GX评测数据显示 招商银行 平安口袋银行 中信银行位居行业Top 10 浦发银行 兴业银行 光大银行紧跟其后 股份行APP 用户体验 招商银行以绝对优势稳居第一 2023年3月股份行GX评测结果数据显示 在操作体验方面
  • Google的TCP BBR拥塞控制算法深度解析

    原作者 dog250 授权发布 重新整理 极客重生 hi 大家好 今天推荐一篇我认为在TCP BBR技术里面分析非常透彻的文章 希望大家可以学习到一些真正的知识 理解其背后的设计原理 才能应对各种面试和工作挑战 宏观背景下的BBR 1980
  • 利用Python进行简单的图像识别(验证码)

    这是一个最简单的图像识别 将图片加载后直接利用Python的一个识别引擎进行识别 将图片中的数字通过 pytesseract image to string image 识别后将结果存入到本地的txt文件中 1 encoding utf 8
  • csol2服务器维护中 无法登陆游戏,csol2现在怎么登不上去?为什么?说服务...

    2016 07 08 00 48龚宁静 客户经理 CSOL金勋怎么抽的第一个建议 卡延迟 看过好多人分享经验说卡延迟出金的几率会很大 本人也有些体会 我家是10M的光纤 跟我开金少有关系 我想有很大关系 因为在活动期间 那屏刷的真叫一个快
  • Android开启和关闭护眼模式

    Android开启和关闭护眼模式 在现代社会中 我们经常长时间使用智能手机或平板电脑等电子设备 长时间盯着屏幕可能会对眼睛造成疲劳和不适 为了保护用户的眼睛健康 许多移动设备都提供了护眼模式 本文将介绍如何在Android设备上开启和关闭护
  • Element中的el-tree组件的懒加载和手动更新节点数据

  • 安装Windows10系统后,CPU 不再支持虚拟化解决方案

    小米的游戏本 之前是支持虚拟化的 安装过好几次虚拟机 最近重新安装了Windows10系统后 CPU不再支持虚拟化了 具体表现为安装VMWare失败 解决方案 小娜搜索并打开 启用或关闭Windows功能 把Hyper V的勾选去掉 因为它
  • Vue前端开发中的输入限制与输入规则探究

    前言 在Vue前端开发中 我们经常需要对用户的输入进行限制和规范 以确保数据的准确性和安全性 本文将介绍如何使用Vue的el input组件来实现输入限制和输入规则 并提供相应的代码示例 一 输入限制 最大长度限制 我们可以使用maxlen
  • 如何快速增加大量用户和用户组

    Windows平台下 假设建有Domain A和Domain B 两者已经建立了信任关系 可以采用在命令行中输入如下命令在各自的domain中增加用户或用户组 1 增加用户组FOR L i in 1 1 10 DO dsadd group
  • 神经网络与深度学习笔记——代价函数,规范化,过拟合

    神经网络与深度学习笔记系列一共有五个专题 分别是第一章使用神经网络识别手写数字 梯度下降算法是什么 主要介绍了神经网络的基础例如感知器激活函数等概念 最主要介绍了梯度下降算法 第二章反向传播算法如何工作 反向传播算法原理 主要介绍了反向传播
  • 数据结构--二叉树-堆(1)

    文章目录 树 概念 相关的基本概念 树的表示 二叉树 概念 特殊二叉树 性质 堆 二叉树的顺序结构 堆的概念 堆的实现 初始化 数组初始化为堆 向上调整 向下调整 插入 删除 打印 摧毁 判空 获取堆顶数据 验证 堆的应用 堆排序 TopK
  • 磁盘测试工具FIO

    磁盘测试工具FIO https www cnblogs com klb561 p 11939355 html 目前主流的第三方IO测试工具有fio iometer和Orion 这三种工具各有千秋 fio在Linux系统下使用比较方便 iom