De acordo com o vmstat, meu servidor Linux (2xCore2 Duo 2,5 GHz) está constantemente fazendo cerca de 20k comutações 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
... mas uptime
mostra carga pequena: load average: 0.01, 0.02, 0.01
e top
não mostra nenhum processo com alto% de uso da CPU.
Como descobrir o que exatamente está gerando essas alternâncias de contexto? Qual processo / thread?
Eu tentei analisar a pidstat
saída:
# 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 algumas tarefas do postgresql estão executando mais de 10 swiches de contexto por segundo, mas nem todos somam 20k.
Alguma idéia de como cavar um pouco mais fundo para obter uma resposta?
Respostas:
Bem, caso bastante interessante. Tente observar
watch -tdn1 cat /proc/interrupts
. Você vê alguma mudança valiosa lá?fonte
Tente usar
A opção 't' mostra os threads também. Pode ser um segmento que está fazendo as alternâncias de contexto.
fonte
Na versão mais recente do kernel
Isso fornecerá o resultado exato sobre os eventos de alternância de contexto.
E você pode encontrar o motivo pelo qual as alternâncias de contexto acrescentam sinalizadores "-g" (o resultado legível determinado pelas informações do símbolo)
fonte
A troca de contexto é normal. Um processo é atribuído a uma quantidade de tempo, se terminar (ou pausar devido à necessidade de recursos) o que for necessário, poderá deixar o processador em funcionamento.
Dito isso, para contar quantas alternâncias de contexto são feitas (isso se torna uma resposta stackoverflow.com), seria necessário o comando schedule () do kernel interno para gravar nas tabelas de processos. A não existe, se você programar seu próprio kernel, poderá ver, mas é bastante difícil.
fonte
powertop
pode dizer com que frequência um processo está ativando a CPU.fonte