Linuxでのトラフィックのシェーピング。 パート2

Linuxでのトラフィック管理に関する記事の第2部。 この記事では、トラフィックの優先順位付け(QoS)の例を示し、トラフィックをフィルタリングするためのハッシュテーブル(高速ハッシュテーブル)の使用について説明します。これを使用すると、生産性が大幅に向上します。

最初の部分では、htbinitの複雑度が中程度の構成の生成に焦点を当てました。 今日は、トラフィックの優先順位付けとフィルターでのハッシュテーブルの使用について説明します。 記事の最初の部分を読んでいるということです。

高いpingに関するユーザーのコメントにうんざりしている場合、フォーラムで反撃するのは不可能であるという絶え間ない子供の叫びにうんざりしているとします。すべての測定はトレントをオフにして行う必要があります;すでに電力はありません。

それが私たちの良心がはっきりしている理由であり、私たちは大声で言うことができません:「問題はこのサービスを提供するプロバイダー側​​にあります」



次の順序で優先順位を設定します。

1. icmp

2. udp

3. TCPポート80

4.バルクトラフィック



内部インターフェイスの帯域幅制限を考慮し、「ダウンロード速度」を管理します。

思い出させてください。

プレゼンテーションの単純なバージョンでは、トラフィックスライシングアルゴリズムは次のようになります。

1.インターフェイスのルートディシプリンを作成し、未分類のトラフィックが送信されるクラスを示します。

2.ルートクラスを作成し、チャネルの幅を決定します。

3.サブスクライバーをシェーピングするための子クラスを作成します。

4.サブスクライバクラスのシェーピングの規律を作成します。

5.フィルタを作成して、加入者トラフィックを分類します。





#!/bin/bash



# "" eht1

/sbin/tc qdisc del dev eth1 root handle 1: htb default 15

#

/sbin/tc qdisc add dev eth1 root handle 1: htb default 15

#

/sbin/tc class add dev eth1 parent 1: classid 1:1 htb rate 10Mbit ceil 10Mbit



#

/sbin/tc class add dev eth1 parent 1:1 classid 1:10 htb rate 512kbit ceil 512kbit



# 4

/sbin/tc class add dev eth1 parent 1:10 classid 1:11 htb rate 1kbit ceil 512kbit prio 1

/sbin/tc class add dev eth1 parent 1:10 classid 1:12 htb rate 1kbit ceil 512kbit prio 2

/sbin/tc class add dev eth1 parent 1:10 classid 1:13 htb rate 1kbit ceil 512kbit prio 3

/sbin/tc class add dev eth1 parent 1:10 classid 1:14 htb rate 1kbit ceil 512kbit prio 4



#

/sbin/tc qdisc add dev eth1 parent 1:11 handle 11: sfq perturb 10

/sbin/tc qdisc add dev eth1 parent 1:12 handle 12: sfq perturb 10

/sbin/tc qdisc add dev eth1 parent 1:13 handle 13: sfq perturb 10

/sbin/tc qdisc add dev eth1 parent 1:14 handle 14: sfq perturb 10



4 ,

/sbin/tc filter add dev eth1 parent 1:0 protocol ip prio 1 u32 match ip dst 192.168.2.2/32 match ip protocol 1 0xff flowid 1:11

/sbin/tc filter add dev eth1 parent 1:0 protocol ip prio 2 u32 match ip dst 192.168.2.2/32 match ip protocol 17 0xff flowid 1:12

/sbin/tc filter add dev eth1 parent 1:0 protocol ip prio 3 u32 match ip dst 192.168.2.2/32 match ip protocol 6 0xff match ip sport 80 0xffff flowid 1:13

/sbin/tc filter add dev eth1 parent 1:0 protocol ip prio 4 u32 match ip dst 192.168.2.2/32 flowid 1:14




* This source code was highlighted with Source Code Highlighter .








例から、トラフィックの優先順位付けの実装のために、それぞれに個別のクラスを作成したことがわかると思います。 次に、フィルターを作成します。prioが少ないほど、トラフィックの優先度が高くなります。 一般に、ルールは追加された方法に従って処理されます。優先度の場合、最も優先度の高いルールが最初に提供されます。

また、クライアントのルートクラスのRATEの4分の1に等しい各クラスRATEを示すこともできます。これは確かです。

