Articles

Mundo Booleano

O comando top permite aos utilizadores monitorizar processos e utilização de recursos do sistema no Linux. É uma das ferramentas mais úteis na caixa de ferramentas de um administrador de sistema, e vem pré-instalada em cada distribuição. Ao contrário de outros comandos tais como ps, é interactivo, e pode navegar através da lista de processos, matar um processo, e assim por diante.

Neste artigo, vamos compreender como utilizar o comando top.

A começar

Como já deve ter adivinhado, basta digitar isto para lançar o comando top:

top

Isto inicia uma aplicação de linha de comando interactiva, semelhante à que se encontra na imagem de ecrã abaixo. A metade superior da saída contém estatísticas sobre processos e utilização de recursos, enquanto que a metade inferior contém uma lista dos processos actualmente em execução. Pode utilizar as teclas de setas e as teclas Page Up/Down para navegar através da lista. Se quiser sair, basta premir “q”.

Existem várias variantes de topo, mas no resto deste artigo, falaremos da variante mais comum – a que vem com o pacote “procps-ng”. Pode verificar isto executando:

top -v

Se tiver esta variante, esta aparecerá na saída, como assim:

procps-ng version 3.3.10

Existe bastante na interface do topo, por isso iremos decompô-la pouco a pouco na secção seguinte.

Interface do topo: a área de resumo

Como vimos anteriormente, a saída do topo é dividida em duas secções diferentes. Nesta parte do artigo, vamos focar os elementos em metade da produção. Esta região é também chamada “área de resumo”.

Tempo do sistema, tempo de funcionamento e sessões do utilizador

Na parte superior esquerda do ecrã (como marcado na imagem acima), o topo mostra a hora actual. Segue-se a hora de funcionamento do sistema, que nos indica a hora em que o sistema tem estado a funcionar. Por exemplo, no nosso exemplo, a hora actual é “15:39:37”, e o sistema está a funcionar há 90 dias, 15 horas e 26 minutos.

P>Próximo vem o número de sessões de utilizadores activos. Neste exemplo, há duas sessões de utilizadores activos. Estas sessões podem ser feitas ou num TTY (fisicamente no sistema, quer através da linha de comando ou de um ambiente de trabalho) ou num PTY (tal como uma janela de emulador de terminal ou sobre SSH). De facto, se entrar num sistema Linux através de um ambiente de desktop, e depois iniciar um emulador de terminal, encontrará duas sessões activas.

Se quiser obter mais detalhes sobre as sessões de utilizador activo, use o comando who.

Utilização de memória

>br>

A secção “memória” mostra informações relativas à utilização de memória do sistema. As linhas marcadas “Mem” e “Swap” mostram informações sobre RAM e espaço swap, respectivamente. Simplificando, um espaço swap é uma parte do disco rígido que é utilizado como RAM. Quando a utilização da RAM fica quase cheia, as regiões raramente utilizadas da RAM são escritas no espaço swap, prontas para serem recuperadas mais tarde, quando necessário. No entanto, como o acesso aos discos é lento, confiar demasiado na troca pode prejudicar o desempenho do sistema.

Como seria de esperar, os valores “total”, “livre” e “usado” têm os seus significados habituais. O valor “avail mem” é a quantidade de memória que pode ser atribuída a processos sem causar mais trocas.

O kernel Linux também tenta reduzir os tempos de acesso ao disco de várias maneiras. Mantém uma “cache de disco” na RAM, onde são armazenadas regiões do disco frequentemente utilizadas. Além disso, as gravações do disco são armazenadas num “buffer de disco”, e o kernel acaba por gravá-las no disco. A memória total consumida por eles é o valor “buff/cache”. Pode parecer uma coisa má, mas realmente não é – a memória utilizada pela cache será atribuída a processos se necessário.

Tasks

A secção “Tarefas” mostra estatísticas relativas aos processos em execução no seu sistema. O valor “total” é simplesmente o número total de processos. Por exemplo, na imagem de ecrã acima, há 27 processos em execução. Para compreender o resto dos valores, precisamos de um pouco de background sobre como o kernel Linux lida com processos.

