Goulot d'étranglement d'E / S Linux avec des dispositifs de transfert de données

8

J'ai une machine à 24 cœurs avec 94,6 Go de RAM exécutant le serveur Ubuntu 10.04. La box connaît un pourcentage élevé, contrairement à un autre serveur que nous avons (4 cœurs) exécutant les mêmes types et quantités de processus. Les deux machines sont connectées à un serveur de fichiers VNX Raid, la machine à 24 cœurs via 4 cartes FC et l'autre via 2 cartes Ethernet gigabit. La machine à 4 cœurs surpasse actuellement la machine à 24 cœurs, a une utilisation du processeur plus élevée et un% iowait plus faible.

En 9 jours de disponibilité, le% iowait en moyenne à 16%, et est systématiquement supérieur à 30%. La plupart du temps, l'utilisation du processeur est très faible, environ 5% (en raison de la forte intensité). Il y a suffisamment de mémoire libre.

Une chose que je ne comprends pas, c'est pourquoi toutes les données semblent passer par le périphérique sdc plutôt que par les déménageurs de données directement:

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           6.11    0.39    0.75   16.01    0.00   76.74

Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
sda               0.00         0.00         0.00       1232          0
sdb               0.00         0.00         0.00       2960          0
sdc               1.53        43.71        44.54   36726612   37425026
dm-0              0.43        27.69         0.32   23269498     268696
dm-1              1.00         1.86         7.74    1566234    6500432
dm-2              0.96         1.72         5.97    1442482    5014376
dm-3              0.49         9.57         0.18    8040490     153272
dm-4              0.00         0.00         0.00       1794         24
dm-5              0.00         0.00         0.00        296          0

Une autre pièce du puzzle est que les tâches passent fréquemment en mode veille ininterrompu (en haut), probablement aussi en raison du blocage io.

Que puis-je regarder pour aider à diagnostiquer le problème? Pourquoi toutes les données transitent-elles par / dev / sdc? Est-ce normal?

MISE À JOUR:

La connexion réseau et la capacité de lecture / écriture VNX ont été exclues en tant que goulots d'étranglement. Nous pouvons atteindre des vitesses de 800 Mo / s avec les 4 cartes réseau liées (round-robin). Les cartes Fibre Channel ne sont pas encore utilisées. Le VNX est bien capable de gérer les E / S (RAID6, disques 30 x 2 To à 7,2 kRPM par pool dans deux pools (60 disques au total), environ 60% en lecture).

Ignorez ci-dessus à propos de dm et sdc, ce sont tous des disques internes et ne font pas partie du problème.

Nous pensons que le problème pourrait être avec les montages nfs ou TCP (nous avons 5 montages sur 5 partitions sur le VNX), mais je ne sais pas quoi exactement. Aucun conseil?

Benjamin
la source
Un petit point: dans ce contexte, dmsignifie mappeur de périphérique, pas de moteur de données. Cette question ferait probablement beaucoup mieux à Server Fault.
Michael Hampton
Utilisez-vous NFSv4 ou NFSv3? Votre iowait est-il uniquement sur les connexions NFS, ou l'obtenez-vous lorsque vous exécutez dd pour tester les vitesses de disque (en supposant que vous l'ayez fait)? Si votre attente est sur NFS et que vous utilisez V4, essayez V3. NFSv4 a un comportement assez aléatoire à des charges élevées, et nous avons récemment dû le désactiver sur notre réseau.
Erik Aronesty

Réponses:

6

Tout d'abord, si vos CPU (et putain! C'est beaucoup 24) mangent des données plus rapidement que ce qui peut fournir le stockage de données, alors vous obtenez iowait. C'est à ce moment que le noyau suspend un processus pendant un io de blocage (une lecture trop lente ou une écriture de synchronisation).
Vérifiez donc que le stockage peut fournir un débit suffisant pour 24 cœurs.

Par exemple, supposons que votre stockage puisse fournir un débit de 500 Mo / s, que vous êtes connecté via une ligne Ethernet 2 Gigabit (liaison), le réseau limitera déjà le débit maximal à environ 100-180 Mo / s. Si votre processus consomme des données à la vitesse de 50 Mo / s et que vous exécutez 4 threads sur votre machine à 4 cœurs: 4 x 50 Mo / s = 200 Mo / s consommés. Si le réseau peut supporter les 180 Mo / s, vous n'aurez pas beaucoup de latence et vos processeurs seront chargés. Le réseau ici est un petit goulot d'étranglement.
Maintenant, si vous faites évoluer cela jusqu'à 24 cœurs et 24 threads, vous aurez besoin de 1200 Mo / s, même si vous modifiez le câblage pour permettre un tel débit, votre système de stockage ne fournit pas plus de 500 Mo / s, cela devient un goulot d'étranglement.

