nmtui 和 nmcli 无法配置 cgroup 网络带宽限制,因其仅管理网络连接配置,不涉及进程级资源隔离或与 cgroup net_cls/net_prio/net controller 交互。

nmtui 和 nmcli 都不能直接配置 cgroup 来限制进程的网络带宽。 这是一个常见误解。NetworkManager(及其命令行工具 nmcli、文本界面 nmtui)只负责管理网络连接、IP 地址、DNS、路由等链路层和网络层的连接配置,它不涉及进程级资源隔离或流量整形,也不与 cgroup v1/v2 的 net_cls、net_prio 或 cgroup v2 的 `net` controller 交互。
为什么 nmcli 无法配置网络 cgroup
nmcli 操作的对象是 NetworkManager 的“连接”(connection)和“设备”(device),例如 eth0、wlp2s0、bond0 等。它能设置 IP、MTU、DHCP 行为、绑定模式等,但:
- 不读写
/sys/fs/cgroup/下的任何子系统; - 不调用
cgexec、systemd-run --scope或mkdir -p /sys/fs/cgroup/net_cls/myapp等操作; - 不支持为某个进程或服务分配网络类标识(如 net_cls.classid)或设置带宽上限(cgroup v2 中的
net.max)。
真正能限制进程带宽的替代方案
若目标是“让某进程(如 wget、python server、rsync)只用指定带宽”,应绕过 NetworkManager,采用以下成熟方法:
-
使用
tc+iptables+ cgroup v1 net_cls:给进程打 cgroup 标签 → iptables 匹配该标签 → tc 基于标记限速。需手动挂载 cgroup、设置 classid、加载 qdisc、添加 filter,步骤较重但精准; -
使用 cgroup v2 +
tc(推荐新系统):启用netcontroller 后,可直接在/sys/fs/cgroup/myapp/下写net.max(如"10mbit 5mbit"表示 ingress+egress 速率),再用cgexec -g net:myapp command启动进程; -
使用
trickle:轻量级用户空间带宽限制器,无需 root(部分模式需),适合单个命令:trickle -s -u 512 -d 2048 wget http://bigfile(上行512KB/s,下行2MB/s); -
使用
wondershaper:仅作用于整个网卡(如 eth0),不能按进程区分,但简单易用:sudo wondershaper eth0 2048 512; -
通过 systemd service unit 设置:在
.service文件中加入MemoryLimit=、IOWeight=,并配合NetworkQoS=(仅部分新版 systemd 支持,非通用)或搭配ExecStartPre=调用 tc 脚本。
简明操作示例(cgroup v2 + tc)
假设你用的是较新内核(≥5.8)且已启用 cgroup v2(默认):
- 启用 net controller:
sudo mkdir -p /sys/fs/cgroup/myapp && echo "+net" | sudo tee /sys/fs/cgroup/cgroup.subtree_control; - 设置带宽上限:
echo "10000000 5000000" | sudo tee /sys/fs/cgroup/myapp/net.max(单位:bps,即 10Mbps 下行 + 5Mbps 上行); - 启动进程:
sudo cgexec -g net:myapp curl -o /dev/null http://example.com; - 验证:
cat /sys/fs/cgroup/myapp/net.max和cat /sys/fs/cgroup/myapp/net.stat。
不复杂但容易忽略:cgroup 限速依赖内核支持和正确挂载,且 tc 规则必须与 cgroup 标记协同生效——nmcli 在这个链条里没有位置。


















