AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 410877
Accepted
Willem
Willem
Asked: 2017-12-15 06:09:09 +0800 CST2017-12-15 06:09:09 +0800 CST 2017-12-15 06:09:09 +0800 CST

Por que `time` e `strace -c` diferem?

  • 772

No meu entendimento, timeregistraria o tempo total gasto em syscalls. Então, eu esperaria que os totais cumulativos para o tempo do sistema, conforme relatado por timee strace -fc, fossem os mesmos. Mas eles são muito diferentes (13,5 vs 0,005). O que está acontecendo?

# time php index.php >/dev/null

real  0m16.292s
user  0m2.728s
sys   0m13.548s

# strace -fc php index.php >/dev/null
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 83.72    0.000365           0     54845           munmap
 10.09    0.000044           0     36705           mmap
  6.19    0.000027           0     18249           madvise
  0.00    0.000000           0       289           read
  0.00    0.000000           0       119           write
  0.00    0.000000           0       118         3 open
  0.00    0.000000           0       118           close
  0.00    0.000000           0        23           stat

[ cut 0 duration syscalls for brevity ]

100.00    0.000436                110951        82 total

(Eu executei novamente esses testes cerca de 50 vezes e ambos deram resultados consistentes)

linux time
  • 1 1 respostas
  • 999 Views

1 respostas

  • Voted
  1. Best Answer
    Stéphane Chazelas
    2017-12-15T06:51:52+08:002017-12-15T06:51:52+08:00

    Um processo pode gastar qualquer quantidade de tempo sem fazer nenhuma chamada de sistema.

    Por exemplo, um shell fazendo um while :; do :; donegastará uma quantidade infinita de tempo sem fazer nenhuma chamada de sistema e sem gastar systempo de CPU, apenas usertempo de CPU.

    strace -ctenta contar o systempo de CPU por cada chamada do sistema. A nanosleep(1000000000)gastará cerca de 0ms de tempo de CPU, mas 1s de tempo de relógio de parede.

    $ bash -c 'time strace -fc sleep 1'
    % time     seconds  usecs/call     calls    errors syscall
    ------ ----------- ----------- --------- --------- ----------------
      [...]
      0.00    0.000000           0         1           nanosleep
      [...]
    100.00    0.000000                    33         3 total
    
    real    0m1.006s
    user    0m0.001s
    sys     0m0.003s
    

    Comparar o tempo do sistema com o tempo relatado pelo strace faria mais sentido, mas observe que nem todo o tempo de CPU do sistema contabilizado para o processo é gasto nesses syscalls. Acessar dados mapeados, por exemplo, pode fazer com que o processo gaste muito tempo do sistema sem fazer nenhuma chamada do sistema.

    Aqui, essas inúmeras mmaps()chamadas podem ser para alocar memória. Esses são instantâneos, pois apenas atualizam alguns mapeamentos. Mas a primeira vez que você escreve para eles, é aí que algum tempo do sistema é necessário para fazer backup dessas gravações com a memória real.

    Ou podem ser para mapear arquivos de objeto como bibliotecas compartilhadas (essa também é uma possibilidade provável, pois o número não está longe do número de open()s). Então, novamente, o mmap()é rápido, mas ler a memória mais tarde também significa algumas falhas de página e tempo real para ler os dados do disco, o que não é contabilizado em nenhuma chamada do sistema.

    Mais fundamentalmente, se você fizer time strace -f your-applicationcomo em uma versão anterior de sua pergunta, timecronometrará o comando e strace.

    straceadiciona muita sobrecarga. Ele faz algumas chamadas de sistema para cada chamada de sistema do aplicativo rastreado.

    Fazendo

    strace -fc time your-application
    

    ao invés de

    time strace -fc your-application
    

    é mais provável que lhe dê uma correspondência melhor.

    O que descobri, porém, é que para as wait*()chamadas de sistema que os processos fazem para esperar seus filhos, straceconta o tempo relatado por essas wait*()chamadas de sistema como tempo do sistema, o que significa que o tempo dos processos filhos (pelo menos os que são esperados) é contado várias vezes. Isso é importante, strace -f time cmdpois timeé executado cmdem um processo filho e aguarda por ele.

    $ strace -c time head -c 100M /dev/urandom > /dev/null
    0.00user 0.76system 0:00.76elapsed 99%CPU (0avgtext+0avgdata 1796maxresident)k
    0inputs+0outputs (0major+83minor)pagefaults 0swaps
    % time     seconds  usecs/call     calls    errors syscall
    ------ ----------- ----------- --------- --------- ----------------
    100.00    0.762288      762288         1           wait4
      0.00    0.000000           0         1           read
      0.00    0.000000           0       112           write
      0.00    0.000000           0         2           open
      0.00    0.000000           0         2           close
      0.00    0.000000           0         2           fstat
      0.00    0.000000           0         6           mmap
      0.00    0.000000           0         4           mprotect
      0.00    0.000000           0         1           munmap
      0.00    0.000000           0         1           brk
      0.00    0.000000           0         4           rt_sigaction
      0.00    0.000000           0         3         3 access
      0.00    0.000000           0         1           clone
      0.00    0.000000           0         1           execve
      0.00    0.000000           0         1           arch_prctl
    ------ ----------- ----------- --------- --------- ----------------
    100.00    0.762288                   142         3 total
    

    timee stracerelatar o mesmo horário do sistema (conforme retornado pela wait4()chamada do sistema), mas com -f:

    $ strace -fc time head -c 100M /dev/urandom > /dev/null
    strace: Process 2298 attached
    0.01user 1.33system 0:01.91elapsed 69%CPU (0avgtext+0avgdata 1920maxresident)k
    0inputs+0outputs (0major+84minor)pagefaults 0swaps
    % time     seconds  usecs/call     calls    errors syscall
    ------ ----------- ----------- --------- --------- ----------------
     54.60    1.331335     1331335         1           wait4
     39.43    0.961497          75     12804           read
      5.94    0.144825           6     25711           write
      0.01    0.000148          11        13         6 open
      0.00    0.000104           8        13           mmap
      0.00    0.000094          19         5         3 execve
      0.00    0.000063           8         8           mprotect
      0.00    0.000050           6         9           close
      0.00    0.000041           7         6         6 access
      0.00    0.000037           5         7           fstat
      0.00    0.000031          16         2           munmap
      0.00    0.000030           8         4           brk
      0.00    0.000007           4         2           arch_prctl
      0.00    0.000006           6         1         1 ioctl
      0.00    0.000000           0         4           rt_sigaction
      0.00    0.000000           0         1           clone
    ------ ----------- ----------- --------- --------- ----------------
    100.00    2.438268                 38591        16 total
    

    O 1,33 é o tempo relatado pela única wait4()chamada de sistema que o timefaz. Isso informa o tempo do sistema de head( timefilho de).

    No entanto, stracetambém tenta obter o tempo do sistema para cada syscall de seu headneto, o que significa que é contado duas vezes (não exatamente). Esse traçado do neto ainda incorre em alguma sobrecarga contabilizada no processo traçado, pois obtemos 1,33 em oposição a 0,76 anteriormente. Isso é consideravelmente reduzido se eu forçar strace, time e head a rodar no mesmo processador (com taskset 1).

    • 7

