多数の接続と小さなパケットの高いトラフィックがあるギガビットネットワークでのTCPパフォーマンスの改善


37

「大量の接続と小さなパケットのトラフィックが多いギガビットネットワーク」でTCPスループットを改善しようとしています。私のサーバーOSはUbuntu 11.10サーバー64ビットです。

TCPソケット(すべて同じポート上)を介してサーバーに接続されているクライアントは約50.000(および成長中)です。

パケットの95%のサイズは1〜150バイト(TCPヘッダーとペイロード)です。残りの5%は、150バイトから4096+バイトまで異なります。

以下の設定で、サーバーは最大30 Mbps(全二重)のトラフィックを処理できます。

私のニーズに合わせてOSを調整するためのベストプラクティスをアドバイスしてください。

/etc/sysctl.congはこのように見えます:

kernel.pid_max = 1000000
net.ipv4.ip_local_port_range = 2500 65000
fs.file-max = 1000000
#
net.core.netdev_max_backlog=3000
net.ipv4.tcp_sack=0
#
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.core.somaxconn = 2048
#
net.ipv4.tcp_rmem = 4096 87380 16777216 
net.ipv4.tcp_wmem = 4096 65536 16777216
#
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_mem = 50576   64768   98152
#
net.core.wmem_default = 65536
net.core.rmem_default = 65536
net.ipv4.tcp_window_scaling=1
#
net.ipv4.tcp_mem= 98304 131072 196608
#
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_rfc1337 = 1
net.ipv4.ip_forward = 0
net.ipv4.tcp_congestion_control=cubic
net.ipv4.tcp_tw_recycle = 0
net.ipv4.tcp_tw_reuse = 0
#
net.ipv4.tcp_orphan_retries = 1
net.ipv4.tcp_fin_timeout = 25
net.ipv4.tcp_max_orphans = 8192

私の制限は次のとおりです。

$ ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 193045
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1000000
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 1000000

[追加]

私のNICは次のとおりです。

$ dmesg | grep Broad
[    2.473081] Broadcom NetXtreme II 5771x 10Gigabit Ethernet Driver bnx2x 1.62.12-0 (2011/03/20)
[    2.477808] bnx2x 0000:02:00.0: eth0: Broadcom NetXtreme II BCM57711E XGb (A0) PCI-E x4 5GHz (Gen2) found at mem fb000000, IRQ 28, node addr d8:d3:85:bd:23:08
[    2.482556] bnx2x 0000:02:00.1: eth1: Broadcom NetXtreme II BCM57711E XGb (A0) PCI-E x4 5GHz (Gen2) found at mem fa000000, IRQ 40, node addr d8:d3:85:bd:23:0c

[追加2]

ethtool -k eth0
Offload parameters for eth0:
rx-checksumming: on
tx-checksumming: on
scatter-gather: on
tcp-segmentation-offload: on
udp-fragmentation-offload: off
generic-segmentation-offload: on
generic-receive-offload: on
large-receive-offload: on
rx-vlan-offload: on
tx-vlan-offload: on
ntuple-filters: off
receive-hashing: off

