Tempo de execução e recursos após processos em execução há tanto tempo

4

Esta pode ser uma questão básica, mas estou tendo dificuldade em encontrar uma resposta para ela. Eu estou usando o RHEL6. Depois de executar qualquer processo que demore um tempo de CPU significativo, recebo uma linha que informa (eu suponho) o uso do tempo de execução e do pedido de veiculação automaticamente. Parece:

77410.101u 124.968s 1:42:43.49 657.9%    0+0k 0+1353384io 0pf+0w

Eu tenho as seguintes perguntas:

  1. Como interpreto cada campo nesta mensagem? Eu posso adivinhar algum tempo, uso de IO e pode ser uso da CPU ... mas não tenho certeza.
  2. O que realmente imprime essa linha? É a casca? É o emulador de terminal? Existe um daemon em execução cuidando disso? Qual é o nome desse recurso / serviço / o que quer que seja.
  3. É possível controlar esta mensagem? Como definir o limite de uso de cpu para imprimi-lo?
  4. Posso adicionar informações extras a ele? Como o caminho absoluto do processo, uso de memória de pico, uso de disco de pico, etc ...
por Bichoy 14.10.2013 / 04:39

1 resposta

5

Dica para depurar o que está acontecendo

Eu sugeriria ativar o recurso de depuração do seu shell, supondo que você esteja usando o Bash.

$ set -x

Esta saída mostrará o que está acontecendo nos bastidores quando você executar um comando que produza essa saída.

A saída

Essa saída é do comando time /usr/bin/time sendo prefixado para cada comando executado. A fim de obter essa saída, eu estou supondo que você está usando o C-shell (csh) ou o Turbo C-shell (tcsh).

Exemplo

$ tcsh
$ time sleep 2
0.000u 0.000s 0:02.00 0.0%  0+0k 0+0io 0pf+0w

A razão pela qual eu suspeito que isso é um tcsh shell é que quando eu executo o comando /usr/bin/time em um shell Bash a saída se parece com isto:

$ /usr/bin/time sleep 2
0.00user 0.00system 0:02.02elapsed 0%CPU (0avgtext+0avgdata 580maxresident)k
0inputs+0outputs (0major+180minor)pagefaults 0swaps

A saída pode ser controlada usando a opção -f ou --format , então a saída que você está vendo pode ser obtida também no Bash, mas teria que ser feita intencionalmente.

Significado de saída

Se você executar o comando /usr/bin/time no modo detalhado, ( -v ), obterá todos os detalhes sobre cada campo assim:

$ /usr/bin/time -v sleep 2
    Command being timed: "sleep 2"
    User time (seconds): 0.00
    System time (seconds): 0.00
    Percent of CPU this job got: 0%
    Elapsed (wall clock) time (h:mm:ss or m:ss): 0:02.00
    Average shared text size (kbytes): 0
    Average unshared data size (kbytes): 0
    Average stack size (kbytes): 0
    Average total size (kbytes): 0
    Maximum resident set size (kbytes): 584
    Average resident set size (kbytes): 0
    Major (requiring I/O) page faults: 0
    Minor (reclaiming a frame) page faults: 184
    Voluntary context switches: 2
    Involuntary context switches: 4
    Swaps: 0
    File system inputs: 0
    File system outputs: 0
    Socket messages sent: 0
    Socket messages received: 0
    Signals delivered: 0
    Page size (bytes): 4096
    Exit status: 0

Se você alinhar a saída original:

77410.101u 124.968s 1:42:43.49 657.9%    0+0k 0+1353384io 0pf+0w
^^^^^^^^^^ ^^^^^^^^ ^^^^^^^^^^ ^^^^^^    ^^^^ ^^^^^^^^^^^ ^^^^^^
     1        2         3       4         5        6        7
  1. Tempo do usuário (segundos)
  2. Hora do sistema (segundos)
  3. Tempo transcorrido (relógio de parede) (h: mm: ss ou m: ss)
  4. Porcentagem de CPU que esse trabalho recebeu
  5. Tamanho médio do texto compartilhado (kbytes) + Tamanho médio dos dados não compartilhados (kbytes)
  6. Número de entradas do sistema de arquivos pelo processo + Número de saídas do sistema de arquivos pelo processo
  7. Número de falhas de página principais que ocorreram enquanto o processo estava sendo executado. Estas são falhas onde a página tem que ser lida do disco + Número de vezes que o processo foi trocado da memória principal

Você pode manualmente fazer o mesmo formato como este:

$ /usr/bin/time -f '%Uu %Ss %E %P %X+%Dk %I+%Oio %Fpf+%Ww' sleep 2
0.00u 0.00s 0:02.00 0% 0+0k 0+0io 0pf+0w

Personalizando a saída

Quando você puder determinar onde a chamada para /usr/bin/time está sendo feita, você poderá personalizar a saída obtendo um pico na página man de time . Existem muitas opções que podem ser incluídas nesta saída.

$ man time

trecho

   Time
   %E     Elapsed real time (in [hours:]minutes:seconds).
   %e     (Not in tcsh.) Elapsed real time (in seconds).
   %S     Total number of CPU-seconds that the process spent in kernel mode.
   %U     Total number of CPU-seconds that the process spent in user mode.
   %P     Percentage of the CPU that this job got, computed as (%U + %S) / %E.

   Memory
   %M     Maximum resident set size of the process during its lifetime, in Kbytes.
   %t     (Not in tcsh.) Average resident set size of the process, in Kbytes.
   %K     Average total (data+stack+text) memory use of the process, in Kbytes.
   %D     Average size of the process's unshared data area, in Kbytes.
   %p     (Not in tcsh.) Average size of the process's unshared stack space, in Kbytes.
   %X     Average size of the process's shared text space, in Kbytes.
   %Z     (Not in tcsh.) System's page size, in bytes.  This is a per-system constant, but varies between systems.
   %F     Number  of major page faults that occurred while the process was running.  These are faults where the page has to be read
          in from disk.
   %R     Number of minor, or recoverable, page faults.  These are faults for pages that are not valid but which have not yet  been
          claimed by other virtual pages.  Thus the data in the page is still valid but the system tables must be updated.
   %W     Number of times the process was swapped out of main memory.
   %c     Number of times the process was context-switched involuntarily (because the time slice expired).
   %w     Number of waits: times that the program was context-switched voluntarily, for instance while waiting for an I/O operation
          to complete.

   I/O
   %I     Number of file system inputs by the process.
   %O     Number of file system outputs by the process.
   %r     Number of socket messages received by the process.
   %s     Number of socket messages sent by the process.
   %k     Number of signals delivered to the process.
   %C     (Not in tcsh.) Name and command-line arguments of the command being timed.
   %x     (Not in tcsh.) Exit status of the command.

Veja a man page para mais detalhes.

EDIT # 1: seu problema

A sua pergunta sobre a saída sendo mostrada automaticamente está sendo causada pela configuração dessa variável de ambiente em csh / tcsh.

da página de manual do tcsh

   The time shell variable can be set to execute the time builtin command 
     after the completion of any process that takes more  than a given number 
     of CPU seconds.

Exemplo

Defina o tempo para 5 segundos.

$ set time=5

Confirme:

$ set|grep time
time    5

Teste:

$ bash -c "while [ 1 ];do echo hi; done"
hi
hi
...
...waited ~5 seconds, then Ctrl-C to stop it

5.650u 1.471s 0:09.68 73.5% 0+0k 0+0io 0pf+0w

A saída só aparecerá se a tarefa que estiver executando consumir mais do que o número de segundos do tempo de CPU definido pela variável $time .

Referências

por 14.10.2013 / 05:58

Tags