18 de março de 2021 • 5 min de leitura
Passos para um troubleshooting eficaz
Troubleshooting nada mais é do que seguir uma logica de análise para resolução de um problema especifico.
Não precisamos de desespero na hora que nos depararmos com um problema, a última coisa que queremos é sair correndo atrás de ajuda sem nem entender o que se passa, antes de começar uma análise de troubleshooting é interessante partirmos de alguns princípios básicos:
- Entenda o problema e o serviço/aplicação
- Interprete e reproduza
- Leia os logs
Seguindo esse fluxo, a compreensão e resolução dos problemas serão sempre muito simples.
Conheça o serviço
Entenda como o serviço ou aplicação funciona, saiba onde ela armazena os seus logs, utilizaremos o serviço SSH durante os exemplos.
O serviço SSH loga a maior parte das informações de acesso ou erro dentro do arquivo /var/log/secure
dessa forma podemos filtrar os erros dependendo do horário da ocorrência. Ainda sobre análise do problema, é possível realizar um teste de conexão com a opção verbose do ssh-client ativa, para isso basta adicionar a diretiva -v
com o comando ssh:
ssh -v -i chave.pub [email protected]
Dessa forma podemos analisar todo o processo que ocorre durante uma conexão SSH, com isso conseguimos obter informações sobre todo o fluxo da sessão SSH. No momento que você entende realmente o problema, tudo fica mais fácil.
Ferramentas para análise troubleshooting
Systemctl
Com o systemctl podemos observar o status dos serviços, com isso podemos ligar, parar e reinicia-los
systemctl status sshd
systemctl restart sshd
Journalctl
Ele coleta e armazena dados de registro mantendo diários indexados estruturados com base nas informações de registro recebidas do kernel. Por padrão o serviço do jornal é ativo, mas você pode validar essa informação checando o seu status utilizando o systemctl:
systemctl status systemd-journald
Por padrão, o diário armazena os dados de registro em /run/log/journal/
. Como o diretório /run/
é volátil, os dados de registro são perdidos na reinicialização. Para torná-los persistentes, deve haver um diretório /var/log/journal/
com propriedade e permissões para o serviço journald armazenar os logs. O systemd criará o diretório para você (e mudará o registro para persistente), se você fizer o seguinte:
- Como root, abra o
/etc/systemd/journald.conf
- Remova o comentário da linha com
Storage=
e mude-a paraStorage=persistent
- Grave o arquivo e reinicie o systemd-journald
Com o journalctl conseguimos obter informações sobre erros na grande maioria dos serviços, costumo utilizar bastante o comando da seguinte forma :
journalctl -xe | grep SERVICO
as opções -xe
vão nos retornar algumas informações relevantes para tratarmos os problemas, o -e
irá retornar as ultimas linhas do arquivo de journal, a opção -x
adiciona textos de ajuda que podem explicar o contexto de um erro ou evento de log. Algumas vezes contem mais informações que o log do próprio serviço.
Comandos úteis
Temos alguns comandos que podem ser úteis durante a análise e identificação de problemas, abordaremos alguns contextos e os comandos que podem ser utilizados para análise.
Problema com espaço em disco
Nesse cenário temos os comandos df -h
, du -h --max-depth=1.
e o ncdu
. Ambos os comandos vão nos retornar informações referente a utilização de disco do servidor.
df
Com o comando df
podemos ter uma visualização sobre o consumo geral de disco e partições, nada muito detalhado, apenas % de utilização. Um df -i mostra o numero de inodes livres tbm:
df -i
Filesystem Inodes IUsed IFree IUse% Mounted on
overlay 3907584 415188 3492396 11% /
tmpfs 254908 17 254891 1% /dev
tmpfs 254908 15 254893 1% /sys/fs/cgroup
shm 254908 1 254907 1% /dev/shm
/dev/vda1 3907584 415188 3492396 11% /etc/hosts
tmpfs 254908 1 254907 1% /proc/acpi
tmpfs 254908 1 254907 1% /sys/firmware
du
Com o comando du
começamos a ter mais informações, passamos a ter informações como tamanho de diretórios e arquivos.
ncdu
Assim como o du
o ncdu
informa a utilização de disco por diretório e arquivos, o seu diferencial é a disponibilização de uma interface que permite a navegação dentro dos diretórios e interação com os mesmos, podendo deletar arquivos por exemplo.
iotop
O iotop
é utilizado em cenários que precisamos saber qual processo esta com maior utilização dos discos do sistema.
Overload e Memória
Para análise de utilização de cpu podemos utilizar o comando pidstat, top, htop e free.
pidstat
O pidstat é uma ferramenta de monitoramento, que torna possível acompanhar cada processo individualmente no Linux. já abordamos a sua utilização em uma publicação dedicada inteiramente a ele.
top e htop
Esses comandos servem para analisar através de métricas a utilização de recursos por processo, por exemplo consumo de CPU, Ḿemória, IO direcionado por processo.
free
O comando free permite verificarmos quanto de memória encontra-se alocada pelo sistema e seus processos.
dmesg
O comando mostra alguns logs uteis do sistema. Legal para procurar por erros de processos ou estouros de memória. Coisas importantes:
dmesg | grep -i segfault
dmesg | grep -i oom
dmesg | grep -i Killed
dmesg | grep -i error
Um exemplo de log de erro do dmesg:
[1880957.563150] perl invoked oom-killer: gfp_mask=0x280da, order=0, oom_score_adj=0
[...]
[1880957.563400] Out of memory: Kill process 18694 (perl) score 246 or sacrifice child
[1880957.563408] Killed process 18694 (perl) total-vm:1972392kB, anon-rss:1953348kB, file-rss:0kB
[2320864.954447] TCP: Possible SYN flooding on port 7001. Dropping request. Check SNMP counters.
strace
Provavelmente a partir desse ponto você já deve saber o processo que mais esta causando problemas e agora precisamos investiga-lo melhor.
O strace mostra as chamadas para sistema que aquele processo esta fazendo e pode dar uma luz sobre o que mais pode estar dando problemas.
strace -p <PID>
ou
strace <comando>
O strace -c
gera um sumario da utilização de um processo:
strace -c ls
test.cfg nohup.out original.cfg
% time seconds usecs/call calls errors syscall
------ ----------- ----------- --------- --------- ----------------
16,57 0,000084 4 18 mprotect
15,78 0,000080 2 28 mmap
8,88 0,000045 4 11 open
7,89 0,000040 4 10 read
7,89 0,000040 2 14 close
7,69 0,000039 13 3 munmap
5,92 0,000030 15 2 getdents
5,72 0,000029 2 12 fstat
4,73 0,000024 12 2 2 statfs
2,37 0,000012 6 2 ioctl
2,17 0,000011 11 1 write
2,17 0,000011 5 2 1 access
1,97 0,000010 10 1 1 stat
1,97 0,000010 3 3 brk
1,78 0,000009 4 2 rt_sigaction
1,78 0,000009 9 1 openat
0,99 0,000005 5 1 getrlimit
0,99 0,000005 5 1 arch_prctl
0,99 0,000005 5 1 set_tid_address
0,99 0,000005 5 1 set_robust_list
0,79 0,000004 4 1 rt_sigprocmask
0,00 0,000000 0 1 execve
------ ----------- ----------- --------- --------- ----------------
100.00 0,000507 118 4 total
Comunicação
É comum que em determinados momentos precisemos analisar a comunicação do nosso servidor com serviços ou aplicações externos, para isso podemos contar com os comandos telnet e curl
telnet
Com o telnet conseguimos validar a comunicação com as portas no target, por exemplos, podemos verificar se existe resposta em alguma porta no ambiente de destino:
telnet 192.168.0.4 22
telnet 192.168.0.4 80
telnet 192.168.0.4 25
curl
Com o curl podemos verificar algumas chamadas web, enviar tanto GET
como POST
para os ambientes externos, para analisar se o nosso ambiente tem comunicação com os urls de destino, podemos apenas executar um curl
e verificar o seu retorno:
curl -I https://thiagoalexandria.com.br
Bom pessoal, é isso. Existem diversos outros comandos que podem ser utilizados dependendo do cenário em que se encontra. Espero que tenham curtido, pois entender um problema e saber como analisa-lo é algo que precisa estar enraizado na nossa rotina, precisamos conhecer bem o nosso ambiente e como ele se comporta.
Até a próxima!