En ce qui concerne l'attente, les goulots d'étranglement peuvent être partout. Non seulement sur les couches physiques, mais aussi dans les tampons d'espace logiciel et noyau. Cela dépend vraiment des modèles d'utilisation. Mais comme les goulots d'étranglement logiciels sont beaucoup plus difficiles à identifier, il est généralement préférable de vérifier le débit théorique du matériel avant d'étudier les piles de logiciels.

Comme dit, un iowait se produit lorsqu'un processus effectue une lecture et que les données mettent du temps à arriver, ou lorsqu'il effectue une écriture de synchronisation et que l'accusé de réception de modification de données prend son temps. Pendant une écriture de synchronisation, le processus entre en veille sans interruption afin que les données ne soient pas corrompues. Il y a un outil pratique pour voir quel appel fait un processus Pendre: latencytop. Ce n'est pas le seul du genre, mais vous pouvez l'essayer.

Remarque: pour votre information, dm signifie mappeur d'appareil et non pas de moteur de transfert de données.

Huygens
la source
1
Je suis entièrement d'accord (et je pense que c'est moins bien compris) qu'il est important de maintenir une ressource système / solution équilibrée. Mais je tiens également à souligner que IOWait peut également être causé par un taux élevé d'E / S randomisées (que ce soit un processus effectuant de nombreuses recherches ou de nombreux processus exigeant que leurs données soient recherchées). Dans ce cas, IOWait peut être élevé sans que la bande passante d'E / S soit le facteur de problème.
Matthew Ife
@MIfe Vous avez parfaitement raison à ce sujet. J'ai également commencé à mentionner cet aspect lorsque j'ai indiqué d'inspecter la couche logicielle. Si le canal est suffisamment grand entre le stockage matériel et les processus matériels, le problème réside dans les piles de logiciels, allant des tampons TCP (par exemple dans l'espace noyau) à l'accès aléatoire aux données simultanément (exemple dans l'espace utilisateur). Et c'est beaucoup plus difficile à identifier.
Huygens
5

Tout d'abord, saint enfer c'est beaucoup de fer! :)

Malheureusement, étant donné que votre configuration semble très complexe, je ne pense pas que quiconque puisse fournir immédiatement un "Voilà votre problème!" répondre, sauf s'ils ont fait quelque chose avec une configuration extrêmement similaire ou identique et ont rencontré le même problème. Ainsi, alors que ce texte est étiqueté par SU comme une «réponse», vous devriez probablement le considérer plutôt comme une «suggestion». Et je ne peux pas le mettre dans les commentaires parce que c'est trop de mots. : S

Sans savoir comment votre matériel est mappé aux périphériques, il est difficile de dire pourquoi les E / S vont à un endroit et non à un autre. Comment montez-vous les appareils? Vos programmes accèdent-ils sd*directement aux périphériques, ou tous vos systèmes de fichiers sont-ils montés sur les dmpériphériques et tous les accès aux fichiers se font par là?

D'autres choses que je dois poser sur:

  • De quel type de RAID s'agit-il? Si vous calculez des bits de parité avec RAID5 ou RAID6, cela est, espérons-le, pris en charge par le matériel du serveur de raid ... sinon, les serveurs de traitement le font .... ce qui n'est pas optimal et peut provoquer une latence d'E / S si fait dans le logiciel.

  • Vous avez isolé l'une des principales différences entre les deux serveurs dans votre message. L'un utilise Fibre Channel et l'autre utilise Ethernet. Le Fibre Channel devrait fournir une meilleure latence et une meilleure bande passante, mais c'est peut-être aussi un problème: s'il fournit beaucoup de débit, cela pourrait rendre le serveur RAID très occupé lui-même ... et la congestion conduit au remplissage des tampons / caches, ce qui augmente la latence, ce qui entraîne des attentes d'E / S plus élevées.

Il est presque comme si vous pouvez avoir un problème de ballonnement tampon avec vos matrices de disques - vous savez? Les contrôleurs RAID matériels ont normalement beaucoup de cache intégré, n'est-ce pas? Alors que les E / S vers les médias sont mises en file d'attente et que les caches sont pleines de pages sales, le tout est finalement saturé (si le stockage mécanique ne peut pas suivre la charge) et la latence passe à travers le toit ... sûrement vous pouvez produire plus de charge avec 24 cœurs + FC qu'avec 4 cœurs + GbE :) Vérifiez le serveur RAID et voyez à quel point les disques sont occupés ... une grande partie des "E / S" peuvent simplement être des paquets de contrôle, etc. I Je ne sais pas comment FC fonctionne mais si c'est quelque chose comme TCP alors vous allez voir des retransmissions si les latences sont trop élevées.

Par exemple, si vous posez une question à quelqu'un par téléphone et qu'il ne répond pas pendant quelques secondes, vous dites "Bonjour?" - les protocoles de mise en réseau (et FC n'est qu'un protocole de mise en réseau) font la même chose, juste dans un délai plus court. Mais bien sûr cet extra "Bonjour?" est coûteux dans le contexte de la mise en réseau car il ajoute encore plus de données à un tuyau déjà encombré.

