Pergunta

Preciso traçar o perfil de desempenho de um aplicativo para o qual estou usando o strace.No entanto, eu realmente não sei como interpretar as várias chamadas de sistema que o strace emite.Exemplos de alguns deles estão abaixo:

(A) lseek(3, 1600, SEEK_SET)                = 1600
(B) write(3, "G_DATA    300        0          "..., 800) = 800
(C) close(3)                                = 0
(D) mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2b600b179000
(E) munmap(0x2b600b179000, 4096)            = 0
(F) fstat(3, {st_mode=S_IFREG|0644, st_size=1600, ...}) = 0

Eu ficaria grato se alguém pudesse explicar brevemente em inglês simples o que essas linhas de (A) a (F) realmente significam em termos de E / S, dados transferidos, importância no desempenho, etc.

Eu passei pelas páginas de manual do strace, mas ainda não estou muito confiante.Se você tiver outras dicas para eu ler, seria ótimo.

Tenho alguma experiência em sistemas operacionais e entendo o que são chamadas de sistema, memória, memória virtual, agendamento, etc.

Foi útil?

Solução

Para entendê-los, você deve se familiarizar com as chamadas de sistema POSIX. Eles são a interface que um programa de espaço do usuário usa para interagir com o kernel.

lseek, write, close, mmap, munmap e fstat são todos sistema e estão documentados na seção 2 do manual do Linux.

Resumidamente, lseek move o ponteiro interno do descritor de arquivo fornecido para o byte com a posição apontada pelo segundo argumento, começando com SEEK_SET (o início), SEEK_CUR (posição atual) ou SEEK_END (o final). Quaisquer chamadas read e write consecutivas no mesmo descritor iniciarão sua ação a partir desta posição. Observe que lseek não é implementado para todos os tipos de descritores - faz sentido para um arquivo no disco, mas não para um socket ou pipe.

write copia o buffer fornecido para o espaço do kernel e retorna o número de bytes realmente escritos. Dependendo do tipo de descritor, o kernel pode gravar os dados no disco ou enviá-los pela rede. Esta é geralmente uma operação cara porque envolve a transferência desse buffer para o kernel.

close fecha o descritor fornecido e quaisquer recursos associados a ele no kernel são liberados. Observe que cada processo tem um limite no número de descritores abertos simultaneamente, por isso às vezes é necessário fechar os descritores para não atingir esse limite.

mmap é uma chamada de sistema complexa e é usada para muitos propósitos, incluindo memória compartilhada. O uso geral, entretanto, é alocar mais memória para o processo. As funções da biblioteca malloc e calloc geralmente as usam internamente.

munmap libera a memória ativada por mmap.

fstat retorna várias informações que o sistema de arquivos mantém sobre um arquivo - tamanho, última modificação, permissões, etc.

Outras dicas

Para cada comando há uma página de manual, você pode lê-la digitando man e o nome da função C, por exemplo, man lseek (verifique também apropos). Eles também têm a descrição dos parâmetros passados.

Aqui estão alguns resumos:

  • lseek - reposicionar o deslocamento de leitura / gravação de arquivo do descritor de arquivo
  • write - grava em um descritor de arquivo do buffer
  • close - exclua um descritor da tabela de referência de objeto por processo
  • mmap - alocar memória ou mapear arquivos ou dispositivos na memória
  • munmap - remove um mapeamento para o intervalo de endereços especificado
  • fstat - obter o status do arquivo apontado pelo caminho

Observe que a interpretação de escalas simples / aleatórias não será significativa em termos de desempenho. Para testar a significância no desempenho dessas syscalls, você deve usar o parâmetro -c, que pode contar o tempo, chamadas e erros para cada syscall e relatar o resumo. Depois, você pode ler mais sobre os que estão demorando mais.

Para saber mais sobre os parâmetros de saída e strace, verifique man strace .

Veja também: Como analisar strace no shell em texto simples?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top