web-dev-qa-db-ja.com

tcを使用したlxc帯域幅制御

コンテナ内の帯域幅を制限しようとしています。以下のコマンドを使ってみましたが、効果が出ていないと思います。

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に近いところはありません。

ここで何か問題がないか訂正してください。

5
kumar

ここでの問題は十分に文書化されていませんが、私は以前にそれを経験しました。 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

これで問題が解決するはずです。

注:最初に先行ゼロを指定する必要はありませんが、わかりやすくするために追加しました。

5
Matthew Ife

ハイパーバイザー以外のコンテナー(lxc、jails)の多くは、他のコンテナーに影響を与える危険な/不完全な計測(disk iops、net)を持つ傾向があります。外部トランジットを制限することが主な関心事である場合は、最初にこれらの前に透明なファイアウォール(つまり、ArmorLogic、Barracudaなど)を貼り付けます。

いずれにせよ、間違いなく負荷テストを行って、違いが生じるかどうかを確認してください。

(ProTip:HerokuはLXCを実行します。heroku run bash

2
user31170