この国連のために4つのフィルターを作成しなければならなかったという事実に注意を喚起したいと思います。3-4であれば、ルールの巨大な線形リストを取得します-結果として、パフォーマンスはベースボードの下に落ちます。

これを回避するために、「高速」ハッシュテーブルを使用します。

ウィキペディアでテーブルハッシュとは何かを見ることができます。

256セルの4つのテーブルを作成してみましょう。各テーブルは、オクテットとアドレスのいずれかを評価します。

そして最終的には、クラシックバージョンのようにリスト全体を検索する代わりに、チェックの数を減らし、負荷を大幅に減らします。

例。

#

/sbin/tc filter add dev eth1 parent 1:0 protocol ip u32

# 4

/sbin/tc filter add dev eth1 parent 1:0 handle 10: protocol ip u32 divisor 256

/sbin/tc filter add dev eth1 parent 1:0 handle 11: protocol ip u32 divisor 256

/sbin/tc filter add dev eth1 parent 1:0 handle 12: protocol ip u32 divisor 256

/sbin/tc filter add dev eth1 parent 1:0 handle 13: protocol ip u32 divisor 256

# ID 10

/sbin/tc filter add dev eth1 parent 1:0 protocol ip u32 ht 801:: match ip dst 0.0.0.0/0 hashkey mask 0xff000000 at 16 link 10:

# 10 , 192, 11

/sbin/tc filter add dev eth1 parent 1:0 protocol ip u32 ht 10:c0: match ip dst 192.0.0.0/8 hashkey mask 0xff0000 at 16 link 11:

# 11 , 168, 12

/sbin/tc filter add dev eth1 parent 1:0 protocol ip u32 ht 11:a8: match ip dst 192.168.0.0/16 hashkey mask 0xff00 at 16 link 12:

# 12 , 2, 13

/sbin/tc filter add dev eth1 parent 1:0 protocol ip u32 ht 12:2: match ip dst 192.168.2.0/24 hashkey mask 0xff at 16 link 13:



# 13 , 4 ,

/sbin/tc filter add dev eth1 parent 1:0 protocol ip prio 1 u32 ht 13:2: match ip dst 192.168.2.2/32 match ip protocol 1 0xff flowid 1:11

/sbin/tc filter add dev eth1 parent 1:0 protocol ip prio 2 u32 ht 13:2: match ip dst 192.168.2.2/32 match ip protocol 17 0xff flowid 1:12

/sbin/tc filter add dev eth1 parent 1:0 protocol ip prio 3 u32 ht 13:2: match ip dst 192.168.2.2/32 match ip protocol 6 0xff match ip sport 80 0xffff flowid 1:13

/sbin/tc filter add dev eth1 parent 1:0 protocol ip prio 4 u32 ht 13:2: match ip dst 192.168.2.2/32 flowid 1:14




* This source code was highlighted with Source Code Highlighter .






以下は、優先順位付けとハッシュフィルターを含むtcのルールを生成するフィドルのリストです。

きしみ音は完全に機能しています。自分でそれを修正することは難しくないと思います。

線形フィルターからテーブルハッシュに切り替えると、負荷はほぼ4倍に低下しました。

#!/bin/bash

mysql= "mysql -ppass -u user -h host"

# , ,

echo "select ext_iface from system.shaper_view group by ext_iface;" |$mysql|sed 1d|

awk '{

print "/sbin/tc qdisc del dev "$1" root handle 1: htb default 15";

print "/sbin/tc qdisc add dev "$1" root handle 1: htb default 15";

print "/sbin/tc class add dev "$1" parent 1: classid 1:1 htb rate 10Mbit ceil 10Mbit";

print "/sbin/tc filter add dev "$1" parent 1:1 prio 10 protocol ip u32";

print "/sbin/tc filter add dev "$1" parent 1:0 protocol ip u32";

print "/sbin/tc filter add dev "$1" parent 1:0 handle 10: protocol ip u32 divisor 256";

print "/sbin/tc filter add dev "$1" parent 1:0 handle 11: protocol ip u32 divisor 256";

print "/sbin/tc filter add dev "$1" parent 1:0 handle 12: protocol ip u32 divisor 256";

print "/sbin/tc filter add dev "$1" parent 1:0 handle 13: protocol ip u32 divisor 256";

print "/sbin/tc filter add dev "$1" parent 1:0 protocol ip u32 ht 801:: match ip dst 0.0.0.0/0 hashkey mask 0xff000000 at 16 link 10:";

}'


