Mão na massa · ~70 min
Chamadas de sistema e contêiner x máquina virtual
Hoje você vê, na tela, as chamadas de sistema que um programa faz por baixo dos panos — e compara na prática o que muda entre rodar algo numa máquina virtual e num contêiner Docker.
Passo 1 de 6
Confirmando que o strace está disponível
strace "escuta" cada chamada de sistema que um programa faz e imprime na tela — é a ferramenta que transforma a teoria de hoje em algo visível.strace -VO que é
Pergunta ao sistema qual versão do strace está instalada, sem rodar nada de verdade ainda.
Por que importa
Confirma que a ferramenta existe antes de você depender dela nos próximos passos.
$ strace -V strace -- version 6.6
um número de versão na tela. Se aparecer "comando não encontrado", vá direto pra dica abaixo.
Comando não encontrado
Instale com sudo apt update && sudo apt install strace. Precisa de internet na VM — se estiver sem rede, avise o professor.
Passo 2 de 6
Sua primeira chamada de sistema visível
strace na frente — ele intercepta e imprime cada syscall antes de deixar o comando original seguir.strace lsO que é
strace executa o comando que vem depois (aqui, ls) e imprime, linha a linha, cada chamada de sistema feita.
Por que importa
É a prova de que mesmo um comando "simples" como listar arquivos depende de várias idas ao núcleo.
$ strace ls execve("/usr/bin/ls", ["ls"], 0x7ffd...) = 0 openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY) = 3 openat(AT_FDCWD, ".", O_RDONLY|O_DIRECTORY) = 3 getdents64(3, /* 7 entries */, 32768) = 208 write(1, "arquivo1.txt pasta\\n", 21) = 21 arquivo1.txt pasta close(3) = 0 exit_group(0) = ?
várias linhas técnicas antes da saída normal do ls aparecer no meio. Procure as chamadas destacadas: execve (inicia o programa), openat (abre algo), getdents64 (lê o conteúdo de um diretório) e write (escreve o resultado na tela).
Muita informação na tela, difícil de ler
Normal — strace imprime tudo por padrão. No próximo passo você vai usar uma versão resumida.
Passo 3 de 6
O resumo por tipo de chamada
strace -c cat Roteiro-Aluno_Encontro-03.htmlO que é
A flag -c troca o log linha a linha por uma tabela-resumo: chamada, quantas vezes, tempo gasto.
Por que importa
É assim que, na vida real, alguém investiga qual chamada de sistema está consumindo mais tempo num programa lento.
$ strace -c cat Roteiro-Aluno_Encontro-03.html > /dev/null % time seconds usecs/call calls syscall ------ ----------- ----------- --------- ---------------- 41.02 0.000089 8 11 read 28.35 0.000062 15 4 mmap 12.10 0.000026 26 1 openat ... ------ ----------- ----------- --------- ---------------- 100.00 0.000217 23 total
o arquivo pode não existir ainda no seu diretório — troque pelo nome de qualquer arquivo de texto que você tenha à mão. O importante é ver a coluna calls (quantas vezes) e syscall (qual chamada).
Passo 4 de 6
Comparando dois programas diferentes
strace -c dateO que é
Repita o resumo do passo anterior, mas agora com o comando date (que só imprime a data/hora atual).
Por que importa
date não lê diretório nenhum — então getdents64 não deve aparecer. Já clock_gettime deve aparecer, e não aparecia no ls.
uma lista de chamadas diferente do ls. Anote pelo menos uma chamada que aparece num programa e não no outro.
Não sei qual chamada procurar
Não precisa decorar nomes. Compare visualmente as duas tabelas de strace -c lado a lado e aponte qualquer linha que só existe em uma delas.
o que você percebeu comparando as chamadas de ls/cat com as de date?
0 / 40 caracteres
Passo 5 de 6
Cronometrando um contêiner
time docker run --rm alpine echo "ola do container"O que é
docker run sobe um contêiner baseado na imagem alpine (um Linux minúsculo), roda o echo e encerra. --rm descarta o contêiner ao final. time na frente cronometra tudo.
Por que importa
É a mesma ideia da máquina virtual — isolar um ambiente — só que sem carregar um núcleo novo. O tempo total mostra essa diferença na prática.
$ time docker run --rm alpine echo "ola do container" ola do container real 0m0.412s user 0m0.031s sys 0m0.028s
a linha real costuma ficar abaixo de 1 segundo (depois da primeira vez — a primeira execução baixa a imagem alpine da internet, o que demora mais). Rode de novo pra ver o tempo "aquecido".
Comando docker não encontrado ou "permission denied"
Confirme que o Docker foi instalado na Semana 0 com docker --version. Se der "permission denied", tente sudo docker run ... — significa que seu usuário ainda não está no grupo docker.
Passo 6 de 6
Comparando com a sua máquina virtual
Desligue e ligue a VM, cronometrando com o celularO que é
Desligue a VM do zero (não suspender — desligar) e cronometre do clique em "Iniciar" até a tela de login do Ubuntu aparecer.
Por que importa
É a comparação mais honesta possível entre "ligar um núcleo inteiro do zero" (VM) e "emprestar um pedaço do núcleo que já está rodando" (contêiner).
a VM deve levar pelo menos alguns segundos a dezenas de segundos — ordens de grandeza mais lenta que o contêiner do passo anterior. Essa diferença é o ponto central da comparação.
Não quero desligar a VM de verdade agora
Alternativa: compare a memória RAM reservada. Rode docker stats --no-stream num contêiner rodando e compare com os 4096 MB fixos que a VM reserva o tempo todo, ligada ou não fazendo nada.
o que mudou entre o tempo/recurso do contêiner e o da máquina virtual?
0 / 40 caracteres
livre: algo que te surpreendeu ou uma dúvida que sobrou de hoje
0 / 40 caracteres
Exemplo de observação forte × fraca
Observação fraca
"O container foi mais rápido que a VM."
Observação forte
"O container levou 0,4s pra rodar, a VM mais de 20s pra logar — bate com a teoria de que a VM precisa dar boot num núcleo inteiro, enquanto o container só usa namespaces do núcleo que já estava de pé."
Checklist final
- Rodei
strace lse identifiquei pelo menos 3 chamadas de sistema diferentes - Rodei
strace -cem dois programas diferentes e comparei os resumos - Cronometrei um contêiner com
time docker run - Comparei o tempo/recurso do contêiner com o da minha máquina virtual
- Preenchi as 3 observações acima (vou colar no quiz semanal)