Domine o `vmstat`: Desvende os Segredos da Memória Virtual do seu Linux

O seu computador, seja ele Linux ou macOS, utiliza um mecanismo de memória virtual. Vamos explorar como esse recurso influencia o uso da memória física, CPU e disco rígido do seu sistema.

O que significa Memória Virtual?

Todo computador possui uma quantidade específica de memória física, também conhecida como memória de acesso aleatório (RAM). A gestão eficiente dessa RAM é crucial, cabendo ao kernel distribuí-la entre o sistema operacional e os aplicativos em execução. Mas o que ocorre quando a demanda combinada por memória excede a capacidade física da RAM?

Sistemas operacionais como Linux e macOS utilizam um truque engenhoso: reservam espaço no disco rígido para auxiliar na gestão da memória. Essa área, denominada “espaço de troca” ou “swap”, funciona como uma extensão da RAM, constituindo o que chamamos de memória virtual.

O kernel do Linux tem a capacidade de transferir blocos de memória da RAM para o espaço de troca, liberando assim espaço na RAM para outros processos. Os dados “trocados” ou “paginados” são então recuperados do espaço de troca e reintroduzidos na RAM quando necessários.

É importante notar que o acesso à memória paginada é consideravelmente mais lento do que o acesso à RAM. Além disso, o uso da memória virtual impõe uma carga adicional sobre outros componentes do computador.

O disco rígido precisa realizar mais operações de leitura e gravação, enquanto o kernel, e por consequência a CPU, precisam trabalhar mais para gerenciar as trocas de memória e atender às necessidades dos diversos processos.

Para monitorar toda essa atividade, o Linux oferece o comando `vmstat`, que exibe estatísticas da memória virtual.

O Comando `vmstat`

Ao executar `vmstat` sem parâmetros, o comando apresenta uma série de valores. Esses valores representam as médias de cada estatística desde a última inicialização do computador, e não um retrato instantâneo dos valores atuais.

vmstat

Uma tabela concisa de valores será exibida:

As colunas são rotuladas como “Procs”, “Memory”, “Swap”, “IO”, “System” e “CPU”, com a última coluna (à direita) contendo os dados da CPU.

A seguir, a descrição dos dados presentes em cada coluna:

Proc

r: Número de processos executáveis, ou seja, aqueles que foram iniciados e estão em execução ou aguardando o próximo período de tempo da CPU.
b: Número de processos em hibernação ininterrupta, geralmente drivers de dispositivos aguardando a liberação de recursos.

Memória

swpd: Quantidade de memória virtual em uso (memória trocada).
livre: Quantidade de memória livre (não utilizada).
buff: Quantidade de memória utilizada como buffers.
cache: Quantidade de memória utilizada como cache.

Swap

si: Quantidade de memória virtual transferida do espaço de troca.
so: Quantidade de memória virtual transferida para o espaço de troca.

IO

bi: Blocos recebidos de um dispositivo de bloco (memória virtual trocada de volta para a RAM).
bo: Blocos enviados para um dispositivo de bloco (memória virtual trocada da RAM para o espaço de troca).

Sistema

in: Número de interrupções por segundo, incluindo o relógio.
cs: Número de mudanças de contexto por segundo (quando o kernel alterna entre o modo de sistema e o modo de usuário).

CPU

Todos esses valores representam porcentagens do tempo total da CPU.

us: Tempo gasto executando código não kernel (tempo de usuário e tempo “nice”).
sy: Tempo gasto executando o código do kernel.
id: Tempo gasto ocioso.
wa: Tempo gasto aguardando por operações de entrada ou saída.
st: Tempo roubado de uma máquina virtual (tempo que a máquina virtual espera enquanto o hipervisor gerencia outras VMs).

Atualizações em Tempo Real

O `vmstat` pode fornecer atualizações periódicas dos valores usando um parâmetro de atraso (em segundos). Para atualizações a cada cinco segundos, use:

vmstat 5

A cada cinco segundos, o `vmstat` adicionará uma nova linha de dados à tabela. Para interromper, pressione Ctrl + C.

Limitando as Atualizações

Para evitar sobrecarregar o sistema com atualizações frequentes, use um valor de contagem juntamente com o valor de atraso. O valor de contagem indica quantas atualizações devem ser exibidas antes do `vmstat` retornar ao prompt de comando.

Para obter quatro atualizações, a cada cinco segundos, execute:

vmstat 5 4

Após quatro atualizações, o `vmstat` será encerrado automaticamente.

Alterando as Unidades

É possível exibir a memória e as estatísticas de troca em kilobytes (K) ou megabytes (M) usando a opção `-S` (unidade-caractere), seguida por `k`, `K`, `m` ou `M`, que representam:

