108 votes

Charge moyenne élevée, faible utilisation du CPU - pourquoi ?

Nous constatons d'énormes problèmes de performance sur une application web et nous essayons de trouver le goulot d'étranglement. Je ne suis pas un administrateur système, donc il y a des choses que je ne comprends pas bien. Une enquête de base montre que le CPU est inactif, que beaucoup de mémoire est disponible, qu'il n'y a pas de swapping, pas d'E/S, mais que la charge moyenne est élevée.

La pile de logiciels sur ce serveur ressemble à ceci :

  • Solaris 10
  • Java 1.6
  • WebLogic 10.3.5 (8 domaines)

Les applications exécutées sur ce serveur communiquent avec une base de données Oracle située sur un autre serveur.

Ce serveur dispose de 32 Go de RAM et de 10 processeurs (je crois).

Running prstat -Z donne quelque chose comme ça :

   PID USERNAME  SIZE   RSS STATE  PRI NICE      TIME  CPU PROCESS/NLWP
  3836 ducm0101 2119M 2074M cpu348  58    0   8:41:56 0.5% java/225
 24196 ducm0101 1974M 1910M sleep   59    0   4:04:33 0.4% java/209
  6765 ducm0102 1580M 1513M cpu330   1    0   1:21:48 0.1% java/291
 16922 ducm0102 2115M 1961M sleep   58    0   6:37:08 0.0% java/193
 18048 root     3048K 2440K sleep   59    0   0:06:02 0.0% sa_comm/4
 26619 ducm0101 2588M 2368M sleep   59    0   8:21:17 0.0% java/231
 19904 ducm0104 1713M 1390M sleep   59    0   1:15:29 0.0% java/151
 27809 ducm0102 1547M 1426M sleep   59    0   0:38:19 0.0% java/186
  2409 root       15M   11M sleep   59    0   0:00:00 0.0% pkgserv/3
 27204 root       58M   54M sleep   59    0   9:11:38 0.0% stat_daemon/1
 27256 root       12M 8312K sleep   59    0   7:16:40 0.0% kux_vmstat/1
 29367 root      297M  286M sleep   59    0  11:02:13 0.0% dsmc/2
 22128 root       13M 6768K sleep   59    0   0:10:51 0.0% sendmail/1
 22133 smmsp      13M 1144K sleep   59    0   0:01:22 0.0% sendmail/1
 22003 root     5896K  240K sleep   59    0   0:00:01 0.0% automountd/2
 22074 root     4776K 1992K sleep   59    0   0:00:19 0.0% sshd/1
 22005 root     6184K 2728K sleep   59    0   0:00:31 0.0% automountd/2
 27201 root     6248K  344K sleep   59    0   0:00:01 0.0% mount_stat/1
 20964 root     2912K  160K sleep   59    0   0:00:01 0.0% ttymon/1
 20947 root     1784K  864K sleep   59    0   0:02:22 0.0% utmpd/1
 20900 root     3048K  608K sleep   59    0   0:00:03 0.0% ttymon/1
 20979 root       77M   18M sleep   59    0   0:14:13 0.0% inetd/4
 20849 daemon   2856K  864K sleep   59    0   0:00:03 0.0% lockd/2
 17794 root       80M 1232K sleep   59    0   0:06:19 0.0% svc.startd/12
 17645 root     3080K  728K sleep   59    0   0:00:12 0.0% init/1
 17849 root       13M 6800K sleep   59    0   0:13:04 0.0% svc.configd/15
 20213 root       84M   81M sleep   59    0   0:47:17 0.0% nscd/46
 20871 root     2568K  600K sleep   59    0   0:00:04 0.0% sac/1
  3683 ducm0101 1904K 1640K sleep   56    0   0:00:00 0.0% startWebLogic.s/1
 23937 ducm0101 1904K 1640K sleep   59    0   0:00:00 0.0% startWebLogic.s/1
 20766 daemon   5328K 1536K sleep   59    0   0:00:36 0.0% nfsmapid/3
 20141 daemon   5968K 3520K sleep   59    0   0:01:14 0.0% kcfd/4
 20093 ducm0101 2000K  376K sleep   59    0   0:00:01 0.0% pfksh/1
 20797 daemon   3256K  240K sleep   59    0   0:00:01 0.0% statd/1
  6181 root     4864K 2872K sleep   59    0   0:01:34 0.0% syslogd/17
  7220 ducm0104 1268M 1101M sleep   59    0   0:36:35 0.0% java/138
 27597 ducm0102 1904K 1640K sleep   59    0   0:00:00 0.0% startWebLogic.s/1
 27867 root       37M 4568K sleep   59    0   0:13:56 0.0% kcawd/7
 12685 ducm0101 4080K  208K sleep   59    0   0:00:01 0.0% vncconfig/1
