以下脚本后复制,直接执行,可以对比多台机器的性能
#!/bin/bash
#sh 作为脚本解释器
echo "=== System Info ==="
打印分隔标题,便于阅读输出
uname -r
显示当前 Linux 内核版本(用于判断是否因内核差异导致行为不同)
free | head -2
显示内存使用情况(-h 表示人类可读格式),只取前两行(总内存和已用/空闲概览)
df -T .
显示当前目录所在文件系统的类型(如 ext4、xfs)和挂载信息,
用于确认是否为本地磁盘及文件系统类型
echo -e "\n=== Dirty Page Settings ==="
打印脏页(dirty page)相关内核参数标题
-e 允许解释转义字符(如 \n 换行)
sysctl vm.dirty_ratio vm.dirty_background_ratio vm.dirty_expire_centisecs vm.dirty_writeback_centisecs
查询影响 Page Cache 写回行为的关键内核参数:
- dirty_ratio: 脏页占总内存比例上限(超过则阻塞写入)
- dirty_background_ratio: 后台开始刷盘的阈值
- dirty_expire_centisecs: 脏页最大存活时间(单位:厘秒,3000 = 30秒)
- dirty_writeback_centisecs: 后台刷盘线程唤醒间隔(500 = 5秒)
这些参数是"非 direct I/O 性能差异"的最常见原因
echo -e "\n=== Test without direct (with sync) ==="
测试普通写入(走 Page Cache)并强制同步到磁盘
time sh -c "dd if=/dev/zero of=testfile bs=1024 count=10000 2>/dev/null; sync"
- dd 生成 10,000 × 1024 = 10MB 的零文件,写入当前目录
- 2>/dev/null 屏蔽 dd 的统计输出,只保留 time 的耗时
- sync 确保所有缓存数据真正落盘,测量完整写入+刷盘时间
- time 测量整个命令(dd + sync)的执行耗时
rm -f testfile
强制删除刚创建的 testfile,避免残留(-f 表示不提示、忽略不存在)
echo -e "\n=== Test with direct ==="
测试 Direct I/O(绕过 Page Cache,直接写磁盘)
time dd if=/dev/zero of=testfile bs=1024 count=10000 oflag=direct 2>/dev/null
- oflag=direct:启用 Direct I/O,绕过操作系统缓存
- 此模式反映真实磁盘吞吐能力
- 同样屏蔽 dd 输出,仅保留 time 耗时
rm -f testfile