在 CentOS 上,“readdir 限速”通常不是直接限制 readdir() 系统调用本身,而是限制目录遍历/文件扫描的速率(例如 ls、find、rsync、备份程序等触发的 readdir)。
下面按常见场景给你几种可行方案。
find + sleep 限速适合扫描大量小文件时降低 IO 压力:
find /data -type f -exec sh -c 'echo "$1"; sleep 0.01' _ {} \;
每秒大约 100 个文件。
rsync 限速(最常用)如果是备份/同步:
rsync -a --bwlimit=10000 /src/ /dst/
--bwlimit 单位是 KB/s。
ionice 限制 IO 优先级(不影响速度但降权重)ionice -c 2 -n 7 find /data
-c 2:best-effort-n 7:最低优先级适合:不想影响系统其他进程,但不严格限速
systemd 限制 IO(CentOS 7+)对某个服务限制磁盘 IO:
[Service]
IOReadBandwidthMax=/data 10M
IOWriteBandwidthMax=/data 10M
或临时:
systemctl set-property nginx.service IOReadBandwidthMax=/data 10M
会影响该 service 下的所有
readdir / read / write
cgroups 直接限制 IO(高级)cgcreate -g blkio:/limited
echo "8:0 10485760" > /sys/fs/cgroup/blkio/limited/blkio.throttle.read_bps_device
把进程加入 cgroup:
cgclassify -g blkio:/limited <pid>
如果是 NFS readdir 太频繁:
mount -o rsize=8192,wsize=8192,actimeo=60 nfs-server:/data /mnt
readdir() 系统调用 没有原生参数| 场景 | 推荐方案 |
|---|---|
| 备份 / 同步 | rsync --bwlimit |
| 扫描目录 | ionice + sleep |
| 服务级限制 | systemd IO* |
| 严格限速 | cgroups blkio |
如果你能说明:
readdir我可以给你更精确的一条命令方案。