[追加3]

 sudo ethtool -S eth0|grep -vw 0
 NIC statistics:
      [1]: rx_bytes: 17521104292
      [1]: rx_ucast_packets: 118326392
      [1]: tx_bytes: 35351475694
      [1]: tx_ucast_packets: 191723897
      [2]: rx_bytes: 16569945203
      [2]: rx_ucast_packets: 114055437
      [2]: tx_bytes: 36748975961
      [2]: tx_ucast_packets: 194800859
      [3]: rx_bytes: 16222309010
      [3]: rx_ucast_packets: 109397802
      [3]: tx_bytes: 36034786682
      [3]: tx_ucast_packets: 198238209
      [4]: rx_bytes: 14884911384
      [4]: rx_ucast_packets: 104081414
      [4]: rx_discards: 5828
      [4]: rx_csum_offload_errors: 1
      [4]: tx_bytes: 35663361789
      [4]: tx_ucast_packets: 194024824
      [5]: rx_bytes: 16465075461
      [5]: rx_ucast_packets: 110637200
      [5]: tx_bytes: 43720432434
      [5]: tx_ucast_packets: 202041894
      [6]: rx_bytes: 16788706505
      [6]: rx_ucast_packets: 113123182
      [6]: tx_bytes: 38443961940
      [6]: tx_ucast_packets: 202415075
      [7]: rx_bytes: 16287423304
      [7]: rx_ucast_packets: 110369475
      [7]: rx_csum_offload_errors: 1
      [7]: tx_bytes: 35104168638
      [7]: tx_ucast_packets: 184905201
      [8]: rx_bytes: 12689721791
      [8]: rx_ucast_packets: 87616037
      [8]: rx_discards: 2638
      [8]: tx_bytes: 36133395431
      [8]: tx_ucast_packets: 196547264
      [9]: rx_bytes: 15007548011
      [9]: rx_ucast_packets: 98183525
      [9]: rx_csum_offload_errors: 1
      [9]: tx_bytes: 34871314517
      [9]: tx_ucast_packets: 188532637
      [9]: tx_mcast_packets: 12
      [10]: rx_bytes: 12112044826
      [10]: rx_ucast_packets: 84335465
      [10]: rx_discards: 2494
      [10]: tx_bytes: 36562151913
      [10]: tx_ucast_packets: 195658548
      [11]: rx_bytes: 12873153712
      [11]: rx_ucast_packets: 89305791
      [11]: rx_discards: 2990
      [11]: tx_bytes: 36348541675
      [11]: tx_ucast_packets: 194155226
      [12]: rx_bytes: 12768100958
      [12]: rx_ucast_packets: 89350917
      [12]: rx_discards: 2667
      [12]: tx_bytes: 35730240389
      [12]: tx_ucast_packets: 192254480
      [13]: rx_bytes: 14533227468
      [13]: rx_ucast_packets: 98139795
      [13]: tx_bytes: 35954232494
      [13]: tx_ucast_packets: 194573612
      [13]: tx_bcast_packets: 2
      [14]: rx_bytes: 13258647069
      [14]: rx_ucast_packets: 92856762
      [14]: rx_discards: 3509
      [14]: rx_csum_offload_errors: 1
      [14]: tx_bytes: 35663586641
      [14]: tx_ucast_packets: 189661305
      rx_bytes: 226125043936
      rx_ucast_packets: 1536428109
      rx_bcast_packets: 351
      rx_discards: 20126
      rx_filtered_packets: 8694
      rx_csum_offload_errors: 11
      tx_bytes: 548442367057
      tx_ucast_packets: 2915571846
      tx_mcast_packets: 12
      tx_bcast_packets: 2
      tx_64_byte_packets: 35417154
      tx_65_to_127_byte_packets: 2006984660
      tx_128_to_255_byte_packets: 373733514
      tx_256_to_511_byte_packets: 378121090
      tx_512_to_1023_byte_packets: 77643490
      tx_1024_to_1522_byte_packets: 43669214
      tx_pause_frames: 228

SACKに関する情報:TCP SACKをオフにするタイミング


1
これが役立つ場合があります:datatag.web.cern.ch/datatag/howto/tcp.html
yrk

制限要因は何ですか?CPUは最大になっていますか?もしそうなら、あなたは間違った木をbarえています。CPUの実行内容を確認する必要があります。
デビッドシュワルツ

どのNICがありますか?
SaveTheRbtz

1
ところで:なぜSACKをオフにするのですか?
ニルス

1
あなたは、BroadcomのNIC ...使用して再考すべきである
ヒューバートKario

回答:


21

問題は、ネットワークカードの割り込みが多すぎることです。帯域幅が問題でない場合、周波数が問題です。

  • ネットワークカードの送信/受信バッファを有効にする

    ethtool -g eth0
    

現在の設定(256または512エントリ)が表示されます。おそらくこれらを1024、2048、または3172に上げることができます。それ以上はおそらく意味がありません。これは、サーバーが着信パケットを十分に速く処理できない場合にのみ満杯になるリングバッファーです。

バッファーがいっぱいになり始めた場合、フロー制御は、ルーターまたはスイッチに減速を指示する追加の手段です。

  • サーバーおよびサーバーが接続されているスイッチ/ルーターポートのイン/アウトフロー制御をオンにします。

    ethtool -a eth0
    

おそらく表示されます:

Pause parameters for eth0:
Autonegotiate:  on
RX:             on
TX:             on

eth0の現在の設定については、/ var / log / messagesを確認してください。次のようなものを確認します。

eth0:リンクは1000 Mbps、全二重、フロー制御txおよびrxで起動しています

txとrxが表示されない場合、ネットワーク管理者はスイッチ/ルーターの値を調整する必要があります。Ciscoでは、受信/送信フロー制御がオンになっています。

注意:これらの値を変更すると、ごく短時間(1秒未満)リンクがダウンまたはアップします。

  • これがすべて役に立たない場合は、ネットワークカードの速度を100 MBitに下げることもできます(スイッチ/ルーターポートで同じことを行います)

    ethtool -s eth0 autoneg off && ethtool -s eth0 speed 100
    

しかし、あなたの場合、私は言うでしょう-NICリングバッファの受信バッファを上げます。


ethtool私が言うからあなたの番号を見て-RXの廃棄を避けるために、ネットワークカードの受信バッファを最大に設定します。Broadcomがこれらを十分に備えていることを願っています。
Nils

1
TCPでバッファリングを増やすことは、ほとんどお勧めできません。バッファリングが多すぎます:bufferbloat.net/projects/bloat/wiki/Introduction
rmalayter

3
このバッファは、NIC上のハードウェアバッファです。回答をより詳細に更新します。着信パケットを失うので、そのバッファが必要です。これらのバッファを増やすことができるように、別のNIC(オンボードBroadcomからPCIe Intel)に切り替える必要がある同様のサーバーがあります。その後、失われたRXパケットに遭遇することはありません。
ニルス

@malayter:これはレイヤー2のリングバッファです。更新された回答を参照してください。
ニルス