relate perguntas

  • Existe uma maneira de fazer ls mostrar arquivos ocultos apenas para determinados diretórios?

  • Inicie/pare o serviço systemd usando o atalho de teclado [fechado]

  • Necessidade de algumas chamadas de sistema

  • astyle não altera a formatação do arquivo de origem

  • Passe o sistema de arquivos raiz por rótulo para o kernel do Linux

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Matriz JSON para bash variáveis ​​usando jq

    • 4 respostas
  • Marko Smith

    A data pode formatar a hora atual para o fuso horário GMT? [duplicado]

    • 2 respostas
  • Marko Smith

    bash + lê variáveis ​​e valores do arquivo pelo script bash

    • 4 respostas
  • Marko Smith

    Como posso copiar um diretório e renomeá-lo no mesmo comando?

    • 4 respostas
  • Marko Smith

    conexão ssh. Conexão X11 rejeitada devido a autenticação incorreta

    • 3 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Marko Smith

    comando systemctl não funciona no RHEL 6

    • 3 respostas
  • Marko Smith

    rsync porta 22 e 873 uso

    • 2 respostas
  • Marko Smith

    snap /dev/loop em 100% de utilização -- sem espaço livre

    • 1 respostas
  • Marko Smith

    chave de impressão jq e valor para todos no subobjeto

    • 2 respostas
  • Martin Hope
    EHerman Matriz JSON para bash variáveis ​​usando jq 2017-12-31 14:50:58 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Drux A data pode formatar a hora atual para o fuso horário GMT? [duplicado] 2017-12-26 11:35:07 +0800 CST
  • Martin Hope
    AllisonC Como posso copiar um diretório e renomeá-lo no mesmo comando? 2017-12-22 05:28:06 +0800 CST
  • Martin Hope
    Steve Como as permissões de arquivo funcionam para o usuário "root"? 2017-12-22 02:46:01 +0800 CST
  • Martin Hope
    Bagas Sanjaya Por que o Linux usa LF como caractere de nova linha? 2017-12-20 05:48:21 +0800 CST
  • Martin Hope
    Cbhihe Altere o editor padrão para vim para _ sudo systemctl edit [unit-file] _ 2017-12-03 10:11:38 +0800 CST
  • Martin Hope
    showkey Como baixar o pacote não instalá-lo com o comando apt-get? 2017-12-03 02:15:02 +0800 CST
  • Martin Hope
    youxiao Por que os diretórios /home, /usr, /var, etc. têm o mesmo número de inode (2)? 2017-12-02 05:33:41 +0800 CST
  • Martin Hope
    user223600 gpg — o comando list-keys gera uid [ desconhecido ] depois de importar a chave privada para uma instalação limpa 2017-11-26 18:26:02 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve