Pourquoi les serveurs ne fonctionnent-ils pas toujours au maximum?

12

C'est une question qui me dérange depuis un moment, et je n'arrive pas à trouver quoi que ce soit en ligne qui en parle. J'ai un serveur exécutant VMware Hypervisor ESXi. Lorsque je démarre des machines virtuelles dessus, leur démarrage prend généralement 2-3 minutes; pas un temps terriblement long, mais pas instantané. Cependant, lorsque je regarde les journaux de performances sur le serveur, ni l'utilisation du processeur, de la RAM ou du disque n'est d'environ 100%; généralement, ils se situent en moyenne entre 60% et 80%. Donc, si le serveur a du travail à faire, pourquoi ne le fait-il pas à 100%?

Il me semble qu'à tout moment, le composant qui limite les performances devrait fonctionner à 100%. Par exemple, si j'ai un disque dur très lent, il devrait presque toujours fonctionner à 100%. Par conséquent, au moins une des zones (processeur, RAM, disque et réseau) doit toujours être à 100%, sauf si le serveur est complètement inactif.

Pourquoi est-ce pas le cas?

Stearns du noyau
la source
Les anciennes distributions Linux, non basées sur systemd, ne pouvaient pas paralléliser efficacement le démarrage. Les * BSD en souffrent toujours. Démarrez une distribution Linux moderne et voyez comment elle diffère.
Michael Hampton

Réponses:

18

La latence sera une des raisons. Le décalage entre «le disque me donne ces données dont j'ai besoin avant de pouvoir faire quoi que ce soit d'autre» et le temps que les données soient récupérées laissera le CPU inactif pendant ce temps.

Les ressources fonctionnent probablement à 100%, mais pour de très courtes périodes. Un démarrage du système d'exploitation suivra le schéma général de «traiter ou décider quelque chose, aller chercher quelque chose sur le disque, faire quelque chose en mémoire, faire quelque chose avec un périphérique», en répétant plusieurs fois par seconde. Ainsi, lorsque vous voyez un disque à 25% en 2 secondes, cela signifie probablement qu'il fonctionnait à 100% pendant 0,5 seconde, puis inactif le reste du temps.

Comme l'a souligné l'EEAA, les systèmes multicœurs rendent cela un peu plus complexe. Un logiciel à thread unique sur un processeur qui peut exécuter quatre threads ne peut atteindre que 25% à pleine vitesse. Même un logiciel multithread peut rarement atteindre 100%, car les données doivent circuler (généralement) depuis le disque dur, vers la RAM, vers le cache, vers le CPU. Garder ce pipeline plein est difficile, et a tendance à se produire principalement avec des charges de travail prévisibles comme l'encodage vidéo. Dans ce cas, le système d'exploitation peut observer les modèles de lecture et récupérer les données avant qu'elles ne soient nécessaires, en les plaçant dans des caches appropriés, tels que le cache disque dans la RAM.

Tim
la source
16

Vous pensez à cela d'une manière très simpliste, ce qui vous amène à faire des hypothèses incorrectes, que j'essaierai de clarifier.

Tout d'abord, et potentiellement le plus simplement, sur un système multicœur, pour comprendre l'utilisation du processeur, vous devez tenir compte du fait que la charge du processus est multithread ou non et conçue pour tirer parti de plusieurs cœurs. Si ce n'est pas le cas, selon la combinaison de processus en cours d'exécution, vous ne verrez peut-être jamais 100% d'utilisation. Déjà.

Deuxièmement, vous devez tenir compte des performances des périphériques IO. Comment votre système sait-il, par exemple, combien d'IOps vos appareils sont capables? Ce n'est pas le cas. Une mesure plus significative à surveiller est votre iowaitvaleur au démarrage (qui peut être difficile à obtenir pendant le processus de démarrage) ou les files d'attente / latence du disque pendant le démarrage (qui devraient être plus faciles à obtenir auprès de votre hyperviseur). Si vous voyez des files d'attente ou un pic de latence, il est probable que vos périphériques d'E / S contribuent à vos problèmes de performances.

EEAA
la source
11

Je travaille avec le serveur depuis environ 20 ans maintenant, ce n'est généralement pas une bonne chose lorsqu'un composant fonctionne à 100% tout le temps.

Par exemple, supposons que vous ayez une base de données SQL que vous ne souhaitez pas échanger sur le disque, mais que vous souhaitez à la place s'exécuter entièrement à partir de la mémoire.

Si votre base de données fait 24 Go et que le système d'exploitation a besoin de 8 Go, vous ne voudriez pas allouer uniquement 32 Go de RAM à la machine, il y a beaucoup de «choses» qui peuvent mal tourner, mauvais code, DDOS, utilisation intensive des applications, qui sait, n'ayant pas d'espace pour la tête, comment sauriez-vous que le serveur est en difficulté?

Nous avons environ 2000 serveurs dans notre centre de données, nous aimons les voir tous fonctionner à environ 75% de CPU et de RAM, l'espace disque dur est sur notre SAN, c'est donc une boule de cire complètement différente. Nous avons également des alertes pour nous dire quand ils atteignent 85% de CPU ou de RAM, et des alarmes pour nous dire quand ils atteignent 90%.

Anthony Fornito
la source
Je pense que vous vous êtes un peu éloigné ici. J'ai dit que j'exécutais des machines virtuelles, il y a donc une charge cohérente très différente d'un serveur de base de données, qui s'exécute lorsqu'il reçoit des demandes et alloue des ressources. J'étais plus préoccupé par le facteur de performance limitant, et non par la façon dont ces ressources sont allouées. Mais merci pour la réponse!
Kernel Stearns