测试目的
测试文件系统性能测试主要测试:读性能 写性能
文章目录
测试工具
dd工具
什么是dd工具
dd是linux最基本的测试读写的工具
原理是通过从一个设备或者文件拷贝内容写入到另一个设备或者文件中
linux特殊块设备
null设备
/dev/null
设备不会接收任何内容,任何输入的数据都会被丢弃
最常用用法是把不需要的输出重定向到这个文件
zero设备
/dev/zero
设备通常用于初始化,会无限提供空字符0x00,ASCII码是NUL,用来生成特定大小的文件
NULL和NUL的区别
NULL是指针,NUL是数,NULL是NUL的指针
随机数设备
/dev/ramdom /dev/urandom
用于生成随机字节,random设备随机性高,速度慢,urandom速度快,随机性差
dd测试参数
if
input file输入文件
if=file
输入文件名,缺省为标准输入
of
output file
of=file
输出文件名,缺省为标准输出
ibs
input block stream输入字节流
ibs=bytes
一次读入bytes个字节(一个读取块为bytes)
obs
output block stream输出字节流
obs=bytes
一次写入bytes个字节(一个写入块为bytes)
bs
block stream 字节流
bs=bytes
同时设置读写块为bytes,可代替ibs和obs
cbs
conv block stream转换字节流
cbs=bytes
一次转换bytes个字节
skip
输入跳过
skip=blocks
输入文件开头跳过blocks个块后执行
seek
输出跳过
seek
输出文件跳过
count
count=blocks
仅拷贝blocks个块
块大小为ibs指定的大小
conv
编码转换
conv=conversion[,conversion…]
用指定的参数转换文件
conv常用参数
ascii
转换 EBCDIC 为 ASCII。
ebcdic
转换 ASCII 为 EBCDIC。
ibm
转换 ASCII 为 alternate EBCDIC.
block
把每一行转换为长度为 cbs 的记录,不足部分用空格填充。
unblock
使每一行的长度都为 cbs ,不足部分用空格填充。
lcase
把大写字符转换为小写字符。
ucase
把小写字符转换为大写字符。
swab
交换输入的每对字节
noerror
出错时不停止
notrunc
不截短输出文件
sync
把每个输入块填充到ibs个字节,不足部分用空(NUL)字符补齐
iflag和oflag
iflag=FLAGS
指定读的方式FLAGS
oflag=FLAGS
指定写的方式FLAGS
FLAGS参数说明
direct
读写数据采用直接IO方式
directory
读写失败除非是directory
dsync
读写数据采用同步IO
sync
同上,但是针对是元数据
fullblock
堆积满block(accumulate full blocks of input )(iflag only);表示每次读取必定读满,没读满会进行填充
nonblock
读写数据采用非阻塞IO方式
noatime
读写数据不更新访问时间
元数据和数据的差别
元数据是记录文件本身的信息,包括属性时间什么的,文件名文件大小
数据就是文件里面的内容
dd常用测试点
顺序写
从/dev/zero中读取40M的内容并写入test文件,块大小为4k,数量为10240块,直接写入磁盘
dd if =/dev/zero of=test bs=4k count=10240 oflag=direct
为什么使用oflag
是为了只测试系统写入的性能
顺序读
从创建的test中读取40M内容并写入/dev/null,块大小为4k,数量为10240,直接从磁盘读
dd of =/dev/null if=test bs=4k count=10240 iflag=direct
读取测试注意点
测试真实读取的大小时必须超过内存大小的两倍,不然会只读取缓存数据
随机写
从/dev/random中读取40M内容并写入test文件,块大小为4k,块数量为10240
dd if =/dev/random of=test bs=4k count=10240 iflag=direct
多进程写
#!/bin/bash
nbthread=2
blocksize=1
size=1024
start=$(date +%s.%N)
for ((i=0;i<$nbthread;i++));do
echo dd if=/dev/zero of=f$i bs=${blocksize}M count=$size
#dd if=/dev/zero of=f$i bs=${blocksize}k count=1000
oflag=direct &
dd if=/dev/zero of=f$i bs=${blocksize}M count=$size &
done
wait
end=$(date +%s.%N)
echo $start $end
tt=$(echo $end-$start|bc)
rate=$(echo $nbthread*$blocksize*$size/$tt|bc)
printf "rate is %.2f MBytes/s\n" $rate
参数解释:
nbthread:代表线程数,本案例为2个线程
blocksize:代表读写一次的块大小,本案例为1M
size:代表块个数,本案例为1024个
rate:代表速率
多进程读
#!/bin/bash
nbthread=2
blocksize=1
size=1024
start=$(date +%s.%N)
for ((i=0;i<$nbthread;i++));do
echo dd if=f$i of=/dev/null bs=${blocksize}M count=$size
#dd if=f$i of=/dev/null bs=${blocksize}M count=$size
iflag=direct &
dd if=f$i of=/dev/null bs=${blocksize}M count=$size
done
wait
end=$(date +%s.%N)
echo $start $end
tt=$(echo $end-$start|bc)
rate=$(echo $nbthread*$blocksize*$size/$tt|bc)
printf "rate is %.2f MBytes/s\n" $rate
参数解释:
nbthread:代表线程数,本案例为2个线程
blocksize:代表读写一次的块大小,本案例为1M
size:代表块个数,本案例为1024个
rate:代表速率
测试结果参数说明![在这里插入图片描述](https://img-blog.csdnimg.cn/339c4ce77d0c4045b63986830be753cf.png)
10240+0 records in 输入的记录数 输入了10240块
10240+0 records out 输出的记录数 输出了10240块
41943040 bytes(42 MB)copied 表示总复制41943040字节(42MB)
43.5429s表示耗时43s
660kb/s表示每秒平均速度