Pas surement, mais surtout 1.00*n_cpu
.
La charge signifie ce qui suit: s'il y a plusieurs processus sur un système à processeur unique, ils fonctionnent apparemment en parallèle. Mais ce n'est pas vrai. Ce qui se passe pratiquement: le noyau donne 1 / 100e de seconde à un processus, puis arrête son exécution avec une interruption. Et donne le 1 / 100e de seconde suivant à un autre processus.
Pratiquement la question, "quel processus devrait obtenir notre prochain intervalle de 1 / 100ème de seconde?", Sera décidée par une heuristique complexe. Il est nommé comme tâche la planification .
Bien entendu, les processus qui sont bloqués, par exemple ils attendent leurs données ce qu'ils lisent sur le disque, sont exemptés de cette planification des tâches.
Quelle charge indique: combien de processus attendent actuellement leur prochaine tranche de 1 / 100e de seconde. Bien sûr, c'est une valeur moyenne. En effet, vous pouvez voir plusieurs nombres dans un cat /proc/loadavg
.
La situation dans un système multi-CPU est un peu plus complexe. Il existe plusieurs processeurs, dont les délais peuvent être attribués à plusieurs processus. Cela rend la planification des tâches un peu - mais pas trop - plus complexe. Mais la situation est la même.
Le noyau est intelligent, il essaie de partager les ressources du système pour une efficacité optimale, et il est proche de cela (il y a des choses d'optimisation mineures, par exemple, il vaut mieux qu'un processus soit exécuté le plus longtemps possible sur le même cpu en raison de considérations de mise en cache, mais cela n'a pas d'importance ici). En effet, si nous avons la charge 8, cela signifie: il y a en fait 8 processus en attente de leur prochaine tranche de temps. Si nous avons 8 cpus, nous pouvons donner ces tranches de temps aux cpus un à un, et ainsi notre système sera utilisé de manière optimale.
Si vous voyez un top
, vous pouvez voir que le nombre de processus en cours d'exécution est étonnamment bas: ce sont les processus marqués par R
là. Même sur un système pas vraiment hardcore, il est souvent inférieur à 5. Cela est dû en partie au fait que les processus attendant leurs données des disques ou du réseau sont également suspendus (marqués d'un S
en haut). La charge affiche uniquement l'utilisation du processeur.
Il existe également des outils pour mesurer la charge du disque, à mon humble avis, ils devraient être au moins importants en tant que surveillance de l'utilisation du processeur, mais d'une certaine manière, ce n'est pas si bien connu ici dans notre monde sysadmin professionnel.
Les outils Windows divisent souvent la charge avec le nombre réel de processeurs. Cela amène certains administrateurs système Windows professionnels à utiliser la charge système dans ce sens divisé par processeur. Ils n'ont pas raison et seront probablement plus heureux après que vous leur ayez expliqué cela.
Les processeurs multicœurs sont pratiquement plusieurs processeurs sur la même puce de silicium. Il n'y a pas de différence.
Dans le cas de CPU hyperthreadés, il y a un effet secondaire intéressant: le chargement d'un processeur ralentit ses paires hyperthreadées. Mais cela se produit sur une couche plus profonde que gère la planification normale des tâches, bien qu'elle puisse (et devrait) influencer les décisions de déplacement du processus du planificateur.
Mais de notre point de vue actuel - ce qui détermine la charge du système - cela n'a pas autant d'importance.
J'ai fait quelques expériences sur notre système Xeon à 24 cœurs (2 sockets x 12 cœurs). La charge maximale est de 48,0 dans ce cas en raison de la façon dont Linux configure l'hyperthreading.
Cependant, vous n'obtenez pas l'équivalent de 48 cœurs de débit. Ce que j'ai observé, c'est que vous obtenez environ 90% du débit dans les 24 premiers processeurs logiques, c'est-à-dire si la charge fonctionne à 24,0. Ensuite, vous obtenez un débit supplémentaire d'environ 10% pour les 24 processeurs logiques restants (la charge s'exécute à 48,0). Une autre façon de penser est que si vous exécutez 48 threads sur les 24 cœurs, vous obtiendrez un boost d'environ 10-20% si vous activez l'hyperthreading par rapport à non. Ce n'est pas un coup de pouce à 100% comme le laisseraient entendre les gars du marketing.
Par exemple, une façon de tester cette observation est d'avoir un processus qui exécute 48 threads (par exemple en utilisant TBB ou un modèle de threading manuel), puis d'exécuter
puis exécutez
Ce dernier devrait fonctionner en 10 à 20% de temps en moins. Si votre processus est fortement bloqué d'E / S, le résultat peut être différent.
Le premier désactivera l'hyperthreading en autorisant uniquement les threads à s'exécuter sur un seul processeur logique (de chaque cœur), tandis que le second activera l'hyperthreading en permettant aux threads de s'exécuter sur 2 processeurs logiques (de chaque cœur).
La charge dans les deux cas doit être signalée comme 48.0 ... ce qui, comme vous pouvez le voir, est très trompeur.
la source