环境
(不重要,fio在第二part)
挂一个盘
# 查看磁盘/分区
fdisk -l
# 做分区
fdisk /dev/sdb # 根据提示,依次输入”n”(新建分区),”p” “1”(1个分区),两次回车,”wq”
# 做文件系统
mkfs -t ext4 /dev/sdb1
# 建个目录挂在上
mkdir /mnt/storage01
mount /dev/sdb1 /mnt/storage01
fio测试磁盘性能
安装
apt-get install fio
apt-get install sysstat # 可以使用iostat
测试
sudo fio -name=4krandw \
-runtime=40 \
-filename=/mnt/storage01/testfile \
-ioengine=libaio \
-direct=1 \
-bs=4K \
-size=10g \
-iodepth=128 \
-numjobs=1 \
-rw=randrw \
-group_reporting \
-time_based
fio的常用参数
- runtime=time¶运行时长,如不指定单位,默认为秒。
- direct=bool¶如果值为 true,则使用非缓冲 I/O。在 Windows 上,同步 ioengine 不支持直接 I/O。默认值:false。
- buffered=bool¶如果值为 true,则使用缓冲 I/O。这与 direct选项相反。默认为false。
- ioengine=str¶
- libaioLinux 本机异步 I/O。请注意,Linux 可能仅支持使用非缓冲 I/O(设置direct=1或 buffered=0)的排队行为。该引擎定义了引擎特定的选项。
- …
- blocksize=int[,int][,int], bs=int[,int][,int]¶用于 I/O 单元的块大小(以字节为单位)。默认值:4096。单个值适用于读取、写入和修剪。可以为读取、写入和修剪指定逗号分隔的值。不以逗号结尾的值适用于后续类型。示例:
- bs=256k
意味着 256k 用于读取、写入和修剪。 - bs=8k,32k
意味着 8k 用于读取,32k 用于写入和修剪。 - bs=8k,32k,
表示读取为 8k,写入为 32k,修剪为默认值。 - bs=,8k
意味着读取的默认值,写入和修剪的默认值是 8k。 - bs=,8k,
意味着读取的默认值,写入的 8k 和修剪的默认值。
- readwrite=str, rw=str¶I/O 模式的类型。可接受的值为:
- 读顺序读取。
- 写顺序写入。
- 修剪顺序修剪(仅限 Linux 块设备和 SCSI 字符设备)。
- 朗读随机读取。
- 随机写随机写入。
- 兰德特里姆随机修剪(仅限 Linux 块设备和 SCSI 字符设备)。
- 读写,读写顺序混合读取和写入。
- 随机随机混合读写。
- 修剪写顺序修剪+写入序列。将首先修剪块,然后写入相同的块。
- iodepth=int¶要针对文件保持运行的 I/O 单元数。请注意,将iodepth 增加到1 以上不会影响同步 ioengine(verify_async使用时的小度数除外)。甚至异步引擎也可能会施加操作系统限制,导致无法达到所需的深度。这可能在 Linux 上使用 libaio 而未设置 direct=1 时发生,因为缓冲 I/O 在该操作系统上不是异步的。密切关注 fio 输出中的 I/O 深度分布,以验证达到的深度是否符合预期。默认值:1。
- numjobs=int¶创建此作业的指定数量的克隆。每个作业克隆都作为一个独立的线程或进程产生。可用于设置更多执行相同操作的线程/进程。每个线程单独报告;要查看所有克隆整体的统计信息,请与.group_reporting一起使用new_group。见--max-jobs。默认值:1。
- group_reporting¶有时将工作组的统计数据作为一个整体而不是每个单独的工作显示可能会很有趣。如果 numjobs使用,则尤其如此;查看单个线程/进程输出很快变得笨拙。要查看每个组而不是每个作业的最终报告,请使用group_reporting. 文件中的作业将属于同一报告组,除非用 分隔stonewall或使用new_group。
- time_based¶runtime如果设置,即使文件被完全读取或写入,fio 也会在指定的持续时间内运行。runtime它只会在允许的范围内多次循环相同的工作负载。
sudo fio -name=4krandw \
-runtime=40 \
-filename=/mnt/storage01/testfile \
-ioengine=libaio \
-direct=1 \
-bs=4K \
-size=10g \
-iodepth=128 \
-numjobs=1 \
-rw=randrw \
-group_reporting \
-time_based
可以通过iostat
协助查看io速率
iostat -x -t 1 # 查看磁盘top # 查看资源
复杂一点的场景——spdk性能
spdk :是一个基于dpdk的存储开发kit,这里主要利用了它提供的用户态nvme driver —— spdk链接
安装spdk
spdk安装需要fio的编译结果中的一项依赖
# 安装spdk需要fio
git clone https://github.com/axboe/fio
cd fio && git checkout fio-3.12
sudo make # 这里make结果中有一项spdk中的依赖
安装spdk
# 安装spdk
git clone https://github.com/spdk/spdk
cd spdk && git submodule update --init # git submodule会下载一些依赖,包括dpdk;也可自行下载、编译dpdk(尚不知其意义)
sudo ./scripts/pkgdep.sh # 自动安装依赖项的脚本,from github https://github.com/spdk/spdk
sudo ./configure --with-fio=/data/zy/test/fio_test/fio # 指定fio project的位置,(note:is project,not可执行文件)
sudo make
unbind nvme driver替换为vfio
# 注意: 应该先解除要测的磁盘挂载;
# df # 查看磁盘挂载
# umount 挂载点 # 解除挂载
bash spdk/scripts/setup.sh # 修改磁盘驱动,修改后将找不到该磁盘,spdk通过pci号识别磁盘
测试
# 使用fio执行测试
LD_PRELOAD=/data/zy/test/fio_test/spdk/build/fio/spdk_nvme fio fio_test.conf
这次使用配置文件的方式,fio_test.conf如下
[global]
ioengine=spdk
thread=1
group_reporting=1
direct=1
verify=0
time_based=1
ramp_time=0
norandommap=1
runtime=40
iodepth=128
rw=randrw
bs=4K
[test]
numjobs=1
filename=trtype=PCIe traddr=0000.00.15.0 ns=1
获取其中的traddr的方式
# 获得pci号的方式,即配置中的traddr
# traddr: traddr在总线上的位置:
ls -l /sys/class/block/
# 或者
lspci | grep SSD
# 注意将其中的 : 改为 .
再进一步——借助Prometheus
未完待续。。。
主机容器状态监控
参考
1.12. Job file parameters
https://github.com/spdk/spdk/issues/29