web-dev-qa-db-fra.com

Amélioration des performances TCP sur un réseau gigabit avec de nombreuses connexions et un trafic élevé de petits paquets

J'essaie d'améliorer mon TCP débit sur un "réseau gigabit avec beaucoup de connexions et un trafic élevé de petits paquets". Mon OS de serveur est Ubuntu 11.10 Server 64bit.

Il y a environ 50 000 clients (et de plus en plus) connectés à mon serveur via des sockets TCP (tous sur le même port).

95% de mes paquets ont une taille de 1 à 150 octets (en-tête TCP et charge utile). Les 5% restants varient de 150 à 4096+ octets.

Avec la configuration ci-dessous, mon serveur peut gérer le trafic jusqu'à 30 Mbps (duplex intégral).

Pouvez-vous me conseiller les meilleures pratiques pour régler le système d'exploitation en fonction de mes besoins?

Ma /etc/sysctl.cong ressemble à ça:

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

Voici mes limites:

$ 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

[AJOUTÉE]

Mes cartes réseau sont les suivantes:

$ 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

[AJOUTÉ 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

[AJOUTÉ 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

Quelques informations sur SACK: Quand désactiver TCP SACK désactivé?

37
Worker

Le problème peut être que vous obtenez trop d'interruptions sur votre carte réseau. Si la bande passante n'est pas le problème, la fréquence est le problème:

  • Activer les tampons d'envoi/réception sur la carte réseau

    ethtool -g eth0
    

Vous montrera les paramètres actuels (256 ou 512 entrées). Vous pouvez probablement les augmenter à 1024, 2048 ou 3172. Plus n'a probablement aucun sens. Il s'agit simplement d'un tampon en anneau qui ne se remplit que si le serveur n'est pas en mesure de traiter les paquets entrants assez rapidement.

Si le tampon commence à se remplir, le contrôle de flux est un moyen supplémentaire de dire au routeur ou au commutateur de ralentir:

  • Activez le contrôle de flux entrant/sortant sur le serveur et les ports de commutateur/routeur auxquels il est connecté.

    ethtool -a eth0
    

Montrera probablement:

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

Vérifiez/var/log/messages pour le paramètre actuel de eth0. Vérifiez quelque chose comme:

eth0: la liaison est à 1000 Mbps, duplex intégral, contrôle de flux tx et rx

Si vous ne voyez pas tx et rx, vos administrateurs réseau doivent ajuster les valeurs sur le commutateur/routeur. Sur Cisco, le contrôle de flux de réception/transmission est activé.

Méfiez-vous: La modification de ces valeurs fera descendre et monter votre lien pendant très peu de temps (moins de 1 s).

  • Si tout cela ne vous aide pas - vous pouvez également réduire la vitesse de la carte réseau à 100 Mbits (faites de même sur les ports du commutateur/routeur)

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

Mais dans votre cas, je dirais - élevez les tampons de réception dans le tampon en anneau NIC.

21
Nils

La suite n'est peut-être pas la réponse définitive, mais elle proposera certainement quelques idées

Essayez de les ajouter à 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

Bien que le tcp ack sélectif soit bon pour des performances optimales dans le cas d'un réseau à large bande passante. Mais attention aux autres inconvénients cependant. Les avantages de la mise à l'échelle des fenêtres sont décrits ici . En ce qui concerne la troisième option sysctl: par défaut, TCP enregistre diverses métriques de connexion dans le cache de route lorsque la connexion se ferme, de sorte que les connexions établies dans un avenir proche puissent les utiliser pour définir les conditions initiales. Habituellement, cela augmente les performances globales, mais peut parfois entraîner une dégradation des performances. S'il est défini, TCP ne mettra pas en cache les mesures à la fermeture des connexions.

Vérifier avec

ethtool -k ethX

pour voir si le déchargement est activé ou non. déchargement de la somme de contrôle TCP et le déchargement de gros segments sont pris en charge par la majorité des cartes réseau Ethernet actuelles et apparemment Broadcom le prend également en charge.

Essayez d'utiliser l'outil

powertop

lorsque le réseau est inactif et lorsque la saturation du réseau est atteinte. Cela montrera certainement si NIC les interruptions sont le coupable. L'interrogation du périphérique est une réponse à une telle situation. FreeBsd prend en charge le commutateur d'interrogation directement dans ifconfig mais linux n'a pas une telle option. Consultez ceci pour activer l'interrogation. Cela signifie que BroadCom prend également en charge l'interrogation, ce qui est une bonne nouvelle pour vous.

Jumbo packet Tweak pourrait ne pas le couper pour vous puisque vous avez mentionné que votre trafic se compose principalement de petits paquets. Mais bon essayez quand même!

5
kaji

Dans mon cas, un seul tuninng:

net.ipv4.tcp_timestamps = 0

a fait un changement très important et utile, le temps de chargement du site a diminué de 50%.

2
avz2012

Je propose ceci:

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

Testé sur les serveurs Oracle DB sur RHEL et dans les logiciels de sauvegarde.

2
Konrad Puchała

J'ai remarqué dans la liste des réglages que les horodatages étaient désactivés, veuillez ne pas le faire. C'est un vieux retour aux jours d'autrefois où la bande passante était vraiment chère et les gens voulaient économiser quelques octets/paquet. Il est utilisé, par exemple, par la pile TCP ces jours-ci pour dire si un paquet arrivant pour un socket dans "CLOSE_WAIT" est un ancien paquet pour la connexion ou s'il s'agit d'un nouveau paquet pour une nouvelle connexion et aide dans les calculs RTT. Et économiser les quelques octets pour un horodatage n'est RIEN par rapport à ce que les adresses IPv6 vont ajouter. La désactivation des horodatages fait plus de mal que de bien.

Cette recommandation de désactivation des horodatages n'est qu'un retour en arrière qui continue de se transmettre d'une génération d'administrateur système à la suivante. Une sorte de "légende urbaine".

2
GeorgeB

vous devez répartir la charge sur tous les cœurs de processeur. Démarrez "irqbalance".

2
user175978