ZONEID    NPROC  SWAP   RSS MEMORY      TIME  CPU ZONE
    42      135   22G   19G    59%  87:27:59 1.2% dsuniucm01

Total: 135 processes, 3167 lwps, load averages: 54.48, 62.50, 63.11

Je comprends que le processeur est le plus souvent inactif, mais la moyenne de charge est élevée, ce qui est assez étrange pour moi. La mémoire ne semble pas être un problème.

Running vmstat 15 donne quelque chose comme ça :

 kthr      memory            page            disk          faults      cpu
 r b w   swap  free  re  mf pi po fr de sr s0 s1 s4 sd   in   sy   cs us sy id
 0 0 0 32531400 105702272 317 1052 126 0 0 0 0 13 13 -0 8 9602 107680 10964 1 1 98
 0 0 0 15053368 95930224 411 2323 0 0 0 0 0 0  0  0  0 23207 47679 29958 3 2 95
 0 0 0 14498568 95801960 3072 3583 0 2 2 0 0 3 3  0 21 22648 66367 28587 4 4 92
 0 0 0 14343008 95656752 3080 2857 0 0 0 0 0 3 3  0 18 22338 44374 29085 3 4 94
 0 0 0 14646016 95485472 1726 3306 0 0 0 0 0 0 0  0  0 24702 47499 33034 3 3 94

Je comprends que l'unité centrale est en grande partie inactive, qu'aucun processus n'attend dans la file d'attente pour être exécuté et qu'il y a peu d'échanges.

Running iostat 15 donne ça :

   tty        sd0           sd1           sd4           ssd0           cpu
 tin tout kps tps serv  kps tps serv  kps tps serv  kps tps serv   us sy wt id
   0  676 324  13    8  322  13    8    0   0    0  159   8    0    1  1  0 98
   1 1385   0   0    0    0   0    0    0   0    0    0   0    0    3  4  0 94
   0  584  89   6   24   89   6   25    0   0    0  332  19    0    2  1  0 97
   0  296   0   0    0    0   0    0    0   0    0    0   0    0    2  2  0 97
   1 1290  43   5   24   43   5   22    0   0    0  297  20    1    3  3  0 94

Running netstat -i 15 donne ce qui suit :

    input   aggr26    output       input  (Total)    output
packets errs  packets errs  colls  packets errs  packets errs  colls
1500233798 0     1489316495 0     0      3608008314 0     3586173708 0     0
10646   0     10234   0     0      26206   0     25382   0     0
11227   0     10670   0     0      28562   0     27448   0     0
10353   0     9998    0     0      29117   0     28418   0     0
11443   0     12003   0     0      30385   0     31494   0     0

Qu'est-ce que je rate ?

0 votes

