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 uptime
muestra una carga pequeña: load average: 0.01, 0.02, 0.01
y top
no 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 pidstat
salida:
# 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?
Respuestas:
Bueno, caso bastante interesante. Intenta observar
watch -tdn1 cat /proc/interrupts
. ¿Ves algún cambio valioso allí?fuente
Intenta usar
La opción 't' muestra los hilos también. Puede ser un hilo quien está haciendo los cambios de contexto.
fuente
En la versión más reciente del kernel
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)
fuente
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.
fuente
powertop
puede decirle con qué frecuencia un proceso está despertando la CPU.fuente