应使用 stat -f -c "%s" 获取文件系统推荐 i/o 块大小(如 4096),或 stat -c "%b" 获取文件级 st_blksize;%o 仅返回权限八进制值,与 i/o 性能无关。

直接用 stat -c "%o" 获取的是文件的 访问权限八进制表示(如 644、755),不是 IO 块大小。这个格式符和优化读写完全无关,属于常见误解。
要获取文件系统推荐的最优 I/O 块大小,需明确区分两个关键概念,并选用对应工具:
用 stat -f 查文件系统层面的推荐块大小(最实用)
这是应用程序优化缓冲区时真正该用的值,对应内核为该挂载点推导出的「最佳传输单位」:
-
stat -f -c "%s" /path→ 输出f_frsize:文件系统基本分配单元(通常等于 f_bsize) -
stat -f -c "%S" /path→ 输出f_bsize:文件系统推荐 I/O 缓冲区大小(如 4096、65536) - 两者在绝大多数本地文件系统(ext4、XFS)中数值相同,优先用
%S - 路径必须是目录或挂载点(如
/home或/),不能是普通文件
用 stat 获取单个文件的 st_blksize(次选,但更贴近文件行为)
它反映该文件所在文件系统对「这个文件」的 I/O 对齐建议,由 VFS 层提供,比 f_bsize 更细粒度:
-
stat -c "%B" /path/to/file→ 输出st_blksize字段(单位字节) - 值通常为 4096、8192、65536,取决于挂载选项和文件系统类型
- 对普通文件 read()/write() 调用最有效:按此值分配缓冲区并确保偏移对齐,可减少内核内部拷贝
- 注意:它不是物理扇区大小,也不等同于内存页大小
别碰 %o,也别硬编码 4096
以下做法会带来实际性能风险:
-
stat -c "%o"返回权限值,和 I/O 性能零关系 - 硬编码 4096 在 XFS su=64k 挂载、NVMe DAX 模式、NFSv4.2 等场景下显著低效
- getpagesize() 返回内存页大小,不反映存储层对齐要求
- 直接读
/sys/block/*/queue/logical_block_size得到的是块设备层参数,绕过 VFS,对普通文件无意义
实际编码中,应先调用 stat() 或 statvfs() 获取 st_blksize 或 f_bsize,再用 posix_memalign() 分配对齐内存,最后配合 read()/write() 使用——绕过 stdio 缓冲,才能真正发挥对齐优势。











