Linuxネットワークスタックは、デフォルトではデスクトップでうまく機能します。 負荷が平均よりわずかに高いサーバーでは、すべてを正しく構成する方法をすでに把握する必要があります。 私の現在の仕事では、これをほぼ産業規模で処理する必要があるため、どこにも自動化せずに-同僚に長時間どのようにどのように機能するかを説明し、Cコードと混合した約300ページの英語テキストを人々に強制的に読ませる必要があります...結果は1時間でも1日でもありません。 したがって、ネットワークスタックをチューニングするためのユーティリティセットとその使用のためのガイドをスローしようとしましたが、特定のタスクの特定の詳細には入りませんが、同時に1時間未満で読むことができ、少なくとも一部は削除されます好意。
何を達成する必要がありますか?
ネットワークスタックを調整するときの主なタスク(サーバー、ルーター、トラフィックアナライザー、大量のトラフィックを受信するWebサーバーの役割は関係ありません)-プロセッサコア間のパケット処理の負荷を均等に分散します。 CPUとネットワークカードが同じNUMAノードに属していることを考慮し、コア間で不要なパケットドロップを作成しないことをお勧めします。
メインタスクの前に、プライマリタスクが実行されます-サーバー上にあるタスク、トラフィックの出入りの量などを考慮したハードウェアの選択。
鉄の選択に関する推奨事項
- デュアルプロセッササーバーは、トラフィックが1枚のネットワークインターフェイスカードにしか届かない場合には役立ちません。
- 1つのネットワークカードのポートにトラフィックが到着する場合、別々のNUMAノードは役に立ちません。
- ネットワークカードキューの総数よりも多くのコアを備えたサーバーを購入することは意味がありません。
- キューが1つのネットワークカードの場合、RPSを使用してコア間で負荷を分散できますが、これによりパケットをメモリにコピーする際の損失がなくなるわけではありません。
- ハイパースレッディングは有用ではなく、BIOSでオフになります(特にSkylakeとKaby Lakeでは問題があります)
- コア周波数が少なくとも2.5GHzで、大量のL3およびその他のキャッシュを備えたプロセッサを選択します。
- DDR4メモリを使用します。
- 最大2048以上のRXバッファをサポートするネットワークカードを選択します。
したがって、2 Gbit / sを超えるトラフィック量のソースが2つ以上与えられている場合、プロセッサとNUMAノードの数、およびこれらのソースの数に等しいネットワークカード(ポートではない)の数を備えたサーバーについて考える必要があります。
「主よ、私はこれを理解したくありません!」
必要ありません。 私はすでにそれを理解しており、これを同僚に説明しようとして時間を無駄にしないために、ユーティリティセットnetutils-linuxを作成しました 。 Pythonで作成され、バージョン2.6、2.7、3.4、3.6でテストされています。
ネットワークトップ
このユーティリティは、適用された設定を評価し、サーバーリソースの負荷分散(割り込み、softirqs、プロセッサコアごとの1秒あたりのパケット数)の均一性、あらゆる種類のパケット処理エラーを表示するために必要です。 しきい値を超える値は強調表示されます。
rss-ladder
# rss-ladder eth1 0
- distributing interrupts of eth1 (-TxRx) on socket 0:"
- eth1: irq 67 eth1-TxRx-0 -> 0
- eth1: irq 68 eth1-TxRx-1 -> 1
- eth1: irq 69 eth1-TxRx-2 -> 2
- eth1: irq 70 eth1-TxRx-3 -> 3
- eth1: irq 71 eth1-TxRx-4 -> 8
- eth1: irq 72 eth1-TxRx-5 -> 9
- eth1: irq 73 eth1-TxRx-6 -> 10
- eth1: irq 74 eth1-TxRx-7 -> 11
( ).
autorps
# autorps eth0
Using mask 'fc0' for eth0-rx-0.
( ). RSS, . — .
server-info
# server-info rate
cpu:
BogoMIPS: 7
CPU MHz: 7
CPU(s): 1
Core(s) per socket: 1
L3 cache: 1
Socket(s): 10
Thread(s) per core: 10
Vendor ID: 10
disk:
vda:
size: 1
type: 1
memory:
MemTotal: 1
SwapTotal: 10
net:
eth1:
buffers:
cur: 5
max: 10
driver: 1
queues: 1
system:
Hypervisor vendor: 1
Virtualization type: 1
:
server-info show
: , . ,lshw
, .server-info rate
: . Windows, . 1 10.
rx-buffers-increase
.maximize-cpu-freq
. , , , .
, !
:
.
, . .
1. .
:
- 4
- 1 / (eth0) 4 combined
- 600 /, .
- CPU0, ≈55000 350000 , 200 / . 3
:
-
rss-ladder eth0
-
rx-buffers-increase eth0
2. .
:
- 8
- NUMA-
- 10 / (eth0, eth1, eth2, eth3), 16 , node0, : 3 /
- 1 1 / , 4 , node0, : 100 /.
:
1 10 / PCI-, NUMA node1.
2 combined 10 :
for dev in eth0 eth1 eth2 eth3; do
ethtool -L $dev combined 8
done
3 eth0, eth1 , NUMA node0, eth2, eth3 , NUMA node1:
rss-ladder eth0 0 rss-ladder eth1 0 rss-ladder eth2 1 rss-ladder eth3 1
4 eth0, eth1, eth2, eth3 RX-:
for dev in eth0 eth1 eth2 eth3; do
rx-buffers-increase $dev
done
:
- , (missed) RSS NUMA-. , — 6 RX- CPU0, rps_cpus 111110, .
- mellanox intel (X710) . tcpdump , , CPU0. RPS. — .
- SFP- Intel 82599ES ( ixgbe sourceforge) "" . lspci , , dmesg warning'.
unsupported_sfp=1,1
ixgbe. , , supported sfp. - ( 6- ).
Update: , RHEL-based , debian , RHEL-based , . , - Ubuntu/Debian/Altlinux! 2.0.10
Update2. , RPS . , 2.2.0 autorps.
Update3: 2.5.0