温馨提示×

centos readdir怎提速

小樊
49
2026-09-18 07:27:30
栏目: 智能运维

在 CentOS(或一般 Linux)上,readdir() 慢通常是目录太大、文件系统类型、stat 调用过多、或遍历方式不对导致的。下面按「最有效 → 次有效」给你一套提速方案。


一、最根本:减少目录里文件数量

这是最有效的办法。

  • 单目录文件数 超过 1~2 万,readdir 就会明显变慢
  • 单目录 10 万+ 文件,基本必卡

✅ 优化方式:

  • 按时间 / hash 分目录
    data/202601/01/xxx
    data/a/b/xxx
    
  • 日志、缓存、临时文件一定要拆目录

二、用 getdents64 代替 readdir

readdir() 是 glibc 封装,内部多次调用 syscall。

✅ 直接用 syscall:

#include <unistd.h>
#include <sys/syscall.h>
#include <linux/dirent.h>

syscall(SYS_getdents64, fd, buf, size);

比 readdir() 快 30%~数倍,尤其大目录。


三、避免每个文件都 stat

很多人是这样写的(很慢):

while ((entry = readdir(dir))) {
    stat(entry->d_name, &st); // ❌ 每个文件一次 stat
}

✅ 优化方案:

  • 如果只需要文件名 → 不要 stat
  • 用 open() + getdents64(),不进 stat
  • 必须 stat 时:
    • 用 fstatat(AT_NO_AUTOMOUNT)
    • 用 statx()(CentOS 7+)

四、文件系统选择(非常重要)

不同文件系统 readdir 性能差异巨大:

文件系统 大目录 readdir
ext4 一般
xfs ✅ 推荐
btrfs 慢
nfs 很慢

✅ 建议:

  • 大目录用 XFS
  • 格式化:
mkfs.xfs /dev/sdX

五、减少 dentry / inode 缓存压力

如果内存小,目录缓存会被清掉。

✅ 优化:

# 提高 dentry / inode 缓存
sysctl -w vm.vfs_cache_pressure=50

六、避免遍历 NFS / 网络盘

readdir 在 NFS 上极慢。

✅ 方案:

  • 本地先 rsync 再处理
  • 或远端生成文件列表

七、C / Python 示例优化对比

❌ Python 慢写法

for f in os.listdir(path):
    os.stat(path + "/" + f)

✅ 快写法

import os
for f in os.scandir(path):
    pass  # 不 stat

os.scandir() 比 os.listdir() 快很多。


八、实在不行:用数据库 or 索引

如果目录是:

  • 日志
  • 文件索引
  • 对象存储

✅ 正确做法:

  • 文件名写 MySQL / RocksDB
  • 目录只做“热数据”

九、快速自检命令

ls -1 | wc -l
df -T .
mount | grep "on /"

如果你愿意,可以告诉我:

  • CentOS 版本(6 / 7 / 8 / Stream)
  • 单目录文件数
  • 用的语言(C / Python / Shell)
  • 是否 NFS

我可以直接给你针对性代码或参数。

0 踩