温馨提示×

centos readdir如何限速

小樊
46
2026-09-21 10:25:48
栏目: 智能运维

CentOS 上,如果你说的是 readdir() 系统调用 / 目录遍历速度过快导致磁盘 IO 或性能问题,一般可以从 应用层、系统层、文件系统层 三个角度来“限速”。下面按常见场景说明。


一、应用层限速(最推荐)

1. 在代码里 usleep / nanosleep

如果你是自己写程序调用 readdir()

#include <dirent.h>
#include <unistd.h>

DIR *dir = opendir(path);
struct dirent *entry;

while ((entry = readdir(dir)) != NULL) {
    // 处理 entry
    usleep(1000); // 每次 readdir 后睡 1ms
}
closedir(dir);

✅ 优点:简单、可控
❌ 缺点:只影响你自己的程序


2. 使用 sleep 批量读取

比如每读 100 个文件,sleep(1)

int count = 0;
while ((entry = readdir(dir))) {
    count++;
    if (count % 100 == 0)
        sleep(1);
}

二、shell 命令扫描目录限速

如果你是 ls / find 扫目录太猛:

1. find + sleep

find /data -type f | while read f; do
    echo "$f"
    sleep 0.01
done

2. ls 限速(不推荐大目录)

ls /data | while read f; do
    echo "$f"
    sleep 0.05
done

三、系统层 IO 限速(影响整个进程)

1. 使用 ionice(推荐)

限制 磁盘 IO 优先级

ionice -c 3 find /data
  • -c 3:idle 级别(最慢)
  • 不会直接限制 readdir,但能避免拖垮系统

2. 使用 cgroups(CentOS 7)

限制进程的 IO 带宽:

# 创建 cgroup
cgcreate -g blkio:/slowio

# 限制读速 1MB/s
echo "8:0 1048576" > /sys/fs/cgroup/blkio/slowio/blkio.throttle.read_bps_device

# 运行程序
cgexec -g blkio:slowio your_program

(设备号用 ls -l /dev/sda 看)


四、文件系统 / 内核层(不常用)

  • noatime / nodiratime

    mount -o remount,noatime,nodiratime /data
    

    减少元数据写,不等于限速,但能降负载

  • audit / inotify 限制(反向) 如果你是被 inotify 扫目录拖慢,那是另一回事


五、常见误解澄清

❌ 没有 readdir_rate_limit 这种内核参数
readdir 本身不消耗网络,只消耗磁盘 IO
✅ 真正要限的是 IO 带宽 / IOPS


六、你可以告诉我:

  1. C 程序 / Python / Shell
  2. 是想限 扫描速度 还是 磁盘 IO
  3. CentOS 版本(6 / 7 / 8 / Stream)?

我可以直接给你可复制的配置或代码

0