2 votes

10GbE be2net faible performance pktgen

Je teste les performances réseau de deux postes de travail, chacun ayant des processeurs Xeon quadricœurs 2,4 GHz et des adaptateurs serveur PCIe NC550SFP Dual Port 10GbE, connectés en direct.

J'ai vérifié la bande passante de la RAM, qui est d'environ 12 Gbps, donc pas de goulot d'étranglement ici. La vitesse du bus PCIe est également correcte.

Je teste le nombre maximum de paquets par seconde en utilisant la taille minimale de paquet pour l'UDP et les résultats sont misérables comparés à ceux-ci : 2012-lpc-networking-qdisc-fastabend.pdf (désolé, je ne peux poster qu'un seul lien). Si j'augmente la taille du paquet et la MTU, je peux atteindre presque la vitesse de la ligne (~9,9 Gbps).

J'utilise pktgen avec les scripts NST, des interfaces macvlan pour plusieurs threads, et je n'obtiens que ~1 Mpps, tous les quatre cœurs à 100%.

Pour améliorer les performances TX de pktgen, je suis tombé sur ce document : Mise à l'échelle dans la pile de réseau Linux

J'ai vérifié et oui, j'ai des qdiscs mq, ce qui devrait offrir les meilleures performances :

# ip link list | grep eth3
5: eth3:  mtu 1500 qdisc mq state UP qlen 1000

Je pense que le problème vient du fait qu'une seule file TX est utilisée :

# dmesg | grep be2net
[ 4.528058] be2net 0000:01:00.1: irq 47 pour MSI/MSI-X
[ 4.528066] be2net 0000:01:00.1: irq 48 pour MSI/MSI-X
[ 4.528073] be2net 0000:01:00.1: irq 49 pour MSI/MSI-X
[ 4.528079] be2net 0000:01:00.1: irq 50 pour MSI/MSI-X
[ 4.528104] be2net 0000:01:00.1: 4 vecteurs MSI-x activés
[ 4.696026] be2net 0000:01:00.1: 4 files RSS créées et 1 file RX par défaut
[ 4.761108] be2net 0000:01:00.1: 1 file TX créée

J'ai eu un indice sur la manière d'activer plusieurs files TX à partir de Mise à l'échelle dans la pile de réseau Linux:

Le pilote pour une carte réseau capable de plusieurs files typiquement fournit un paramètre de module noyau ou spécifie le nombre de files matérielles à configurer. Dans le pilote bnx2x, par exemple, ce paramètre s'appelle num_queues. Une configuration RSS typique serait d'avoir une file de réception pour chaque CPU si le périphérique prend en charge suffisamment de files, sinon au moins une pour chaque domaine de mémoire, où un domaine de mémoire est un ensemble de CPUs qui partagent un niveau de mémoire particulier (L1, L2, nœud NUMA, etc.).

J'ai parcouru toute la documentation du pilote be2net d'Emulex, j'ai même envoyé un e-mail, sans succès. J'ai également survolé le code source du noyau.

J'ai la dernière version du noyau (3.10) sur Ubuntu 12.04 avec le dernier firmware sur les cartes réseau.

Des idées quelqu'un?

Merci!

1voto

Michael Tiemann Points 111

J'ai eu un défi similaire sur une boîte Red Hat Enterprise Linux. J'ai lu le même document et j'ai conclu que mon vrai problème était l'utilisation par défaut de chaque IRQ possible pour impliquer chaque CPU dans le traitement des paquets réseau. J'ai concentré l'activité IRQ sur un sous-ensemble de cœurs disponibles, puis j'ai dirigé le travail en conséquence. Voici le fichier rc.local :

# Réservez CPU0 comme gestionnaire d'IRQ par défaut
pour IRQ in `grep eth0 /proc/interrupts | cut -d ':' -f 1`; do echo 2 > /proc/irq/$IRQ/smp_affinity; done
pour IRQ in `grep eth1 /proc/interrupts | cut -d ':' -f 1`; do echo 2 > /proc/irq/$IRQ/smp_affinity; done
pour IRQ in `grep eth2 /proc/interrupts | cut -d ':' -f 1`; do echo 2 > /proc/irq/$IRQ/smp_affinity; done
pour IRQ in `grep eth4 /proc/interrupts | cut -d ':' -f 1`; do echo $(( (($IRQ & 1) + 1) << 2 )) > /proc/irq/$IRQ/smp_affinity; done

Voici le fichier cgrules.conf qui définit / différencie mon serveur web apache de 10gbe pour que le débit réseau sérieux puisse se produire comme prévu :

apache      cpuset,cpu  apache/

Et voici le fichier cgconfig.conf qui sépare réellement le serveur du reste des activités du CPU :

mount {
    cpuset  = /cgroup/cpuset;
    cpu = /cgroup/cpu;
    cpuacct = /cgroup/cpuacct;
    memory  = /cgroup/memory;
    devices = /cgroup/devices;
    freezer = /cgroup/freezer;
    net_cls = /cgroup/net_cls;
    blkio   = /cgroup/blkio;
}

group apache {
    cpuset {
        cpuset.memory_spread_slab="0";
        cpuset.memory_spread_page="0";
        cpuset.memory_migrate="0";
        cpuset.sched_relax_domain_level="-1";
        cpuset.sched_load_balance="1";
        cpuset.mem_hardwall="0";
        cpuset.mem_exclusive="0";
        cpuset.cpu_exclusive="0";
        cpuset.mems="1";
        cpuset.cpus="4-7,12-15";
    }
}

group apache {
    cpu {
        cpu.rt_period_us="1000000";
        cpu.rt_runtime_us="0";
        cpu.cfs_period_us="100000";
        cpu.cfs_quota_us="-1";
        cpu.shares="1024";
    }
}

Une configuration par défaut (sans les piratages IRQ et cgroups) donnait un débit réseau d'environ 5 Gb/s. Avec les IRQ concentrés et les IO réseau aléatoires déplacées, j'ai mesuré des performances proches de la vitesse des fils (9,5 Gb/s) en utilisant netperf.

n.b. les paquets jumbo n'ont fait aucune différence, ni aux chiffres avant ni aux chiffres après.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X