5

特定のプロセスグループから生成されたパケットに優先順位を付けて、PCから送信される最初のパケットが選択されるようにしようとしています。私はcgroupsとtcを使用してこれを行うことを目指していますが、機能しないようです。

まず、ubuntuにcgroupsを次のように設定します。

modprobe cls_cgroup # load this module to get net_cls

mkdir /sys/fs/cgroup/net_cls  # mount point

mount -t cgroup net_cls -onet_cls /sys/fs/cgroup/net_cls/

mkdir /sys/fs/cgroup/net_cls/foo # new cgroup

echo 0x00010001 > /sys/fs/cgroup/foo/net_cls.classid  # echo in a class id

echo 2348 > /sys/fs/cgroup/net_cls/foo/tasks # echo in pid of firefox

tc qdisc add dev eth0 root handle 1: pri

tc qdisc add dev eth0 parent 1:1 handle 10: sfq

tc qdisc add dev eth0 parent 1:2 handle 20: sfq

tc qdisc add dev eth0 parent 1:3 handle 30: sfq

Firefoxでブラウジングして実行した後、

tc -s qdisc ls dev eth0

わかった、

qdisc prio 1: root refcnt 2 bands 3 priomap  1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1
 Sent 29351 bytes 154 pkt (dropped 0, overlimits 0 requeues 0) 
 backlog 0b 0p requeues 0 
qdisc sfq 10: parent 1:1 limit 127p quantum 1514b divisor 1024 
 Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0) 
 backlog 0b 0p requeues 0 
qdisc sfq 20: parent 1:2 limit 127p quantum 1514b divisor 1024 
 Sent 27873 bytes 143 pkt (dropped 0, overlimits 0 requeues 0) 
 backlog 0b 0p requeues 0 
qdisc sfq 30: parent 1:3 limit 127p quantum 1514b divisor 1024 
 Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0) 
 backlog 0b 0p requeues 0 

代わりに、トラフィックをハンドル10に流したいのですが、何が間違っているのでしょうか。

4

2 に答える 2

3

これを行う正しい方法では、cgroupを使用することをtcに通知する必要があります。これは、3.10カーネルを搭載したUbuntu12.04で検証されています。

net_clsをサポートしていることを確認してください

$ cat /proc/cgroups 
#subsys_name    hierarchy   num_cgroups enabled
cpuset  1   2   1
cpu 1   2   1
cpuacct 1   2   1
memory  1   2   1
net_cls 1   2   1
blkio   1   2   1

そうでない場合は、

net_clsをサポートするカーネルをコンパイルします

これらすべてのオプションを.configに入れるだけです。これらはmenuconfigに存在しないようです。

CONFIG_NET_CLS=y
CONFIG_NET_CLS_BASIC=m
CONFIG_NET_CLS_TCINDEX=m
CONFIG_NET_CLS_ROUTE4=m
CONFIG_NET_CLS_FW=m
CONFIG_NET_CLS_U32=m
CONFIG_NET_CLS_RSVP=m
CONFIG_NET_CLS_RSVP6=m
CONFIG_NET_CLS_FLOW=m
CONFIG_NET_CLS_CGROUP=y
CONFIG_NET_CLS_ACT=y
CONFIG_NET_CLS_IND=y

次に、作成してインストールします。

/ etc/fstabエントリがあることを確認します

# echo "cgroup /sys/fs/cgroup cgroup defaults 0 0" >> /etc/fstab
# reboot

テストcgroupを作成し、設定します

一部のcgroupセットアップでは、cpusetが設定されていない場合、一般的なエラーが発生します。また、メジャーおよびマイナーのtcクラスIDを0xAAAABBBBの16進数に変換する必要があります。ここで、AAAAは​​メジャーで、BBBBはマイナーです。

# mkdir /sys/fs/cgroup/clstest
# /bin/echo 0 > /sys/fs/cgroup/clstest/cpuset.mems
# /bin/echo 0 > /sys/fs/cgroup/clstest/cpuset.cpus
# /bin/echo 0x100001 > /sys/fs/cgroup/clstest/net_cls.classid

tcを構成する

# tc qdisc add dev eth2 root handle 10: htb
# tc class add dev eth2 parent 10: classid 10:1 htb rate 10mbit
# tc filter add dev eth2 parent 10: protocol ip prio 10 handle 1: cgroup

タスクをcgroupにエコーする

(ただし、一度に1つだけ)

# echo $FIREFOX_PID > /sys/fs/cgroup/clstest/tasks

tcクラスを変更する

# tc class change dev eth2 parent 10: classid 10:1 htb rate 40mbit

編集:

私はこれをイングレスで動作させることができませんでした。出力(アップロード)のみが機能しているように見えます。tc入力でcgroupオプションを使用していないようです。

于 2013-07-02T20:04:15.193 に答える
1

制御するトラフィックにクラスとフィルターを追加する必要があります(HTTPトラフィックを制御するとします)。

# tc class add dev eth0 parent 1:1 classid 1:1 htb rate 500mbit ceil 800mbit burst 10k prio 10
# tc filter add dev eth0 parent 1:1 protocol ip prio 10 u32 match ip dport 80 0xffff flowid 1:1

次に、を使用iptrafして接続レートを確認できます。

于 2013-06-24T14:31:02.770 に答える