En terminant, un conseil général:

Lors du débogage des temps d'attente / d'E / S / problèmes de débit, mesurez toujours . Mesurez partout. Mesurez au fil, mesurez ce que font les programmes eux-mêmes, mesurez à la fin du traitement, mesurez sur le serveur RAID, etc. Ne vous contentez pas de regarder les choses d'un point de vue - essayez de considérer chaque composant individuel du système qui est responsable du traitement, de la lecture ou de l'écriture des données du pipeline. Démontez une transaction ou une unité de travail distincte et disséquez exactement le chemin parcouru à travers votre matériel, et mesurez à chaque composant distinct pour voir s'il y a des goulots d'étranglement ou des endroits où il y a une latence excessive, etc. Un de mes amis a appelé cela "peeling" back the oignon ", et j'ai utilisé cette expression depuis pour désigner la tâche de débogage d'un flux de données.

allquixotic
la source
2

Un petit ajout. Dans ce cas, vous souhaiterez peut-être examiner vos programmateurs de réglage et d'E / S au niveau du bloc. Je ne connais pas aussi bien Ubuntu, mais il y a une bonne quantité de boutons de performances de stockage à modifier. Cela s'applique certainement dans le cas du stockage SAN et des bases de données.

  • Jetez un œil au planificateur d'E / S système . CFQ est la valeur par défaut, mais noop et le délai sont des choix courants pour les charges de travail de base de données.
  • Voir ce lien pour d'autres paramètres de réglage qui peuvent vous aider.
  • Vous mentionnez NFS et le stockage en bloc. Si bloc, quel (s) système (s) de fichiers utilisez-vous? L'attente des E / S ressemble à une situation de blocage d'écriture à partir d'ici. Les barrières en écriture sont-elles activées? Remontez vos systèmes de fichiers avec nobarrier. ( Astuce pour Ubuntu )

Quelques liens de panne de serveur pertinents ...

Linux - Réglage du contrôleur RAID matériel réel (scsi et cciss)

ewwhite
la source
1

Merci à tous pour les idées et la contribution. Le problème était lié à une combinaison de configuration de liaison Ethernet non optimale, combinée à un module d'E / S défectueux sur le VNX lui-même. Le taux d'E / S est maintenant proche de l'endroit où nous l'attendons. Il est intéressant de noter que les tests d'écriture et de lecture de fichiers dd et les benchmarks iozone n'ont pas été en mesure de détecter cela, et pouvaient lire et écrire presque aussi rapidement que prévu.

Benjamin
la source
EMC a-t-il fourni un support / une analyse pour vous aider à arriver à cette conclusion?
ewwhite
Oui. (plus de personnages)
Benjamin
0

Je vais éditer avec plus d'informations assez tôt, mais je voudrais d'abord dire que vous ne devez pas laisser la sortie dm- * d'iostat vous confondre. Device-mapper est un périphérique relais dans le noyau, tout comme md * (md0, md1, etc.), vous ne vous souciez donc que de vos périphériques sous-jacents. Toutes les données transmises à vos disques transitent par dm / md en cours de route, et les totaux réels (octets, secondes, etc.) sont exacts, mais l'utilisation est trompeuse.

C'est aussi une très grande quantité de mémoire. Des choses amusantes commencent à se produire à un niveau aussi élevé (je lance moi-même des 2x64 et 2x96), surtout si vous avez un processus qui occupe plus de la moitié du RAM. Lisez cet article pour plus d'informations . L'article mentionne mysql mais veuillez noter qu'il n'est passpécifique à mysql. Chaque processus logiciel entraînera des pénalités pour l'accès à la mémoire d'un autre processeur physique - pensez que 48 Go appartiennent à un proc, 48 à un autre. Le processus ne peut appartenir qu'à un seul proc et afin d'atteindre la mémoire des autres procs (une fois que ses 48 Go sont épuisés), il doit décider de stocker une partie de ses 48 en swap ou payer un prix énorme pour se rendre au la mémoire d'un autre proc. L'article suggère d'exécuter une commande numactl pour forcer le logiciel à ne pas échanger et à payer à la place la pénalité. J'ai personnellement vu des améliorations massives de cela. En d'autres termes - vérifiez si certaines de vos E / S vont être échangées! Utilisez free -m (ou similaire) pour cela. Si vous avez beaucoup de mémoire libre, mais une quantité non négligeable de swappage (disons 10% plus), cela peut très bien être votre problème.

fimbulvetr
la source
0

En considérant cela du point de vue du stockage, avez-vous un moyen de mesurer la latence scsi? Le temps d'attente OS io comprend un tas de choses hors du contrôle du stockage, mais quand je vais dans ma boîte de stockage et que je vois la latence d'E / S à 2 ms, je sais que, indépendamment de ce que le serveur obtient en interne, les commandes scsi sont traitées rapidement, et je peux éliminer le stockage en tant que variable.

Basilic
la source