Linuxでの大量のトラフィックフローと割り込み制御

この記事では、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キャッシュのエントリ数をハード制限します。 レコード数がこの値に達すると、ガベージコレクターがすぐに起動します。



All Articles