k: 1000 bytes
K: 1024 bytes
m: 1000000 bytes
M: 1048576 bytes

Para atualizar as estatísticas a cada 10 segundos, exibindo a memória e a troca em megabytes, use:

vmstat 10 -S M

Note que a opção `-S` não afeta as estatísticas de bloco IO, que são sempre exibidas em blocos.

Memória Ativa e Inativa

A opção `-a` (ativo) substitui as colunas “buff” e “cache” pelas colunas “inativo” e “ativo”, que mostram a quantidade de memória em uso e não em uso.

Para visualizar as colunas de memória ativa e inativa, utilize:

vmstat 5 -a -S M

As colunas “inativo” e “ativo” também são influenciadas pela opção `-S`.

Forks

A opção `-f` exibe o número de “forks” (criações de processos) que ocorreram desde a inicialização do computador. Cada processo iniciado a partir da linha de comando, ou cada vez que uma tarefa clona uma nova tarefa, aumenta esse número.

vmstat -f

O visor de forks não é atualizado dinamicamente.

Informações Detalhadas sobre a Memória do Kernel

O kernel também gerencia sua própria memória, alocando e desalocando continuamente para diferentes tipos de dados. Para otimizar esse processo, o kernel usa um sistema de “lajes” (slabs), que funcionam como um sistema de caching.

A memória alocada e não mais necessária para um tipo específico de objeto do kernel pode ser reutilizada para outro objeto do mesmo tipo, sem que a memória precise ser desalocada e realocada, o que economiza tempo de processamento.

Para visualizar as estatísticas das lajes, use a opção `-m` (lajes) com `sudo`, e canalize a saída para `less` devido à grande quantidade de informações:

sudo vmstat -m | less

A saída possui as seguintes colunas:

  • Cache: Nome do cache.
  • num: Número de objetos ativos no cache.
  • total: Número total de objetos disponíveis no cache.
  • size: Tamanho de cada objeto no cache.
  • páginas: Número total de páginas de memória com objetos associados ao cache.

Pressione `q` para sair do `less`.

Contadores de Eventos e Estatísticas de Memória

Para visualizar contadores de eventos e estatísticas de memória, utilize a opção `-s` (estatísticas):

vmstat -s

As estatísticas exibidas são similares às informações na saída padrão, mas algumas são apresentadas com maior detalhe. Por exemplo, o tempo de CPU do usuário é dividido entre tempo “nice” e tempo não “nice”.

Estatísticas de Disco

Para visualizar estatísticas de disco, use a opção `-d` (disco), também canalizada para `less`:

vmstat -d | less

As informações são exibidas em três colunas: “Leituras”, “Gravações” e “E/S”.

A coluna “sec” em “IO” é medida em segundos, enquanto as estatísticas de tempo nas colunas de leitura e gravação são medidas em milissegundos.

O significado das colunas é:

Leituras

  • total: Contagem total de leituras do disco.
  • mesclado: Contagem total de leituras agrupadas.
  • setores: Contagem total de setores lidos.
  • ms: Tempo total em milissegundos usado para ler dados do disco.

Gravações

  • total: Contagem total de gravações no disco.
  • mesclado: Contagem total de gravações agrupadas.
  • setores: Contagem total de setores gravados.
  • ms: Tempo total em milissegundos usado para gravar dados no disco.

IO

  • cur: Número atual de leituras ou gravações no disco.
  • sec: Tempo gasto em segundos com as operações de leitura ou gravação em andamento.

Estatísticas Resumidas de Disco

Para visualizar um resumo rápido da atividade do disco, utilize a opção `-D` (soma do disco):

vmstat -D

O número de discos listados pode parecer excessivo. Em sistemas como Ubuntu, cada aplicativo instalado via Snap cria um sistema de arquivos `squashfs` montado como um dispositivo `/dev/loop`. Esses dispositivos são erroneamente contabilizados como discos rígidos.

Estatísticas de Partição

Para visualizar estatísticas de uma partição específica, use a opção `-p` (partição) seguida pelo identificador da partição. Exemplo com a partição `sda1`:

vmstat -p sda1

As informações exibidas mostram a contagem total de leituras e gravações de disco na partição, bem como o número de setores envolvidos nessas operações.

Visão Geral do Funcionamento Interno

É sempre valioso entender o que acontece nos bastidores do seu computador. O comando `vmstat` oferece uma janela para essa compreensão. Agora, você tem o conhecimento necessário para utilizá-lo e interpretar as informações que ele fornece, tornando-se um recurso valioso para diagnósticos e solução de problemas.