Processos executam uma mistura de trabalho I/O-bound (como a leitura de discos) e trabalho CPU-bound (como a execução de operações aritméticas). A CPU fica inactiva quando um processo executa E/S, pelo que os SOs passam a executar outros processos durante este tempo. Além disso, o SO permite que um determinado processo seja executado durante um período de tempo muito pequeno, e depois muda para outro processo. É assim que os SOs aparecem como se fossem “multitarefas”. Fazer tudo isto exige que nos mantenhamos a par do “estado” de um processo. No Linux, um processo pode estar nestes estados:

  • Runnable (R): Um processo neste estado ou é executado na CPU, ou está presente na fila de execução, pronto para ser executado.
  • Interruptible sleep (S): Os processos neste estado estão à espera de um evento para completar.
  • Sono ininterrupto (D): Neste caso, um processo está à espera que uma operação de E/S seja concluída.
  • Stopped (T): Estes processos foram interrompidos por um sinal de controlo de trabalho (tal como pressionando Ctrl+Z) ou porque estão a ser rastreados.
  • Zombie (Z): O núcleo mantém várias estruturas de dados na memória para manter o registo dos processos. Um processo pode criar uma série de processos infantis, e estes podem sair enquanto o pai ainda está por perto. No entanto, estas estruturas de dados devem ser mantidas em redor até o pai obter o estado dos processos da criança. Estes processos terminados, cujas estruturas de dados ainda existem, são chamados zombies.

Processos nos estados D e S são mostrados em “a dormir”, e os do estado T são mostrados em “parados”. O número de zombies é mostrado como o valor “zombie”.

uso CPU

A secção de uso do CPU mostra a percentagem de tempo de CPU gasto em várias tarefas. O valor us é o tempo que a CPU gasta a executar processos no espaço do utilizador. Da mesma forma, o valor sy é o tempo gasto na execução de processos no kernelspace.

Linux utiliza um valor “nice” para determinar a prioridade de um processo. Um processo com um valor “nice” elevado é “mais agradável” para outros processos, e obtém uma prioridade baixa. Da mesma forma, os processos com um valor “nice” mais baixo recebem uma prioridade mais elevada. Como veremos mais adiante, o valor “nice” por defeito pode ser alterado. O tempo gasto na execução de processos com um “nice” definido manualmente aparece como o ni value.

Este é seguido por id, que é o tempo em que o CPU permanece inactivo. A maioria dos sistemas operativos coloca o CPU num modo de poupança de energia quando está inactivo. A seguir vem o valor wa, que é o tempo que o CPU passa à espera que a E/S seja concluída.

Interrupções são sinais para o processador sobre um evento que requer atenção imediata. As interrupções de hardware são tipicamente utilizadas pelos periféricos para informar o sistema sobre eventos, tais como um pressionamento de teclas num teclado. Por outro lado, as interrupções de software são geradas devido a instruções específicas executadas no processador. Em qualquer dos casos, o sistema operativo trata-as, e o tempo gasto no tratamento das interrupções de hardware e software é dado por hi e si respectivamente.

Num ambiente virtualizado, uma parte dos recursos da CPU é dada a cada máquina virtual (VM). O SO detecta quando tem trabalho a fazer, mas não os pode executar porque o CPU está ocupado noutra VM. O tempo perdido desta forma é o tempo de “roubo”, mostrado como st.

Percentagem média de carga

A secção média da carga representa a “carga” média durante um, cinco e quinze minutos. A “carga” é uma medida da quantidade de trabalho computacional que um sistema executa. No Linux, a carga é o número de processos nos estados de R e D em qualquer momento. O valor de “carga média” dá-lhe uma medida relativa de quanto tempo deve esperar para que as coisas sejam feitas.

Deixe-nos considerar alguns exemplos para compreender este conceito. Num sistema de núcleo único, uma média de carga de 0,4 significa que o sistema está a fazer apenas 40% do trabalho que pode fazer. Uma média de carga de 1 significa que o sistema está exactamente na sua capacidade – o sistema será sobrecarregado pela adição mesmo de um pouco de trabalho adicional. Um sistema com uma média de carga de 2,12 significa que está sobrecarregado com 112% mais trabalho do que pode fazer.

Num sistema com vários núcleos, deve primeiro dividir a média de carga com o número de núcleos de CPU para obter uma medida semelhante.

Além disso, “média de carga” não é na realidade a típica “média” que a maioria de nós conhece. Trata-se de uma “média móvel exponencial”, o que significa que uma pequena parte das médias de carga anteriores é factorada no valor actual. Se estiver interessado, este artigo cobre todos os detalhes técnicos.

