Descubra qué tarea está generando muchos cambios de contexto en Linux

11

Según vmstat, mi servidor Linux (2xCore2 Duo 2.5 GHz) realiza constantemente alrededor de 20k cambios de contexto por segundo.

# 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

... pero uptimemuestra una carga pequeña: load average: 0.01, 0.02, 0.01y topno muestra ningún proceso con un alto porcentaje de uso de CPU.

¿Cómo puedo saber qué es exactamente lo que genera esos cambios de contexto? ¿Qué proceso / hilo?

Traté de analizar la pidstatsalida:

# 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

Parece que algunas tareas postgresql están haciendo> 10 cambios de contexto por segundo, pero de todos modos no suman hasta 20k.

¿Alguna idea de cómo profundizar un poco para obtener una respuesta?

grzaks
fuente
Lo que pasa con postgre es que son diferentes pid, por lo que son programas completamente diferentes.
Gopoi
1
gor one process: unix.stackexchange.com/questions/39342/…
Ciro Santilli 冠状 病毒 审查 六四 事件 法轮功

Respuestas:

5

Bueno, caso bastante interesante. Intenta observar watch -tdn1 cat /proc/interrupts. ¿Ves algún cambio valioso allí?

poige
fuente
Las "interrupciones del temporizador local" generan unos cientos (200-800) interrupciones en cada núcleo de la CPU. ¿Qué podría significar eso? También eth0-rx / tx está generando algunas interrupciones debido al tráfico en ese servidor, pero eso no es mucho.
grzaks
¿Qué tal "interrupciones de llamadas de función"?
poige
10

Intenta usar

pidstat -wt

La opción 't' muestra los hilos también. Puede ser un hilo quien está haciendo los cambios de contexto.

German Garcia
fuente
1
ejecutando pidstat -wt | sort -n -k4 es mejor.
Ismael Vacco
2

En la versión más reciente del kernel

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

# then ctrl+c

sudo perf report # inspect the result

Esto le dará el resultado exacto sobre los eventos de cambio de contexto.

Y es posible que encuentre la razón que causó los cambios de contexto al agregar banderas "-g" (el resultado legible determinado por la información del símbolo)

sudo perf record -e context-switches -a -g
snyh
fuente
1

El cambio de contexto es normal. Un proceso se asigna a una cantidad de tiempo, si finaliza (o se detiene debido a la necesidad de recursos) lo que tiene que hacer puede dejar que el procesador se vaya.

Dicho esto, para contar cuántos cambios de contexto se realizan (se convierte en una respuesta stackoverflow.com), se necesitaría el comando interno del kernel schedule () para escribir en las tablas de procesos. R No existe tal cosa si programa su propio núcleo que podrá ver, pero es bastante difícil.

Gopoi
fuente
1
Bien. Sé qué es el cambio de contexto y qué implicaciones tiene para el rendimiento del sistema. Solo necesito una forma de medir cuántos cambios de contexto se realizan a qué procesos en Linux. Ya he encontrado contadores de CSW en bruto en / proc / * / stats (voluntario_ctxt_switches)
grzaks
0

powertop puede decirle con qué frecuencia un proceso está despertando la CPU.

Hubert Kario
fuente