Linux dd工具使用(测试性能流程)

[复制链接]
发表于 2026-10-3 21:35:01 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×

dd 是 Linux 里最朴素的块级拷贝工具,也正因为不做任何缓存优化,它常被用来做磁盘读写性能测试。本文先讲 dd 的参数含义,再给几组常用的配套命令,最后用一个真实需求串起来:把 S3 对象桶挂载为文件系统并支持 POSIX 语义之后,怎么测它的读写性能。

一、dd 简介与参数说明

Linux dd 命令用于读取、转换并输出数据,常被用来测试磁盘读写性能。dd 可从标准输入或文件中读取数据,根据指定的格式来转换数据,再输出到文件、设备或标准输出。

下面这些是日常用得最多的参数:

  • if=文件名:输入文件名,默认为标准输入,即指定源文件。
  • of=文件名:输出文件名,默认为标准输出,即指定输出位置。
  • ibs=bytes:一次读入 bytes 个字节,即指定一个块大小为 bytes 个字节。
  • obs=bytes:一次输出 bytes 个字节,即指定输出块大小。
  • bs=bytes:同时设置读入/输出的块大小为 bytes 个字节。
  • cbs=bytes:一次转换 bytes 个字节,即指定转换缓冲区大小。
  • skip=blocks:从输入文件开头跳过 blocks 个块后再开始复制。
  • seek=blocks:从输出文件开头跳过 blocks 个块后再开始复制。
  • count=blocks:仅拷贝 blocks 个块,块大小等于 ibs 指定的字节数。
  • conv=:用指定的参数转换文件,关键字有以下几种——ascii(转换 ebcdic 为 ascii)、ebcdic(转换 ascii 为 ebcdic)、ibm(转换 ascii 为 alternate ebcdic)、block(把每一行转换为长度 cbs,不足部分用空格填充)、unblock(使每一行长度都为 cbs)、lcase(大写转小写)、ucase(小写转大写)、swap(交换输入的每对字节)、noerror(出错时不停止)、notrunc(不截短输出文件)、sync(每个输入块填充到 ibs 个字节,不足部分用空字符补齐)。
  • --help:显示帮助信息。--version:显示版本信息。

输入设备方面有个常用技巧:if=/dev/zero 表示输入数据全为 0,/dev/zero 可以无穷无尽地提供 0;而 of=/dev/null 是"无敌洞",任何数据往里写都会立刻丢弃。这两个特殊设备配合 dd 就是最经典的测速组合。

二、常用配套命令

2.1 测试硬盘读写速度

# 通过下面两个命令输出的命令执行时间,可以计算出硬盘的读、写速度。
dd if=/dev/zero bs=1024 count=1000000 of=/root/1Gb.file
dd if=/root/1Gb.file bs=64k | dd of=/dev/null

第一条是写,第二条是读(经过管道把文件从一头喂到另一头并丢弃),两条各自输出的耗时相除即可换算出 MB/s。

2.2 确定硬盘最佳块大小

# 根据下面命令显示的执行时间,确定系统最佳块大小
dd if=/dev/zero bs=1024 count=1000000 of=/root/1Gb.file
dd if=/dev/zero bs=2048 count=500000  of=/root/1Gb.file
dd if=/dev/zero bs=4096 count=250000  of=/root/1Gb.file
dd if=/dev/zero bs=8192 count=125000  of=/root/1Gb.file

同样的总量,换不同 bs 跑,耗时最短的那个块大小就是本机较优值。

2.3 dd 命令拷贝整块磁盘

dd if=/dev/sda of=/dev/sdb bs=4096

2.4 创建磁盘镜像文件

# 创建一个名为 image.iso 的 CDROM 镜像文件
dd if=/dev/cdrom of=image.iso

2.5 构造数据:指定大小、个数、位置与并发数

# seq 20 表明生成 1-20 序列
# xargs -I{} 表示用 1-20 各个序列替换后面的 1G_{}.txt 中的 {},即实现输出 1G_1.txt、1G_2.txt...
# -P 20 表示并发数,即同一时刻最多有 20 个 dd 进程并发
# -n 1 每执行一次就会消耗一个 seq 20 传入的参数
# if=/dev/zero 数据输入来源为 /dev/zero,dev/zero 为输入设置,可无穷无尽提供 0
# bs(blocksize)=1G:指定 dd 的块大小为 1G
# count=1 指定块数量,块大小 bs * 块数量 count = 最终文件大小(1G*1=1G)
# 2>&1:将 dd 命令的错误输出(标准错误流 stderr)重定向到与标准输出相同的文件,
#        这样正常输出和错误信息都会被记录到同一个日志日志文件中
seq 20 | xargs -I{} -P 20 -n 1 bash -c 'dd if=/dev/zero of=/root/test/1G_{}.txt bs=1G count=1 > dd_{}.log 2>&1'

