Descubra qual tarefa está gerando muitas opções de contexto no linux

11

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 uptimemostra carga pequena: load average: 0.01, 0.02, 0.01e topnã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 pidstatsaí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?

grzaks
fonte
A questão do postgre é que eles são programas diferentes, e são completamente diferentes.
Gopoi 12/10/10
1
gor one process: unix.stackexchange.com/questions/39342/…
Ciro Santilli (

Respostas:

5

Bem, caso bastante interessante. Tente observar watch -tdn1 cat /proc/interrupts. Você vê alguma mudança valiosa lá?

poige
fonte
"Interruptor de timer local" está gerando algumas centenas (200-800) de interrupções em cada núcleo da CPU. O que isso poderia significar? O eth0-rx / tx também está gerando algumas interrupções devido ao tráfego nesse servidor, mas não muito.
grzaks
Que tal "A chamada de função interrompe"?
poige
10

Tente usar

pidstat -wt

A opção 't' mostra os threads também. Pode ser um segmento que está fazendo as alternâncias de contexto.

Garcia alemão
fonte
1
executando pidstat -wt | classificar -n -k4 é melhor.
Ismael Vacco 04/09/2015
2

Na versão mais recente do kernel

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

# then ctrl+c

sudo perf report # inspect the result

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)

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

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.

Gopoi
fonte
1
Bem. Eu sei o que é a alternância de contexto e quais implicações isso tem para o desempenho do sistema. Eu só preciso de uma maneira de medir quantas alternâncias de contexto são feitas para quais processos no linux. Eu já encontrei contadores brutos de csw em / proc / * / stats (voluntary_ctxt_switches)
grzaks
0

powertop pode dizer com que frequência um processo está ativando a CPU.

Hubert Kario
fonte