freenas动态分配磁盘(使用FIO测试磁盘与网络情况)

简介

FIO是测试IOPS的非常好的工具,用来对硬件进行压力测试和验证。磁盘IO是检查磁盘性能的重要指标,可以按照负载情况分成照顺序读写,随机读写两大类。

目前主流的第三方IO测试工具有fio、iometer 、 Orion,这三种工具各有千秋,在linux 下也可以使用dd 进行简单的磁盘(文件系统)测试(文末补充)。

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

Multithreaded IO generation tool , FIO 是一个多线程io生成工具,可以生成多种IO模式,用来测试磁盘设备的性能(也包含文件系统:如针对网络文件系统 NFS 的IO测试);

Description : fio is an I/O tool that will spawn a number of threads or processes doing

: a particular type of io action as specified by the user. fio takes a

: number of global parameters, each inherited by the thread unless

: otherwise parameters given to them overriding that setting is given.

: The typical use of fio is to write a job file matching the io load

: one wants to simulate.

安装

测试磁盘之前,磁盘最好是空的,也就是格式化的,如果磁盘已经有了内容, 需要卸载-格式化-挂载 # 卸载磁盘 umount /mnt/datadir1 # 格式化磁盘 mkfs.ext4 /dev/sdd # 挂载磁盘 mount -t ext4 /dev/sdd /mnt/datadir1 # 自动挂载,在里面添加该盘 vim /etc/fstab (见下图,可以在该文件下设置挂载) 安装fio yum install fio

freenas动态分配磁盘(使用FIO测试磁盘与网络情况)(1)

使用简介

从测试角度出发,一般有如下的测试设计:

序号

模块

用例

结果

1

磁盘IO测试

1M顺序写吞吐量

IOPS=353, BW=353MiB/s (371MB/s)(50.0GiB/144874msec)

2

磁盘IO测试

1M顺序读吞吐量

IOPS=1349, BW=1350MiB/s (1415 MB/s)(50.0GiB/37937msec)

3

磁盘IO测试

4K随机写IOPS

IOPS=6057, BW=23.7MiB/s (24.8MB/s)(10.0GiB/432743msec)

4

磁盘IO测试

4K随机读IOPS

IOPS=20.0k, BW=81.9MiB/s (85.9MB/s)(10.0GiB/125065msec)

说明

  1. IOPS IOPS(Input/Output Operations Per Second)每秒读写的次数

2. 50.0GiB/144874msec=353MiB/s=371MB/s

MiB/s的意思是每秒中传输2^20 byte的数据,不太常用,一般需要转换成MB/S,MB/s=MiB/s *1.024

测试命令:

fio -direct=1 -iodepth=32 -rw=write -ioengine=libaio -bs=1024k -size=50G -numjobs=1 -runtime=600 -group_reporting -filename=/mnt/test/fiotest.txt -name=Write_BandWidth_Test

fio -direct=1 -iodepth=32 -rw=read -ioengine=libaio -bs=1024k -size=50G -numjobs=1 -runtime=600 -group_reporting -filename=/mnt/test/fiotest.txt -name=Read_BandWidth_Test

fio -direct=1 -iodepth=128 -rw=randwrite -ioengine=libaio -bs=4k -size=10G -numjobs=1 -runtime=600 -group_reporting -filename=/mnt/test/fiotest.txt -name=Rand_Write_IOPS_Test

fio -direct=1 -iodepth=128 -rw=randread -ioengine=libaio -bs=4k -size=10G -numjobs=1 -runtime=600 -group_reporting -filename=/mnt/test/fiotest.txt -name=Rand_Read_IOPS_Test

命令参数说明:

filename=/dev/sdb1 测试文件名称,通常选择需要测试的盘的data目录。direct=1 是否使用directIO,测试过程绕过OS自带的buffer,使测试磁盘的结果更真实。

  • Linux读写的时候,内核维护了缓存,数据先写到缓存,后面再后台写到SSD。读的时候也优先读缓存里的数据。这样速度可以加快,但是一旦掉电缓存里的数据就没了。所以有一种模式叫做DirectIO,跳过缓存,直接读写SSD。

