15 votes

Déterminer la tâche qui génère le plus de changements de contexte sous linux

D'après vmstat, mon serveur Linux (2xCore2 Duo 2,5 GHz) effectue en permanence environ 20 000 changements de contexte par seconde.

# vmstat 3
procs -----------memory----------  ---swap-- -----io----  -system-- ----cpu----
 r  b   swpd   free   buff  cache    si   so    bi    bo   in    cs us sy id wa
 2  0   7292 249472  82340 2291972    0    0     0     0    0     0  7 13 79  0
 0  0   7292 251808  82344 2291968    0    0     0   184   24 20090  1  1 99  0
 0  0   7292 251876  82344 2291968    0    0     0    83   17 20157  1  0 99  0
 0  0   7292 251876  82344 2291968    0    0     0    73   12 20116  1  0 99  0

... mais uptime montre une faible charge : load average: 0.01, 0.02, 0.01 y top n'indique aucun processus avec un % d'utilisation de l'unité de calcul élevé.

Comment savoir exactement ce qui génère ces commutations de contexte ? Quel processus/thread ?

J'ai essayé d'analyser pidstat de la production :

# pidstat -w 10 1

12:39:13          PID   cswch/s nvcswch/s  Command
12:39:23            1      0.20      0.00  init
12:39:23            4      0.20      0.00  ksoftirqd/0
12:39:23            7      1.60      0.00  events/0
12:39:23            8      1.50      0.00  events/1
12:39:23           89      0.50      0.00  kblockd/0
12:39:23           90      0.30      0.00  kblockd/1
12:39:23          995      0.40      0.00  kirqd
12:39:23          997      0.60      0.00  kjournald
12:39:23         1146      0.20      0.00  svscan
12:39:23         2162      5.00      0.00  kjournald
12:39:23         2526      0.20      2.00  postgres
12:39:23         2530      1.00      0.30  postgres
12:39:23         2534      5.00      3.20  postgres
12:39:23         2536      1.40      1.70  postgres
12:39:23        12061     10.59      0.90  postgres
12:39:23        14442      1.50      2.20  postgres
12:39:23        15416      0.20      0.00  monitor
12:39:23        17289      0.10      0.00  syslogd
12:39:23        21776      0.40      0.30  postgres
12:39:23        23638      0.10      0.00  screen
12:39:23        25153      1.00      0.00  sshd
12:39:23        25185     86.61      0.00  daemon1
12:39:23        25190     12.19     35.86  postgres
12:39:23        25295      2.00      0.00  screen
12:39:23        25743      9.99      0.00  daemon2
12:39:23        25747      1.10      3.00  postgres
12:39:23        26968      5.09      0.80  postgres
12:39:23        26969      5.00      0.00  postgres
12:39:23        26970      1.10      0.20  postgres
12:39:23        26971     17.98      1.80  postgres
12:39:23        27607      0.90      0.40  postgres
12:39:23        29338      4.30      0.00  screen
12:39:23        31247      4.10     23.58  postgres
12:39:23        31249     82.92     34.77  postgres
12:39:23        31484      0.20      0.00  pdflush
12:39:23        32097      0.10      0.00  pidstat

Il semble que certaines tâches postgresql effectuent plus de 10 échanges de contexte par seconde, mais le total n'est pas de 20 000 de toute façon.

Une idée sur la manière de creuser un peu plus pour trouver une réponse ?

10voto

German Garcia Points 201

Essayez d'utiliser

pidstat -wt

L'option "t" affiche également les fils. Il peut s'agir d'un fil de discussion qui effectue les changements de contexte.

8voto

cyphun Points 53

C'est un cas très intéressant. Essayez d'observer watch -tdn1 cat /proc/interrupts . Voyez-vous des changements importants dans ce domaine ?

4voto

snyh Points 141

Dans une version plus récente du noyau

sudo perf record -e context-switches -a  # record the events

# then ctrl+c

sudo perf report # inspect the result

Vous obtiendrez ainsi le résultat exact des événements de changement de contexte.

Vous pouvez également trouver la raison des changements de contexte en ajoutant les drapeaux "-g" (le résultat lisible est déterminé par les informations sur les symboles).

sudo perf record -e context-switches -a -g

1voto

Sujan Points 373

Le commutateur de contexte est normal. Un processus est assigné à un quanta de temps, s'il a terminé (ou s'est mis en pause par besoin de ressources) ce qu'il a à faire, il peut relâcher le processeur.

Cela dit, pour compter le nombre de changements de contexte effectués (cela devient une réponse stackoverflow.com), il faudrait que la commande interne du noyau schedule() écrive dans les tables de processus. A il n'y a rien de tel si vous programmez votre propre kernel vous pourrez voir mais c'est assez difficile.

0voto

Hubert Kario Points 6321

powertop peut vous indiquer à quelle fréquence un processus réveille le processeur.

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