Je ne suis pas à l'aise avec Solaris, je vais donc m'en remettre à quelqu'un d'autre pour cela, mais je commencerais par regarder la configuration de votre serveur web. Peut-être que quelque chose bloque artificiellement les performances de manière à laisser beaucoup de threads dans la file d'attente d'exécution. (Je ne suis pas sûr de ce que cela pourrait être ou même si c'est possible, cependant). Félicitations pour cette question bien écrite, cependant.

4 votes

10 CPUs (je pense) est peut-être le problème. Vous devez savoir plus précisément quel matériel vous utilisez avant d'aller plus loin. Utilisez psrinfo -v pour afficher le nombre réel de CPUs.

0 votes

Je n'ai jamais entendu parler de cette commande, mais en l'exécutant, il semble qu'il y ait environ 250 processeurs virtuels. Est-ce que cela a un sens ? Dans ce cas, une moyenne de charge de 50 serait insignifiante ?

52voto

Spiff Points 1521

Après quelques recherches plus poussées, il apparaît que le problème de performance est principalement dû à un nombre élevé d'appels réseau entre deux systèmes (Oracle SSXA et UCM). Les appels sont rapides mais nombreux et sérialisés, d'où la faible utilisation du CPU (principalement en attente d'E/S), la moyenne de charge élevée (beaucoup d'appels en attente de traitement) et surtout les longs temps de réponse (par accumulation de petits temps de réponse).

Merci de votre perspicacité sur ce problème !

25 votes

Comment avez-vous confirmé et compris cela ? Nous avons le même problème et nous aimerions vérifier si nous avons le même problème.

35voto

Ross Light Points 1994

Lorsque vous dites "Moyenne de charge élevée", je suppose que vous voulez dire que prstat affiche la "moyenne de charge" en bas des chiffres de sortie de l'ordinateur.

Total: 135 processes, 3167 lwps, load averages: 54.48, 62.50, 63.11

Ces chiffres, qui ressemblent à ceux fournis par Top, représentent probablement la taille moyenne des files d'attente des processus en cours. Il ne s'agit pas du pourcentage du temps processeur utilisé, mais du nombre de "choses" qui harcèlent le CPU pour obtenir du temps d'exécution. Certes, ces chiffres semblent assez élevés, mais tout dépend de l'application que vous exécutez ; les processus peuvent ne pas faire grand-chose une fois qu'ils ont obtenu leur créneau. Voir aquí pour une bonne explication concernant le sommet.

Je ne connais pas bien WebLogic, mais j'ai remarqué que, généralement, avec Apache Tomcat, de nombreux threads Java peuvent être créés simultanément pour ce qui semble être un petit nombre de requêtes. C'est peut-être cela qui est à l'origine de ces chiffres de charge moyenne élevés. Assurez-vous que vous utilisez le pooling de connexion lorsque cela est approprié pour vous connecter au backend et envisagez d'augmenter le nombre de threads inactifs qui sont disponibles pour votre application afin de gérer les connexions (je ne sais pas comment vous faites cela sur WebLogic ; Tomcat a un pool de threads par connecteur ou un pool de threads d'exécuteur général). Si vous ne le faites pas, de nouveaux threads peuvent être créés pour traiter les demandes.

En ce qui concerne les performances, vous devez déterminer ce que Une partie de votre application en souffre. Est-ce le traitement qui se déroule du côté de WebLogic/Java, l'accès à la base de données, les recherches DNS (si elles sont effectuées pour une raison quelconque...), les problèmes de réseau ou quelque chose au niveau du système d'exploitation ?

Dans 99% des cas, c'est votre code et la façon dont il communique avec la base de données qui bloque les choses. Ensuite, ce sera la configuration de l'application web. Passé ce stade, vous vous efforcerez d'extraire les dernières millisecondes de votre application ou de fournir une plus grande simultanéité avec le même matériel. Pour ce réglage plus fin des performances, vous avez besoin de métriques.

Pour Java, je suggère d'installer Mélodie de Java . Il peut fournir beaucoup d'informations sur ce que fait votre programme et aider à déterminer où il passe son temps. Je ne l'ai utilisé qu'avec Tomcat mais il devrait fonctionner avec n'importe quel conteneur/servlet Java EE.

Il existe de nombreuses façons de régler Java, alors jetez un coup d'œil à leurs directives de performance (je suis sûr que vous l'avez déjà fait) et assurez-vous que vous définissez la taille de tas correcte, etc. adaptée à votre programme. Java Melody peut vous aider à déterminer la taille du tas de Java que vous consommez, ainsi que l'intensité du travail du ramasseur d'ordures et la fréquence à laquelle il interrompt votre programme pour vider les objets.

J'espère que cela a été utile. Si vous fournissez d'autres informations, je pourrai peut-être mettre à jour cette réponse et l'adapter davantage à vos besoins.

1 votes

Merci pour votre réponse, si ma réputation était assez élevée, je l'upvoterais. D'après mon expérience, le code ou les requêtes SQL sont généralement les coupables. J'ai effectué quelques tests de profilage et je n'ai pas trouvé de point chaud, c'est pourquoi j'ai commencé à examiner des facteurs plus fondamentaux. Je vais poursuivre mes recherches et mettre à jour la question au fur et à mesure de mes découvertes.

4 votes

Je vérifierais également la sortie de 'mpstat 1 5' pour voir les statistiques par processeur et regarder les colonnes "csw" et "syscl". D'après votre vmstat ci-dessus, il semble que vous fassiez beaucoup d'appels système et de changements de contexte, ce qui semble valider le soupçon de webtoe que vous avez beaucoup de threads (Solaris les appelle LWP - LightWeight Processes) harcelant constamment le CPU. Aucun d'entre eux ne fait grand-chose lorsqu'ils sont en cours d'exécution, mais beaucoup passent du temps à attendre d'être exécutés, d'où les moyennes de charge élevées.

31voto

rogerdpack Points 565

En outre, la moyenne de charge inclut également les éléments qui attendent une activité sur le disque (c'est-à-dire qui harcèlent le disque) ainsi que ceux qui attendent le processeur, c'est la somme des deux... vous pouvez donc avoir des problèmes dans l'un ou l'autre.

Voir http://en.wikipedia.org/wiki/Load_(informatique) "Linux inclut également [dans sa moyenne de charge] les processus en état de veille ininterrompue (généralement en attente d'une activité sur le disque)".

En passant, le problème particulier que j'ai rencontré était que j'avais une charge moyenne élevée, mais aussi beaucoup de processeur inactif et une faible utilisation du disque.

Il semble que, du moins dans mon cas, les threads/processus en attente d'E/S apparaissent parfois dans la moyenne de charge, mais ne le font pas. pas provoquent une augmentation de la colonne "await". Mais ils sont toujours liés aux entrées/sorties.

Vous pouvez constater que c'est le cas avec le code suivant, si vous l'exécutez dans jruby (fait juste 100 threads avec beaucoup d'E/S chacun) :

100.times { Thread.new { loop { File.open('big', 'w') do |f| f.seek 10_000_000_000; f.puts 'a'; end}}}

Ce qui donne une sortie supérieure comme celle-ci :

top - 17:45:32 up 38 days,  2:13,  3 users,  load average: 95.18, 50.29, 23.83
Tasks: 181 total,   1 running, 180 sleeping,   0 stopped,   0 zombie
Cpu(s):  3.5%us, 11.3%sy,  0.0%ni, 85.1%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:  32940904k total, 23239012k used,  9701892k free,   983644k buffers
Swap: 34989560k total,        0k used, 34989560k free,  5268548k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
31866 packrd    18   0 19.9g  12g  11m S 117.0 41.3   4:43.85 java
  912 root      11  -5     0    0    0 S  2.0  0.0   1:40.46 kjournald

Vous pouvez donc voir qu'il a beaucoup de cpu inactif, 0.0%wa, mais une moyenne de charge très élevée.

iostat montre également que le disque est pratiquement inactif :

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
       9.62    0.00    8.75    0.00    0.00   81.62

Device:         rrqm/s   wrqm/s   r/s   w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await  svctm  %util
sda               0.00    49.00  0.00  6.40     0.00   221.60    69.25     0.01    0.81   0.66   0.42
sda1              0.00    49.00  0.00  6.40     0.00   221.60    69.25     0.01    0.81   0.66   0.42
sda2              0.00     0.00  0.00  0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00

voir aussi http://linuxgazette.net/141/misc/lg/tracking_load_average_issues.html

Par ailleurs, cela semble également impliquer que (au moins dans ce cas - sous CentOS) la moyenne de charge inclut chaque thread séparément dans le total.

2 votes

"la moyenne de charge inclut aussi les choses en attente d'activité sur le disque" sur Linux alors que cette question concernait à l'origine Solaris, qui semble n'inclure que les tâches en cours d'exécution et exécutables (c'est-à-dire en attente de CPU) dans la moyenne de charge. . Une version Linux de cette question est ce .

7voto

PJunior Points 230

J'ai eu le même problème aujourd'hui. Après quelques recherches et diagnostics, je me suis rendu compte que mon petit VPS était manque de disque .

Dans Shell/prompt (Linux/Unix)tapez

df -h

pour voir le disque libre sur votre machine. Si vous manquez de disque, cela peut être la cause du problème.

0 votes

Je suppose que c'est l'échange qui a causé le problème ?

6voto

Daniel Baker Points 179

Un autre outil utile qui vous aidera dans cette situation est nmon.

Il permet de visualiser de diverses manières les mêmes données que celles présentées par les autres outils, dans un seul et même paquet.

S'il s'agit d'un contenu qui ne peut pas être mis en cache, je recommanderais de placer plusieurs serveurs derrière un équilibreur de charge tel que haproxy en mode tcp pour répartir la charge.

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