rw=

  • randwrite 测试随机写的I/O
  • randrw 测试随机写和读的I/O
  • write 顺序写
  • read 顺序读

bs=1024k 单次io的块文件大小为1024kbsrange=512-2048 同上,提定数据块的大小范围

size=50G 每个线程读写的数据量是50GB。numjobs=1 每个job(任务)开1个线程,这里用了几,后面每个用-name指定的任务就开几个线程测试。所以最终线程数=任务数(几个name=jobx)* numjobs。name=job1:一个任务的名字,重复了也没关系。如果fio -name=job1 -name=job2,建立了两个任务,共享-name=job1之前的参数。-name之后的就是job2任务独有的参数。thread 使用pthread_create创建线程,另一种是fork创建进程。进程的开销比线程要大,一般都采用thread测试。runtime=1000 测试时间为1000秒,如果不写则一直将5g文件分4k每次写完为止。ioengine=libaio 指定io引擎使用libaio方式。libaio:Linux本地异步I/O。请注意,Linux可能只支持具有非缓冲I/O的排队行为(设置为“direct=1”或“buffered=0”);rbd:通过librbd直接访问CEPH Radosiodepth=16 队列的深度为16.在异步模式下,CPU不能一直无限的发命令到SSD。比如SSD执行读写如果发生了卡顿,那有可能系统会一直不停的发命令,几千个,甚至几万个,这样一方面SSD扛不住,另一方面这么多命令会很占内存,系统也要挂掉了。这样,就带来一个参数叫做队列深度。Block Devices(RBD),无需使用内核RBD驱动程序(rbd.ko)。该参数包含很多ioengine,如:libhdfs/rdma等rwmixwrite=30 在混合读写的模式下,写占30%group_reporting 关于显示结果的,汇总每个进程的信息。

  • filename 报告的名称
  • name 此次测试的名称

此外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%随机写)
dd简单测试磁盘 (dd 是linux自带的,不用安装,功能没有fio全面,适用于简单的磁盘测试)

[root@docker ~]# dd if=/dev/zero of=test bs=8k count=10000 oflag=direct10000 0 records in10000 0 records out81920000 bytes (82 MB) copied, 0.876059 s, 93.5 MB/s

[root@docker ~]# dd if=test of=/dev/null bs=8k count=10000 iflag=direct10000 0 records in10000 0 records out81920000 bytes (82 MB) copied, 5.06434 s, 16.2 MB/s

/dev/null,它是空设备,也称为位桶(bit bucket)、回收站、无底洞,可以向它输出任何数据。任何写入它的输出都会被抛弃。如果不想让消息以标准输出显示或写入文件,那么可以将消息重定向到位桶。

/dev/zero,是一个输入设备,可用它来初始化文件。该设备无穷尽地提供0,可以使用任何需要的数目——设备提供的要多的多。他可以用于向设备或文件写入字符串0。

if=file 输入文件名,缺省为标准输入。 从file读取,如if=/dev/zero,该设备无穷尽地提供0,(不产生读磁盘IO) of=file 输出文件名,缺省为标准输出。 向file写出,可以写文件,可以写裸设备。如of=/dev/null,"黑洞", ibs=bytes    一次读入 bytes 个字节(即一个块大小为 bytes 个字节)。 obs=bytes   一次写 bytes 个字节(即一个块大小为 bytes 个字节)。 bs=bytes    同时设置读写块的大小为 bytes ,可代替 ibs 和 obs。如bs=8k 每次读或写的大小,即一个块的大小为8K。 cbs=bytes    一次转换 bytes 个字节,即转换缓冲区大小。 skip=blocks   从输入文件开头跳过 blocks 个块后再开始复制。 seek=blocks 从输出文件开头跳过 blocks 个块后再开始复制。(通常只有当输出文件是磁盘或磁带时才有效)。 count=blocks   仅拷贝 blocks 个块,块大小等于 ibs 指定的字节数。

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页