コンテナ内の帯域幅を制限しようとしています。以下のコマンドを使ってみましたが、効果が出ていないと思います。
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)の多くは、他のコンテナーに影響を与える危険な/不完全な計測(disk iops、net)を持つ傾向があります。外部トランジットを制限することが主な関心事である場合は、最初にこれらの前に透明なファイアウォール(つまり、ArmorLogic、Barracudaなど)を貼り付けます。
いずれにせよ、間違いなく負荷テストを行って、違いが生じるかどうかを確認してください。
(ProTip:HerokuはLXCを実行します。heroku run bash
)