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.