![使用 tc 进行 lxc 带宽控制](https://linux22.com/image/597852/%E4%BD%BF%E7%94%A8%20tc%20%E8%BF%9B%E8%A1%8C%20lxc%20%E5%B8%A6%E5%AE%BD%E6%8E%A7%E5%88%B6.png)
我正在尝试限制容器内的带宽。我尝试使用以下命令,但我认为它没有效果。
cd /sys/fs/cgroup/net_cls/
echo 0x1001 > A/net_cls.classid # 10:1
echo 0x1002 > B/net_cls.classid # 10:2
tc qdisc add dev eth0 root \
handle 10: htb
tc class add dev eth0 parent 10: \
classid 10:1 htb rate 40mbit
tc class add dev eth0 parent 10: \
classid 10:2 htb rate 30mbit
tc filter add dev eth0 parent 10: \
protocol ip prio 10 \
handle 1: cgroup
这里的A和B就是用该命令创建的容器。
lxc-execute -n A -f configfile /bin/bash
lxc-execute -n B -f configfile /bin/bash
而配置文件仅包含此条目:
lxc.utsname = test_lxc
启动容器后,我在容器 A 内启动了 vsftpd,并尝试使用另一台机器上的 ftp 客户端访问文件。然后,我终止了容器 A 中的 vsftpd,并在容器 B 中启动了 vsftpd,并尝试使用另一台机器上的 ftp 客户端访问文件。
我没有观察到性能上的任何差异,就此而言,它根本不接近 40mbit/30mbit。
如果这里有什么错误,请纠正我。
答案1
这个问题没有很好的记录,但我以前遇到过。在 64 位系统上,您回显的值是不是表示为 16 位整数,但却是 32 位整数。
尝试替换:
echo 0x1001 > A/net_cls.classid # 10:1
echo 0x1002 > B/net_cls.classid # 10:2
和
echo 0x00100001 > A/net_cls.classid # 10:1
echo 0x00100002 > B/net_cls.classid # 10:2
这应该可以解决你的问题。
笔记:实际上没有必要在开头提供前导零,但为了清楚起见,我添加了它们。
答案2
许多非虚拟机管理程序容器(lxc、jails)往往具有不可靠/不完整的计量(磁盘 iops、net),这会影响其他容器。如果限制外部传输是主要问题,请首先在这些容器前面安装透明防火墙(即 ArmorLogic、Barracuda 等)。
无论如何,一定要进行负载测试,看看是否有区别。
(专业提示:Heroku 运行 LXC。 heroku run bash
)