Muito tempo do sistema

1

Observei que, ao executar o CESM (um aplicativo de modelagem de tempo), o comando top mostra uma grande quantidade de tempo gasto em chamadas do sistema, cerca de 25% a 60% e apenas 40% a 75% no código do usuário. O aplicativo faz alguma E / S e se comunica com o MPI.

Uma amostra de saída do comando top é fornecida abaixo:

top - 16:54:32 up 11 days, 13:45,  2 users,  load average: 8.12, 8.25, 8.08
Tasks: 201 total,   9 running, 192 sleeping,   0 stopped,   0 zombie
Cpu(s): 74.3%us, 25.2%sy,  0.0%ni,  0.0%id,  0.0%wa,  0.0%hi,  0.5%si,  0.0%st
Mem:  24659792k total,  5259280k used, 19400512k free,  1747768k buffers
Swap: 28667984k total,   234408k used, 28433576k free,   169080k cached

  PID USER    PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
20748 user1   25   0  516m 304m  26m R 100.2  1.3  22:31.81 ccsm.exe
20750 user1   25   0  497m 293m  26m R 100.2  1.2  27:12.45 ccsm.exe
20754 user1   25   0  496m 290m  24m R 100.2  1.2  27:18.33 ccsm.exe
20751 user1   25   0  496m 291m  25m R 99.9  1.2  27:21.63 ccsm.exe
20752 user1   25   0  496m 291m  25m R 99.9  1.2  27:18.97 ccsm.exe
20749 user1   25   0  686m 446m  26m R 99.2  1.9  26:36.16 ccsm.exe
20753 user1   25   0  554m 335m  25m R 98.5  1.4  27:19.78 ccsm.exe
20755 user1   25   0  496m 289m  23m R 97.2  1.2  27:12.34 ccsm.exe

Usar o comando strace para anexar ao processo 20748 mostra muito

poll([{fd=4, events=POLLIN}, {fd=5, events=POLLIN}, {fd=6, events=POLLIN}, {fd=7, events=POLLIN}, {fd=10, events=POLLIN}, {fd=18, events=POLLIN}, {fd=19, events=POLLIN}], 7, 0) = 0 (Timeout)
poll([{fd=4, events=POLLIN}, {fd=5, events=POLLIN}, {fd=6, events=POLLIN}, {fd=7, events=POLLIN}, {fd=10, events=POLLIN}, {fd=18, events=POLLIN}, {fd=19, events=POLLIN}], 7, 0) = 0 (Timeout)
poll([{fd=4, events=POLLIN}, {fd=5, events=POLLIN}, {fd=6, events=POLLIN}, {fd=7, events=POLLIN}, {fd=10, events=POLLIN}, {fd=18, events=POLLIN}, {fd=19, events=POLLIN}], 7, 0) = 0 (Timeout)

Usando strace -c -p 20748 para contar o tempo por um tempo, recebi:

$ strace -c -p 20748
Process 20748 attached - interrupt to quit
Process 20748 detached
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 85.17    0.068864           0  11713876           poll
  9.74    0.007876           2      4208           write
  4.45    0.003595           1      6463           munmap
  0.37    0.000302           0      6463           mmap
  0.22    0.000179           0      1068           brk
  0.03    0.000025           1        18           open
  0.02    0.000016           1        18           read
  0.00    0.000000           0        18           close
  0.00    0.000000           0         2         1 stat
  0.00    0.000000           0        18           fstat
  0.00    0.000000           0         2           madvise
  0.00    0.000000           0         1           getcwd
------ ----------- ----------- --------- --------- ----------------
100.00    0.080857              11732155         1 total

Os descritores de arquivos que aparecem na enquete são soquetes e um pipe.

4 -> socket:[2789396]
5 -> socket:[2789451]
6 -> socket:[2789452]
7 -> socket:[2789456]
10 -> pipe:[2789492]
18 -> socket:[2789517]
19 -> socket:[2789518]

Eu sinto muito tempo desperdiçado em pesquisas e vagar se algo puder ser feito para diminuir isso. A primeira coisa que posso pensar é encontrar onde poll é chamado. O código do aplicativo não chama poll diretamente. Como posso rastrear a origem da chamada? Como rastrear de volta para onde os sockets são criados?

    
por user2196452 01.04.2014 / 20:55

1 resposta

2

O tempo em poll não é desperdiçado - é o tempo que o processo aguarda que os dados de entrada "cheguem" ou que os buffers de saída estejam prontos para novos dados de saída.

Você pode usar lsof para listar os descritores abertos (incluindo sockets).

Quantos núcleos de CPU você tem no sistema? Quantos núcleos podem usar o ccsm?

Sua listagem top mostra cerca de 100% do uso da CPU para processos ccsm.exe. Parece-me que o seu gargalo não é I / O, mas a CPU.

De qualquer forma, para reduzir o "poll time" você precisaria acelerar o I / O - por exemplo colocando os dados (database?) em uma memória de massa rápida (sistema).

    
por 01.04.2014 / 21:11