1
最後に1GBがあります。さまざまな場所で多くのチューニングが行われたため、実際には単一の問題があったとは言えません。
労働者

5

以下は決定的な答えではないかもしれませんが、それは間違いなくいくつかのアイデアを出します

これらをsysctl.confに追加してみてください

##  tcp selective acknowledgements. 
net.ipv4.tcp_sack = 1
##enable window scaling
net.ipv4.tcp_window_scaling = 1
##
net.ipv4.tcp_no_metrics_save = 1

一方、高帯域幅ネットワークの場合、選択的tcp ackは最適なパフォーマンスに適しています。ただし、他の欠点にも注意してください。ここでは、ウィンドウスケーリングの利点について説明します。3番目のsysctlオプションに関して:デフォルトでは、TCPは、接続が閉じたときにさまざまな接続メトリックをルートキャッシュに保存し、近い将来に確立された接続がこれらを使用して初期条件を設定できるようにします。通常、これにより全体的なパフォーマンスが向上しますが、パフォーマンスが低下する場合があります。設定すると、TCPは接続を閉じるときにメトリックをキャッシュしません。

確認する

ethtool -k ethX

オフロードが有効かどうかを確認します。TCPチェックサムオフロードとラージセグメントオフロードは、今日のイーサネットNICの大半でサポートされており、明らかにBroadcomもサポートしています。

ツールを使用してみてください

powertop

ネットワークがアイドル状態で、ネットワークが飽和状態に達したとき。これは、NIC割り込みが原因かどうかを明確に示します。デバイスポーリングは、このような状況に対する答えです。FreeBsdはifconfig内でポーリングスイッチをサポートしていますが、Linuxにはそのようなオプションはありません。相談し、これをポーリングを有効にします。BroadComはポーリングもサポートしていると言っています。これはあなたにとって朗報です。

ジャンボパケットの微調整では、トラフィックの構成要素のほとんどが小さなパケットであるため、それを削減できない場合があります。しかし、とにかく試してみてください!


2kaji、明日提案をお試しします。PowerTopについて-目標がパフォーマンスである場合、省電力を調整する必要がありますか?
労働者

はい、もちろんそれも役立ちます。割り込みが悪であるかどうかを確認するためだけにpowertopに言及しました。割り込み頻度は、他のツールから収穫することができ

高い「再スケジュール割り込み」が表示されます-それが理由でしょうか?「割り込みの再スケジュール」とは何ですか?
労働者

この--->に従うようにしてくださいhelp.ubuntu.com/community/ReschedulingInterrupts

ええ。私はそのチュートリアルを見ましたが、それはラップトップ用であり、サーバーで高い割り込みが発生しています。サーバーに適用しようとします。
労働者

2

すべてのCPUコアに負荷を分散する必要があります。「irqbalance」を開始します。


1
1つのIRQの周波数が非常に高い場合、これは役に立ちません。IRQBalanceは、単一のIRQを適切な論理プロセッサに配布しようとしますが、単一のIRQを処理するプロセッサが複数存在することはありません。
ニルス

2

微調整のリストで、タイムスタンプがオフになっていることに気付きました。それはしないでください。それは、帯域幅が本当に高価で、人々が数バイト/パケットを節約したかった昔の時代への古い先祖返りです。たとえば、最近のTCPスタックは、「CLOSE_WAIT」のソケットに到着したパケットが接続の古いパケットであるか、新しい接続の新しいパケットであり、RTT計算に役立つかどうかを判断するために使用されます。また、タイムスタンプ用に数バイトを保存することは、IPv6アドレスが追加するものと比較して何もありません。タイムスタンプをオフにすると、害がもたらされます。

タイムスタンプをオフにするためのこの推奨事項は、ある世代のシステム管理者から次の世代に渡され続ける単なるスローバックです。「都市伝説」のようなもの。


2

私はこれを提案します:

kernel.sem = 350 358400 64 1024
net.core.rmem_default = 262144
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 4194304
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_adv_win_scale = 2
net.ipv4.tcp_moderate_rcvbuf = 1
net.ipv4.tcp_rmem = 4096 262144 4194304
net.ipv4.tcp_wmem = 4096 262144 4194304
net.ipv4.tcp_keepalive_time = 900
net.ipv4.tcp_keepalive_intvl = 900
net.ipv4.tcp_keepalive_probes = 9

RHEL上のOracle DBサーバーおよびバックアップソフトウェアでテスト済み。


5
これらの数値は、万能型ではないため設定可能です。つまり、数値自体は重要ではありません。価値があるのは、使用する番号を決定するために使用した方法です。
カスペルド

2

私の場合、単一のチューニングのみ:

net.ipv4.tcp_timestamps = 0

サイトの読み込み時間が50%短縮され、非常に大きな便利な変更が行われました。


そのためには、セットアップで何かがひどく壊れている必要があります。タイムスタンプは、通常の状況下で帯域幅の1%未満を使用し、TCPが他の場合よりもはるかに厳密に時間を指定して再送信できるようにします。
カスペルド
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.