Interface do topo de gama: a área de tarefa

A área de resumo é comparativamente mais simples, e contém uma lista de processos. Nesta secção, vamos aprender sobre as diferentes colunas mostradas na saída padrão do topo.

  • PID

Este é o ID do processo, um número inteiro positivo único que identifica um processo.

  • USER

Este é o nome de utilizador “efectivo” (que mapeia para um ID de utilizador) do utilizador que iniciou o processo. O Linux atribui um ID de utilizador real e um ID de utilizador efectivo aos processos; este último permite que um processo aja em nome de outro utilizador. (Por exemplo, um utilizador não root pode elevar-se à raiz para instalar um pacote.)

  • PR e NI

O campo “NI” mostra o valor “nice” de um processo. O campo “PR” mostra a prioridade de agendamento do processo a partir da perspectiva do kernel. O valor “nice” afecta a prioridade de um processo.

  • VIRT, RES, SHR e %MEM

Estes três campos estão relacionados com o consumo de memória dos processos. “VIRT” é a quantidade total de memória consumida por um processo. Isto inclui o código do programa, os dados armazenados pelo processo em memória, assim como quaisquer regiões de memória que tenham sido trocadas para o disco. “RES” é a memória consumida pelo processo na RAM, e “%MEM” expressa este valor como uma percentagem do total da RAM disponível. Finalmente, “SHR” é a quantidade de memória partilhada com outros processos.

  • S

Como já vimos anteriormente, um processo pode estar em vários estados. Este campo mostra o estado do processo na forma de letra única.

  • TIME+

Este é o tempo total de CPU utilizado pelo processo desde o seu início, preciso até aos centésimos de segundo.

  • COMMAND

A coluna COMANDO mostra o nome dos processos.

Exemplos de utilização de comandos Top

Até agora, discutimos sobre a interface do Top. No entanto, também pode gerir processos, e pode controlar vários aspectos da saída do top’s. Nesta secção, vamos pegar em alguns exemplos.

Na maioria dos exemplos abaixo, é necessário premir uma tecla enquanto o top está em execução. Tenha em mente que estas teclas são sensíveis a maiúsculas e minúsculas – por isso, se premir “k” enquanto o Caps Lock estiver ligado, na realidade premiu um “K”, e o comando não funcionará, ou fará algo completamente diferente.

Processos de matar

Se quiser matar um processo, basta premir “k” quando o topo estiver a correr. Isto fará surgir um prompt, que pedirá o ID do processo e prima enter.

Next, introduza o sinal usando o qual o processo deve ser morto. Se deixar este espaço em branco, o topo utiliza um SIGTERM, que permite que os processos terminem graciosamente. Se quiser matar um processo à força, pode digitar aqui SIGKILL. Também pode digitar aqui o número do sinal. Por exemplo, o número para SIGTERM é 15 e SIGKILL é 9.

Se deixar o ID do processo em branco e pressionar enter directamente, este terminará o processo mais alto da lista. Como já mencionámos anteriormente, pode percorrer usando as teclas de setas, e alterar o processo que pretende matar desta forma.

Selecionar a lista de processos

Uma das razões mais frequentes para usar uma ferramenta como o topo é descobrir qual o processo que está a consumir mais recursos. Pode premir as seguintes teclas para ordenar a lista:

  • ‘M’ para ordenar pelo uso da memória
  • ‘P’ para ordenar pelo uso da CPU
  • ‘N’ para ordenar pelo ID do processo
  • ‘T’ para ordenar pelo tempo de execução

Por defeito, o topo mostra todos os resultados por ordem decrescente. Contudo, pode mudar para ordem ascendente premindo ‘R’.

P>Pode também ordenar a lista com a tecla -o switch. Por exemplo, se quiser ordenar processos por utilização de CPU, pode fazê-lo com:

top -o %CPU

P>Pode ordenar a lista por qualquer um dos atributos na área de resumo da mesma forma.

Mostrar uma lista de tópicos em vez de processos

Já abordámos anteriormente a forma como o Linux alterna entre processos. Infelizmente, os processos não partilham memória ou outros recursos, tornando tais comutações bastante lentas. Linux, como muitos outros sistemas operativos, suporta uma alternativa “leve”, chamada “thread”. Fazem parte de um processo e partilham determinadas regiões de memória e outros recursos, mas podem ser executados simultaneamente como processos.