# , ,

echo "select int_iface from system.shaper_view group by int_iface;" |$mysql|sed 1d|

awk '{

print "/sbin/tc qdisc del dev "$1" root handle 1: htb default 15";

print "/sbin/tc qdisc add dev "$1" root handle 1: htb default 15";

print "/sbin/tc class add dev "$1" parent 1: classid 1:1 htb rate 10Mbit ceil 10Mbit";

print "/sbin/tc filter add dev "$1" parent 1:1 prio 10 protocol ip u32";

print "/sbin/tc filter add dev "$1" parent 1:0 protocol ip u32";

print "/sbin/tc filter add dev "$1" parent 1:0 handle 10: protocol ip u32 divisor 256";

print "/sbin/tc filter add dev "$1" parent 1:0 handle 11: protocol ip u32 divisor 256";

print "/sbin/tc filter add dev "$1" parent 1:0 handle 12: protocol ip u32 divisor 256";

print "/sbin/tc filter add dev "$1" parent 1:0 handle 13: protocol ip u32 divisor 256";

print "/sbin/tc filter add dev "$1" parent 1:0 protocol ip u32 ht 801:: match ip src 0.0.0.0/0 hashkey mask 0xff000000 at 12 link 10:";

}'




# , ,

echo "select user_id,ip,speed,int_iface,ext_iface from system.shaper_view order by user_id;" |$mysql|sed 1d|

awk '

BEGIN{

buf=0;

class_id=255;

tc_class="/sbin/tc class add dev";

tc_qdisc="/sbin/tc qdisc add dev";

tc_filter="/sbin/tc filter add dev";

}

