Networking

使用 tc 控制 lxc 頻寬

  • September 5, 2014

我正在嘗試限制容器內的頻寬。我曾嘗試使用以下命令,但我認為它沒有生效。

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

而 configfile 僅包含此條目:

lxc.utsname = test_lxc

啟動容器後,我在容器 A 中啟動了 vsftpd,並嘗試使用 ftp 客戶端從另一台機器訪問文件。然後我殺死了容器 A 中的 vsftpd 並在容器 B 中啟動了 vsftpd 並嘗試使用 ftp 客戶端從另一台機器訪問文件。

我無法觀察到性能上的任何差異,因為它遠不及 40mbit/30mbit。

請糾正我這裡是否有任何問題。

這裡的問題沒有很好的記錄,但我以前經歷過。在 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

這應該可以解決您的問題。

**注意:**實際上沒有必要在開始時提供前導零,但為了清楚起見,我添加了它們。

許多非管理程序容器(lxc、jails)往往具有影響其他容器的狡猾/不完整的計量(磁碟 iops、網路)。如果限制外部傳輸是主要關注點,請先在這些防火牆前面放置透明防火牆(即 ArmorLogic、梭子魚等)。

無論如何,一定要進行負載測試,看看它是否有所作為。

(專業提示:Heroku 執行 LXC。 heroku run bash

引用自:https://serverfault.com/questions/435103