在 CentOS 上,如果你说的是 readdir() 系统调用 / 目录遍历速度过快导致磁盘 IO 或性能问题,一般可以从 应用层、系统层、文件系统层 三个角度来“限速”。下面按常见场景说明。
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);
✅ 优点:简单、可控
❌ 缺点:只影响你自己的程序
sleep 批量读取比如每读 100 个文件,sleep(1):
int count = 0;
while ((entry = readdir(dir))) {
count++;
if (count % 100 == 0)
sleep(1);
}
如果你是 ls / find 扫目录太猛:
find + sleepfind /data -type f | while read f; do
echo "$f"
sleep 0.01
done
ls 限速(不推荐大目录)ls /data | while read f; do
echo "$f"
sleep 0.05
done
ionice(推荐)限制 磁盘 IO 优先级:
ionice -c 3 find /data
-c 3:idle 级别(最慢)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
我可以直接给你可复制的配置或代码。