温馨提示×

centos readdir怎样测速

小樊
40
2026-09-15 06:58:02
栏目: 智能运维

在 CentOS(或一般 Linux)上,测 readdir 的性能/速度,通常有几种层级的做法,取决于你想测的是:

  1. 用户态 readdir() 系统调用本身
  2. 目录遍历整体性能(含内核 + 文件系统)
  3. 真实磁盘 / 网络文件系统(NFS 等)上的效果

下面按常用程度给你几种方法。


一、用 strace 粗略测 readdir 调用耗时(最简单)

适合:看 readdir 被调用了多少次、花了多少时间

strace -T -e trace=readdir,getdents,getdents64 ls /bigdir >/dev/null

说明:

  • -T:打印每个系统调用耗时
  • getdents64 是 readdir 底层真实调用

示例输出:

getdents64(3, /* 1024 entries */, 32768) = 32768 <0.002345>

✅ 快速但不精确(有 strace 自身开销)


二、用 time + 目录遍历命令(最常用)

1. 测整个目录读取速度

time ls -f /path/to/dir | wc -l

或

time find /path/to/dir -maxdepth 1 >/dev/null

-f 表示不排序,更接近 readdir 原生行为


三、写 C 程序精确测 readdir(推荐)

这是最准确的方法。

示例:readdir 测速程序

#include <stdio.h>
#include <dirent.h>
#include <sys/time.h>

int main(int argc, char *argv[]) {
    if (argc < 2) {
        printf("usage: %s <dir>\n", argv[0]);
        return 1;
    }

    struct timeval start, end;
    gettimeofday(&start, NULL);

    DIR *dir = opendir(argv[1]);
    if (!dir) {
        perror("opendir");
        return 1;
    }

    struct dirent *entry;
    long count = 0;
    while ((entry = readdir(dir)) != NULL) {
        count++;
    }

    closedir(dir);

    gettimeofday(&end, NULL);
    double sec = (end.tv_sec - start.tv_sec) +
                 (end.tv_usec - start.tv_usec) / 1e6;

    printf("entries: %ld\n", count);
    printf("time: %.6f s\n", sec);
    printf("speed: %.0f entries/s\n", count / sec);

    return 0;
}

编译 & 运行

gcc readdir_test.c -o readdir_test
./readdir_test /path/to/dir

✅ 这是真正的 readdir 测速


四、测“大量小文件目录”性能(常见瓶颈)

mkdir testdir
cd testdir
for i in $(seq 1 100000); do touch file_$i; done

然后:

./readdir_test ./testdir

对比:

  • ext4
  • xfs
  • NFS

⚠️ ext4 在大目录(>10万)下性能下降明显


五、进阶:用 perf 分析 readdir 系统调用

perf trace -e getdents64 ls /bigdir

或:

perf stat -e syscalls:sys_enter_getdents64 ls /bigdir

六、常见结论(CentOS 实战经验)

  • readdir 慢通常是:
    • 目录太大(>5万)
    • 文件系统类型差(ext4 vs xfs)
    • NFS / 云盘延迟高
  • 优化方式:
    • 拆分目录
    • 用 getdents64 批量读
    • 换 XFS
    • 减少 stat 调用

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

  • CentOS 版本(7 / 8 / Stream)
  • 文件系统(ext4 / xfs / NFS)
  • 目录文件数量级(千 / 万 / 百万)

我可以给你更针对性的测速方案和参数。

0 踩