上面命令表示:生成 1-20 个 1G 文件,并发数为 20,生成文件路径为 /root/test 目录,dd 的日志日志输出到当前执行目录下。

三、实战:测试文件读写

最近接到一个需求,客户要求把 S3 对象桶挂载为文件系统,同时实现 POSIX 语义。为了验证方案可行性,需要测试挂载后的读写性能,下面按步骤走。

3.1 dd 构造测试数据

seq 20 | xargs -I{} -P 20 -n 1 bash -c 'dd if=/dev/zero of=/root/test/1G_{}.txt bs=1G count=1 > dd_{}.log 2>&1'

含义同上:生成 1-20 个 1G 文件,并发 20 路,落在 /root/test 目录,dd 日志日志写到当前目录。

3.2 测 list 速度

# ll 测试读取目录,time 用于获取命令执行所耗时间
time ll -R 10G-dir

3.3 测 rename 速度

# 挂载为 S3 后,修改对象 key 即为 rename 操作
time mv test-dir test-dir-new

3.4 观察写入文件变化

# 观察挂载目录写入情况
# watch -n 2 每隔 2s 输出后面命令执行结果,ctrl+C 退出持续查看
watch -n 2 ls -lh /root/bucket01

3.5 查看网络带宽

# 查看当前客户端网络带宽
dstat -n

3.6 查看进程所耗资源

# 获取程序 pid
ps -ef | grep xxx
# 根据 pid 过滤进程所耗资源
top -p xxx
# %CPU:CPU 使用情况;%MEM:内存使用情况

3.7 安装 ab(HTTP 压测)工具

因为需要测试日志滚动,所以要手动构造大量请求,这里采用 ab(Apache bench)工具。

# 安装 ab 工具(Apache bench)
yum install httpd-tools

# -n 1000 总共请求 1000 次
# -c 10 开启 10 个并发请求
ab -n 1000 -c 10 http://127.0.0.1:80/

3.8 通过 vdbench 造数据

rw_fs 配置文件内容:

  • threads=128:128 并发写数据。
  • depth=1,width=100,files=10000:目录深度为 1、目录宽度为 100(一个目录下有 100 个子目录)、每个子目录下有 10000 个文件。
  • size=4k:每个文件大小为 4k。
  • elapsed=3000:取样时间。
data_errors=1,messagescan=no,create_anchors=yes,debug=25
fsd=fsd1,anchor=/root/bucket01/4k-100w-parallel,depth=1,width=100,files=10000,size=4k,openflags=o_direct
fwd=fwd1,operation=write,fsd=fsd1,xfersize=4k,fileio=sequential,fileselect=sequential,threads=128
rd=rd1,fwd=fwd*,fwdrate=max,format=restart,elapsed=3000,interval=1

后台运行 vdbench:

nohup ./vdbench -f rw_fs > vd.log &
# 检查后台 job ID
jobs
# 将后台进程拉回到前台
fg %jobID

3.9 查看后台 job 是否有异常

# 返回上一个命令的状态,0 表示没有错误,其它任何值表明有错误
echo $?

# echo $! 返回后台运行的最后一个进程的进程 ID 号

小结

dd 测速的核心是控制变量:写用 if=/dev/zero of=某个文件,读用 if=那个文件 of=/dev/null,两侧各自输出的耗时就是计算吞吐的输入。要找最优块大小就固定总量换 bs 试;要造大批并发数据就用 seq + xargs -P 把 dd 并行起来。挂载型文件系统(如 S3 网关)除了顺序读写,还要额外测 list、rename 这类元数据操作,配合 time、dstat、top、watch 观察延迟与带宽,再叠 ab 和 vdbench 压出上限。注意 dd 直接写块设备有破坏数据的风险,测 of=/dev/sdX 时务必确认目标盘符。

qidao123.com企服评测-应用市场 编辑提示:本文为站点编辑整理的 Linux dd 工具使用与磁盘性能测试流程,命令已按原意规范化书写;dd 写入块设备风险较高,实操前请确认目标磁盘无重要数据;本站不提供任何压测工具下载链接或加好友服务。

回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表