进程网络速度批量限制防止带宽占满

什么场景需要批量限制进程网速

当你运行多个下载、备份或同步任务时,某个进程可能吃掉全部上行或下行带宽,导致网站变慢、SSH 卡顿。
批量限制进程网速,就是让这些任务共用一条“窄路”,不挤占关键服务。
本文用 tc + cgroup 实现,不需要第三方软件,所有主流 Linux 发行版都能用。

准备条件

  • 一台 Linux 服务器(Ubuntu / CentOS / Debian 均可),已登录 root 或具有 sudo 权限。
  • 知道自己的网络接口名(例如 eth0、ens3),用 ip link show 查看。
  • 确认内核支持 net_cls cgroup 子系统(通常默认支持)。

分步操作:创建 cgroup 组并关联 tc 限制

1. 挂载并创建 net_cls cgroup

sudo mkdir -p /sys/fs/cgroup/net_cls
sudo mount -t cgroup -o net_cls net_cls /sys/fs/cgroup/net_cls || true
echo "net_cls /sys/fs/cgroup/net_cls cgroup defaults 0 0" | sudo tee -a /etc/fstab

然后在 cgroup 下创建一个组,比如叫 limited

sudo mkdir /sys/fs/cgroup/net_cls/limited
echo 0x00100001 | sudo tee /sys/fs/cgroup/net_cls/limited/net_cls.classid

这里 0x00100001 表示 major 1、minor 1,后面 tc 会匹配这个 ID。

2. 把要限制的进程加入 cgroup

假设你想限制 PID 为 12345 和 12346 的两个下载进程:

echo 12345 | sudo tee /sys/fs/cgroup/net_cls/limited/cgroup.procs
echo 12346 | sudo tee /sys/fs/cgroup/net_cls/limited/cgroup.procs

如果想限制当前系统上新启动的所有占用带宽的进程,可以用脚本动态加入,但基础版请先手动测试。

3. 配置 tc 限制该 classid 的速率

清除接口 eth0 原有 qdisc(谨慎,确保没有生产流量使用自定义 qdisc):

sudo tc qdisc del dev eth0 root 2>/dev/null

创建一个根 qdisc(htb),然后创建一个 class:

sudo tc qdisc add dev eth0 root handle 1: htb default 10
sudo tc class add dev eth0 parent 1: classid 1:1 htb rate 500kbit ceil 500kbit

这行设置了总带宽 500kbit(可根据需要修改)。
接着添加 filter 匹配我们的 classid:

sudo tc filter add dev eth0 parent 1: protocol ip prio 1 handle 1: cgroup

这里 handle 1: 对应前面 class 的 handle,cgroup 表示 filter 使用 cgroup 信息。

4. 验证限制是否生效

tc -s class show dev eth0

结果中会看到 class htb 1:1 的发送字节数和速率。
同时运行 nethogs eth0(需安装 nethogs)查看进程实时带宽,被限制的进程应该不会超过 500kbit。

避坑指南

  • cgroup 重启消失:上面的挂载和创建操作重启后会丢失。建议将挂载写入 /etc/fstab,并写一个 systemd 服务或开机脚本来自动创建 cgroup 组和 tc 规则。
  • 只控制上行:tc 默认控制 egress(出站)。如果还需要限制下行,可以配合 ifb 模块或 ingress qdisc,对于新手建议先管上行。
  • 进程 PID 可能变化:如果是长期任务请使用 cgroup 的 cgroup.procs 加入进程组。如果是启动时就限制,可以用 cgexec 运行。
  • 不要在生产类 qdisc 上随意删除:如果你已经配置了复杂的 tc 规则(比如限速、分流),直接 del root 会破坏已有配置。建议先备份或测试时用临时接口。

高频问题解答

Q1:能不能不重启服务器就生效?
A:可以,上述命令全部即时生效,不需要重启。但重启后你需要重新配置,建议固化到脚本。

Q2:很多进程要限制,一个一个加 PID 太麻烦了?
A:你可以把相关进程统一放到一个 systemd service 单元中,然后在 service 的 [Service] 节加上 ControlGroup=cpu,net_cls:/limited 并设置 ExecStart。但更简单的方法是写一个 while 循环查找进程名并加入 cgroup。

Q3:我只有某个端口需要限速,不用进程行不行?
A:可以,直接用 tc filter 匹配端口(如 tc filter add dev eth0 parent 1: protocol ip prio 1 u32 match ip sport 6881 0xffff flowid 1:1),这样无需 cgroup,但只适用于单个端口。

Q4:速度限制不准确?
A:tc 的 htb 算法在短时间突发时会允许超过限制,但长期均值符合。检查你的 rate 单位(kbit ≠ kB/s)。

如果你正在处理进程网络速度批量限制防止带宽占满的问题,建议先按本文步骤在一台测试机上跑通,再应用到生产环境。
遇到异常时优先回看避坑部分,尤其注意 cgroup 持久化和 tc 规则冲突。

理解了核心原理后,你可以根据自己的业务场景(如限制备份脚本、限制 rclone 同步)把 PID 加入对应的 cgroup,实现灵活精细的带宽控制。

分享到:
上一篇
跨域API接口Nginx完整修复配置教程
下一篇
图片懒加载优化海外低速网络访问的完整教程
1
系统公告

机房迁移升级通知

尊敬的用户: IP 段 103.23.148.x、156.224.29.x 原香港一区线路波动、攻击频繁,平台定于 7 月 5 日凌晨分批迁移至香港 GIA 机房,硬件升级 AMD 铂金机型。 迁移均在凌晨操作,最大程度降低业务影响,迁移期间服务器临时关机; 升级后配置不降低、费用不涨价,数据默认同步迁移; 迁移后 IP 全部更换,请及时修改域名解析、防火墙白名单; 建议提前备份重要数据,有问题可联系在线客服。 感谢理解与支持! 泽御云科技 2026.06.30
服务中心
客服
在线客服
24小时为您服务
咨询
联系我们
联系我们,为您的业务提供专属服务。
24/7 技术支持
如果您遇到寻求进一步的帮助,请过工单与我们进行联系。
24/7 即时支持
泽御云
售前客服
泽御云
泽御云
售后客服
泽御云
技术支持
评价
您对当前页面的整体感受是否满意?
😞
非常不满意
😕
不满意
😐
一般
🙂
满意
😊
非常满意