{

if(buf!=$1)

{

printf "%s%x%s\n", "# ",class_id," "class_id" "$2;

client_speed=$3*128;

printf "%s%x%s\n",tc_class" "$4" parent 1:1 classid 1:",++class_id," htb rate "client_speed"bps ceil "client_speed"bps";

printf "%s%x%s\n",tc_class" "$5" parent 1:1 classid 1:",class_id," htb rate "client_speed"bps ceil "client_speed"bps";

client_class=class_id;

printf "%s%x%s%x%s\n",tc_class" "$4" parent 1:",client_class," classid 1:",++class_id," htb rate 1024bps ceil "client_speed"bps prio 1";

printf "%s%x%s%x%s\n",tc_class" "$5" parent 1:",client_class," classid 1:",class_id," htb rate 1024bps ceil "client_speed"bps prio 1";

printf "%s%x%s%x%s\n",tc_qdisc" "$4" parent 1:",class_id," handle ",class_id,": sfq perturb 10";

printf "%s%x%s%x%s\n",tc_qdisc" "$5" parent 1:",class_id," handle ",class_id,": sfq perturb 10";

printf "%s%x%s%x%s\n",tc_class" "$4" parent 1:",client_class," classid 1:",++class_id," htb rate 1024bps ceil "client_speed"bps prio 2";

printf "%s%x%s%x%s\n",tc_class" "$5" parent 1:",client_class," classid 1:",class_id," htb rate 1024bps ceil "client_speed"bps prio 2";

printf "%s%x%s%x%s\n",tc_qdisc" "$4" parent 1:",class_id," handle ",class_id,": sfq perturb 10";

printf "%s%x%s%x%s\n",tc_qdisc" "$5" parent 1:",class_id," handle ",class_id,": sfq perturb 10";

printf "%s%x%s%x%s\n",tc_class" "$4" parent 1:",client_class," classid 1:",++class_id," htb rate 1024bps ceil "client_speed"bps prio 3";

printf "%s%x%s%x%s\n",tc_class" "$5" parent 1:",client_class," classid 1:",class_id," htb rate 1024bps ceil "client_speed"bps prio 3";

printf "%s%x%s%x%s\n",tc_qdisc" "$4" parent 1:",class_id," handle ",class_id,": sfq perturb 10";

printf "%s%x%s%x%s\n",tc_qdisc" "$5" parent 1:",class_id," handle ",class_id,": sfq perturb 10";

printf "%s%x%s%x%s\n",tc_class" "$4" parent 1:",client_class," classid 1:",++class_id," htb rate 1024bps ceil "client_speed"bps prio 4";

printf "%s%x%s%x%s\n",tc_class" "$5" parent 1:",client_class," classid 1:",class_id," htb rate 1024bps ceil "client_speed"bps prio 4";

printf "%s%x%s%x%s\n",tc_qdisc" "$4" parent 1:",class_id," handle ",class_id,": sfq perturb 10";

printf "%s%x%s%x%s\n",tc_qdisc" "$5" parent 1:",class_id," handle ",class_id,": sfq perturb 10";

}

split($2,ip,".");

if (ht_1[ip[1]]!=1)

{

printf "%s%x%s\n",tc_filter" "$4" parent 1:0 protocol ip u32 ht 10:",ip[1],": match ip dst "ip[1]".0.0.0/8 hashkey mask 0xff0000 at 16 link 11:";

printf "%s%x%s\n",tc_filter" "$5" parent 1:0 protocol ip u32 ht 10:",ip[1],": match ip src "ip[1]".0.0.0/8 hashkey mask 0xff0000 at 12 link 11:";

ht_1[ip[1]]=1;

}

if (ht_2[ip[2]]!=1)

{

printf "%s%x%s\n",tc_filter" "$4" parent 1:0 protocol ip u32 ht 11:",ip[2],": match ip dst "ip[1]"."ip[2]".0.0/16 hashkey mask 0xff00 at 16 link 12:";

printf "%s%x%s\n",tc_filter" "$5" parent 1:0 protocol ip u32 ht 11:",ip[2],": match ip src "ip[1]"."ip[2]".0.0/16 hashkey mask 0xff00 at 12 link 12:";

ht_2[ip[2]]=1;

}

if (ht_3[ip[3]]!=1)

{

printf "%s%x%s\n",tc_filter" "$4" parent 1:0 protocol ip u32 ht 12:",ip[3],": match ip dst "ip[1]"."ip[2]"."ip[3]".0/24 hashkey mask 0xff at 16 link 13:";

printf "%s%x%s\n",tc_filter" "$5" parent 1:0 protocol ip u32 ht 12:",ip[3],": match ip src "ip[1]"."ip[2]"."ip[3]".0/24 hashkey mask 0xff at 12 link 13:";

ht_3[ip[3]]=1;

}

printf "%s%x%s%x\n",tc_filter" "$4" parent 1:0 protocol ip prio 1 u32 ht 13:",ip[4],": match ip dst "$2"/32 hashkey mask 0x0 at 16 match ip protocol 1 0xff flowid 1:",client_class

printf "%s%x%s%x\n",tc_filter" "$5" parent 1:0 protocol ip prio 1 u32 ht 13:",ip[4],": match ip src "$2"/32 hashkey mask 0x0 at 12 match ip protocol 1 0xff flowid 1:",client_class

printf "%s%x%s%x\n",tc_filter" "$4" parent 1:0 protocol ip prio 2 u32 ht 13:",ip[4],": match ip dst "$2"/32 hashkey mask 0x0 at 16 match ip protocol 17 0xff flowid 1:",++client_class

printf "%s%x%s%x\n",tc_filter" "$5" parent 1:0 protocol ip prio 2 u32 ht 13:",ip[4],": match ip src "$2"/32 hashkey mask 0x0 at 12 match ip protocol 17 0xff flowid 1:",client_class

printf "%s%x%s%x\n",tc_filter" "$4" parent 1:0 protocol ip prio 3 u32 ht 13:",ip[4],": match ip dst "$2"/32 hashkey mask 0x0 at 16 match ip protocol 6 0xff match ip sport 80 0xffff flowid 1:",++client_class

printf "%s%x%s%x\n",tc_filter" "$5" parent 1:0 protocol ip prio 3 u32 ht 13:",ip[4],": match ip src "$2"/32 hashkey mask 0x0 at 12 match ip protocol 6 0xff match ip dport 80 0xffff flowid 1:",client_class

printf "%s%x%s%x\n",tc_filter" "$4" parent 1:0 protocol ip prio 4 u32 ht 13:",ip[4],": match ip dst "$2"/32 hashkey mask 0x0 at 16 flowid 1:",++client_class

printf "%s%x%s%x\n",tc_filter" "$5" parent 1:0 protocol ip prio 4 u32 ht 13:",ip[4],": match ip src "$2"/32 hashkey mask 0x0 at 12 flowid 1:",client_class

buf=$1;

}'


* This source code was highlighted with Source Code Highlighter .






Linuxでのトラフィック管理の基本を理解するのにこの記事が役立つことを願っています。



All Articles