この記事では、Linuxルーターのパフォーマンスを向上させる方法について説明します。 私にとって、このトピックは、1つのLinuxルーターを通過するネットワークトラフィックが非常に大きくなった(> 150 Mbit / s、> 50 Kpps)ときに関連するようになりました。 ルーティングに加えて、ルーターはシェーピングにも関与し、ファイアウォールとして機能します。
高負荷の場合、82575/82576(ギガビット)、82598/82599(10ギガビット)チップセットなどに基づくIntelネットワークカードを使用する価値があります。 その魅力は、1つのインターフェイスに8つの割り込み処理キューを作成することです。rxに4つ、txに4つです(2.6.35カーネルに登場した
RPS /
RFSテクノロジーは、通常のネットワークカードでも同じようになります)。 また、これらのチップは、ハードウェアレベルでのトラフィック処理を非常に高速化します。
始めるには、このファイルの
/proc/interrupts
内容を見て、割り込みの原因とそれらを処理するカーネルを確認できます。
#cat / proc / interrupts
CPU0 CPU1 CPU2 CPU3
0:53 1 9 336 IO-APICエッジタイマー
1:0 0 0 2 IO-APIC-edge i8042
7:1 0 0 0 IO-APIC-edge
8:0 0 0 75 IO-APIC-edge rtc0
9:0 0 0 0 IO-APIC-fasteoi acpi
12:0 0 0 4 IO-APIC-edge i8042
14:0 0 0 127 IO-APIC-edge pata_amd
15:0 0 0 0 IO-APIC-edge pata_amd
18:150 1497 12301 473020 IO-APIC-fasteoi ioc0
21:0 0 0 0 IO-APIC-fasteoi sata_nv
22:0 0 15 2613 IO-APIC-fasteoi sata_nv、ohci_hcd:usb2
23:0 0 0 2 IO-APIC-fasteoi sata_nv、ehci_hcd:usb1
45:0 0 0 1 PCI-MSI-edge eth0
46:138902469 21349 251748 4223124 PCI-MSI-edge eth0-rx-0
47:137306753 19896 260291 4741413 PCI-MSI-edge eth0-rx-1
48:2916 137767992 248035 4559088 PCI-MSI-edge eth0-rx-2
49:2860 138565213 244363 4627970 PCI-MSI-edge eth0-rx-3
50:2584 14822 118410604 3576451 PCI-MSI-edge eth0-tx-0
51:2175 15115 118588846 3440065 PCI-MSI-edge eth0-tx-1
52:2197 14343 166912 121908883 PCI-MSI-edge eth0-tx-2
53:1976 13245 157108 120248855 PCI-MSI-edge eth0-tx-3
54:0 0 0 1 PCI-MSI-edge eth1
55:3127 19377 122741196 3641483 PCI-MSI-edge eth1-rx-0
56:2581 18447 123601063 3865515 PCI-MSI-edge eth1-rx-1
57:2470 17277 183535 126715932 PCI-MSI-edge eth1-rx-2
58:2543 16913 173988 126962081 PCI-MSI-edge eth1-rx-3
59:128433517 11953 148762 4230122 PCI-MSI-edge eth1-tx-0
60:127590592 12028 142929 4160472 PCI-MSI-edge eth1-tx-1
61:1713 129757168 136431 4134936 PCI-MSI-edge eth1-tx-2
62:1854 126685399 122532 3785799 PCI-MSI-edge eth1-tx-3
NMI:0 0 0 0マスク不能割り込み
LOC:418232812 425024243 572346635 662126626ローカルタイマー割り込み
SPU:0 0 0 0スプリアス割り込み
PMI:0 0 0 0パフォーマンス監視割り込み
PND:0 0 0 0パフォーマンス保留中の作業
RES:94005109 96169918 19305366 4460077割り込みの再スケジュール
CAL:49 34 39 29関数呼び出し割り込み
TLB:66588 144427 131671 91212 TLBシュートダウン
TRM:0 0 0 0熱イベント割り込み
THR:0 0 0 0しきい値APIC割り込み
MCE:0 0 0 0マシンチェック例外
MCP:199 199 199 199マシンチェックポーリング
エラー:1
MIS:0
この例では、Intel 82576ネットワークカードが使用されており、ネットワーク割り込みがコア全体に均等に分散されていることがわかります。 ただし、これはデフォルトでは発生しません。 プロセッサで割り込みをスローする必要があります。 これを行うには、コマンド
echo N > /proc/irq/X/smp_affinity
を実行する必要があります。ここで、
Nはプロセッサマスク(割り込みを取得するプロセッサを決定)、
Xは最初の出力列
/ proc / interruptsに表示される割り込み番号です。 プロセッサマスクを決定するには、2の
cpu_N (プロセッサ番号)を
累乗し、16進数システムに変換する必要があります。
bc
を使用すると
bc
評価されます
echo "obase=16; $[2 ** $cpu_N]" | bc
echo "obase=16; $[2 ** $cpu_N]" | bc
。 この例では、割り込みの配布は次のように実行されました。
#CPU0
エコー1> / proc / irq / 45 / smp_affinity
エコー1> / proc / irq / 54 / smp_affinity
エコー1> / proc / irq / 46 / smp_affinity
エコー1> / proc / irq / 59 / smp_affinity
エコー1> / proc / irq / 47 / smp_affinity
エコー1> / proc / irq / 60 / smp_affinity
#CPU1
エコー2> / proc / irq / 48 / smp_affinity
エコー2> / proc / irq / 61 / smp_affinity
エコー2> / proc / irq / 49 / smp_affinity
エコー2> / proc / irq / 62 / smp_affinity
#CPU2
エコー4> / proc / irq / 50 / smp_affinity
エコー4> / proc / irq / 55 / smp_affinity
エコー4> / proc / irq / 51 / smp_affinity
エコー4> / proc / irq / 56 / smp_affinity
#CPU3
エコー8> / proc / irq / 52 / smp_affinity
エコー8> / proc / irq / 57 / smp_affinity
エコー8> / proc / irq / 53 / smp_affinity
エコー8> / proc / irq / 58 / smp_affinity
また、ルーターに入力用と出力用の2つのインターフェイス(クラシック回線)がある場合、1つのインターフェイスからのrxは、同じプロセッサコア上の別のインターフェイスのtxとグループ化する必要があります。 たとえば、この場合、割り込み
46(eth0-rx-0)と
59(eth1-tx-0)が1つのコアで定義されました。
もう1つの非常に重要なパラメーターは、割り込み間の遅延です。
ethtool -c ethN
、
rx-usecsおよび
tx-usecsオプションを使用して現在の値を表示でき
ます 。 値が大きいほど遅延は大きくなりますが、プロセッサの負荷は低くなります。 ピーク時にこの値をゼロに減らしてみてください。
Intel Xeon E5520(8コア、それぞれハイパースレッディング付き)を使用してサーバーを準備するとき、次の割り込み分散スキームを選択しました。
#CPU6
エコー40> / proc / irq / 71 / smp_affinity
エコー40> / proc / irq / 84 / smp_affinity
#CPU7
エコー80> / proc / irq / 72 / smp_affinity
エコー80> / proc / irq / 85 / smp_affinity
#CPU8
echo 100> / proc / irq / 73 / smp_affinity
echo 100> / proc / irq / 86 / smp_affinity
#CPU9
echo 200> / proc / irq / 74 / smp_affinity
echo 200> / proc / irq / 87 / smp_affinity
#CPU10
echo 400> / proc / irq / 75 / smp_affinity
echo 400> / proc / irq / 80 / smp_affinity
#CPU11
echo 800> / proc / irq / 76 / smp_affinity
echo 800> / proc / irq / 81 / smp_affinity
#CPU12
echo 1000> / proc / irq / 77 / smp_affinity
echo 1000> / proc / irq / 82 / smp_affinity
#CPU13
echo 2000> / proc / irq / 78 / smp_affinity
echo 2000> / proc / irq / 83 / smp_affinity
#CPU14
echo 4000> / proc / irq / 70 / smp_affinity
#CPU15
echo 8000> / proc / irq / 79 / smp_affinity
このサーバー上の負荷のない
/ proc / interruptsは、
ここで表示でき
ます 。 かさばるのでこれをメモに引用しません
UPD:
サーバーがルーターでのみ動作する場合、TCPスタックの調整は実際には重要ではありません。 ただし、関連する可能性があるARPキャッシュのサイズを増やすことができるsysctlオプションがあります。 ARPキャッシュのサイズに問題がある場合、dmesgは「Neighbor table overflow」というメッセージを表示します。
例:
net.ipv4.neigh.default.gc_thresh1 = 1024
net.ipv4.neigh.default.gc_thresh2 = 2048
net.ipv4.neigh.default.gc_thresh3 = 4096
パラメーターの説明:
gc_thresh1 -ARPキャッシュに存在する必要があるエントリの最小数。 エントリの数がこの値より少ない場合、ガベージコレクタはARPキャッシュをクリアしません。
gc_thresh2 -ARPキャッシュのエントリ数をソフト制限します。 レコード数がこの値に達すると、5秒以内にガベージコレクターが起動します。
gc_thresh3 -ARPキャッシュのエントリ数をハード制限します。 レコード数がこの値に達すると、ガベージコレクターがすぐに起動します。