Por defeito, o topo mostra uma lista de processos na sua saída. Se, em vez disso, quiser listar os threads, prima “H” quando o topo estiver a correr. Repare que a linha “Tasks” diz “Threads” em vez disso, e mostra o número de threads em vez de processos.

P>Talvez tenha notado como nenhum dos atributos na lista de processos mudou. Como é que isso é possível, dado que os processos diferem dos fios? Dentro do núcleo do Linux, os threads e processos são tratados utilizando as mesmas estruturas de dados. Assim, cada thread tem a sua própria identificação, estado e assim por diante.

Se quiser voltar à visualização do processo, prima novamente ‘H’. Além disso, pode usar o -H mudar para exibir os threads por defeito.

top -H

Showing full paths

Por defeito, o topo não mostra o caminho completo para o programa, ou faz uma distinção entre processos de kernelspace e processos de userspace. Se precisar desta informação, prima ‘c’ enquanto o topo está a correr. Prima ‘c’ novamente para voltar ao padrão.

Processos de kernelspace são marcados com parênteses rectos à sua volta. Como exemplo, na imagem acima, há dois processos de kernel, kthreadd e khelper. Na maioria das instalações Linux, haverá normalmente mais algumas.

Alternativamente, pode também começar pelo topo com o -c argumento:

top -c

Vista de floresta

Às vezes, pode querer ver a hierarquia de processos criança-pai. Pode ver isto com a vista da floresta, premindo ‘v’/’V’ enquanto o topo está a correr.

Como pode ver pela imagem de ecrã acima, o processo systemd foi o primeiro a arrancar no sistema. Iniciou processos tais como sshd, que por sua vez criou outros processos sshd, e assim por diante.

Listar processos de um utilizador

Para listar processos de um determinado utilizador, prima ‘u’ quando o topo estiver a correr. Depois, digite o nome de utilizador, ou deixe-o em branco para mostrar processos para todos os utilizadores.

Alternativamente, pode executar o comando top com a tecla -u switch. Neste exemplo, listamos todos os processos do utilizador raiz.

Filtragem através de processos

Se tiver muitos processos para trabalhar, um simples tipo não funcionará suficientemente bem. Em tal situação, pode utilizar a filtragem de topo para se concentrar em alguns processos. Para activar este modo, prima ‘o’/’O’. Uma solicitação aparece dentro do topo, e pode digitar uma expressão de filtro aqui.

Uma expressão de filtro é uma declaração que especifica uma relação entre um atributo e um valor. Alguns exemplos de filtros são:

  • COMMAND=getty: Processos de filtragem que contêm “getty” no atributo COMMAND.
  • !COMMAND=getty: Processos de filtragem que não contenham “getty” no atributo COMANDO.
  • %CPU>3.0: Processos de filtragem que têm uma utilização de CPU superior a 3%.

Após ter adicionado um filtro, pode podar mais coisas adicionando mais filtros. Para limpar quaisquer filtros que tenha adicionado, prima ‘=’.

Mudar o aspecto padrão da CPU e das estatísticas da memória

Se estiver maioritariamente em casa num ambiente GUI, pode não gostar da forma padrão do topo para mostrar as estatísticas da CPU e da memória. Pode premir ‘t’ e ‘m’ para alterar o estilo das estatísticas da CPU e da memória. Aqui está uma imagem do topo, onde premimos ‘t’ e ‘m’ uma vez.

Se premir ‘t’ ou ‘m’ repetidamente, o ciclo passa por quatro vistas diferentes. Nas duas primeiras prensas, percorre dois tipos diferentes de barras de progresso. Se premir a tecla pela terceira vez, a barra de progresso é escondida. Se premir novamente a tecla, ela traz de volta os contadores padrão, baseados em texto.

Saving your settings

Se tiver feito quaisquer alterações à saída do topo, pode guardá-los para utilização posterior premindo ‘W’. top escreve a sua configuração no ficheiro .toprc no seu directório home.

Conclusion

O comando top é extremamente útil para monitorizar e gerir processos num sistema Linux. Este artigo apenas risca a superfície, e há bastante coisa que ainda não cobrimos. Por exemplo, há muito mais colunas que pode adicionar ao topo. Para tudo isto, não se esqueça de verificar a página de homem executando man top no seu sistema.

se gostou deste post, por favor partilhe-o 🙂

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *