Existem inúmeras formas de obter informação sobre a memória instalada em sistemas Linux e ver quanta dessa memória está a ser utilizada. Alguns comandos fornecem uma quantidade avassaladora de detalhes, enquanto outros fornecem respostas sucintas, embora não necessariamente fáceis de digerir. Neste post, veremos algumas das ferramentas mais úteis para verificar a memória e a sua utilização.
Antes de entrarmos nos detalhes, no entanto, vamos rever algumas noções básicas. A memória física e a memória virtual não são a mesma coisa. Esta última inclui espaço em disco configurado para ser utilizado como swap. A troca pode incluir partições reservadas para esta utilização ou ficheiros que são criados para adicionar ao espaço swap disponível ao criar uma nova partição pode não ser prático. Alguns comandos Linux fornecem informação sobre ambos.
Swap expande a memória fornecendo espaço em disco que pode ser utilizado para alojar páginas inactivas que são movidas para o disco quando a memória física enche.
Um ficheiro que desempenha um papel na gestão da memória é o /proc/kcore. Este ficheiro parece um ficheiro normal (embora extremamente grande), mas não ocupa espaço em disco de todo. Em vez disso, é um ficheiro virtual como todos os ficheiros em /proc.
$ ls -l /proc/kcore-r--------. 1 root root 140737477881856 Jan 28 12:59 /proc/kcore
Interessantemente, os dois sistemas consultados abaixo não têm a mesma quantidade de memória instalada, contudo o tamanho do /proc/kcore é o mesmo em ambos. O primeiro destes dois sistemas tem 4 GB de memória instalada; o segundo tem 6 GB.
system1$ ls -l /proc/kcore-r--------. 1 root root 140737477881856 Jan 28 12:59 /proc/kcoresystem2$ ls -l /proc/kcore-r-------- 1 root root 140737477881856 Feb 5 13:00 /proc/kcore
Explicações que afirmam que o tamanho deste ficheiro representa a quantidade de memória virtual disponível (talvez mais 4K) não têm muito peso. Este número sugere que a memória virtual nestes sistemas é de 128 terabytes! Esse número parece representar a quantidade de memória que um sistema de 64 bits pode ser capaz de endereçar – não a quantidade disponível no sistema. Cálculos de que 128 terabytes e esse número, mais 4K parecem ser bastante fáceis de fazer na linha de comando:
$ expr 1024 \* 1024 \* 1024 \* 1024 \* 128140737488355328$ expr 1024 \* 1024 \* 1024 \* 1024 \* 128 + 4096140737488359424
Um outro comando mais amigo do ser humano para examinar a memória é o comando livre. Dá-lhe um relatório fácil de compreender sobre memória.
$ free total used free shared buff/cache availableMem: 6102476 812244 4090752 13112 1199480 4984140Swap: 2097148 0 2097148
Com a opção -g, free reporta os valores em gigabytes.
$ free -g total used free shared buff/cache availableMem: 5 0 3 0 1 4Swap: 1 0 1
Com a opção -t, free mostra os mesmos valores que mostra sem opções (não confunda -t com terabytes!) mas adicionando uma linha total no fundo da sua saída.
$ free -t total used free shared buff/cache availableMem: 6102476 812408 4090612 13112 1199456 4983984Swap: 2097148 0 2097148Total: 8199624 812408 6187760
E, claro, pode escolher usar ambas as opções.
$ free -tg total used free shared buff/cache availableMem: 5 0 3 0 1 4Swap: 1 0 1Total: 7 0 5
Pode ficar desapontado com este relatório se estiver a tentar responder à pergunta “Quanta RAM está instalada neste sistema? Este é o mesmo sistema mostrado no exemplo acima que foi descrito como tendo 6GB de RAM. Isso não significa que este relatório esteja errado, mas que é a visão do sistema da memória que tem à sua disposição.
O comando livre também fornece uma opção para actualizar a visualização a cada X segundos (10 no exemplo abaixo).
$ free -s 10 total used free shared buff/cache availableMem: 6102476 812280 4090704 13112 1199492 4984108Swap: 2097148 0 2097148 total used free shared buff/cache availableMem: 6102476 812260 4090712 13112 1199504 4984120Swap: 2097148 0 2097148
Com -l, o comando livre fornece uma utilização de memória alta e baixa.
$ free -l total used free shared buff/cache availableMem: 6102476 812376 4090588 13112 1199512 4984000Low: 6102476 2011888 4090588High: 0 0 0Swap: 2097148 0 2097148
Outra opção para olhar para a memória é o ficheiro /proc/meminfo. Tal como o /proc/kcore, este é um ficheiro virtual e um que dá um relatório útil mostrando quanta memória está instalada, livre e disponível. Claramente, gratuito e disponível não representam a mesma coisa. MemFree parece representar a RAM não utilizada. MemAvailable é uma estimativa de quanta memória está disponível para iniciar novas aplicações.
$ head -3 /proc/meminfoMemTotal: 6102476 kBMemFree: 4090596 kBMemAvailable: 4984040 kB
Se quiser ver apenas a memória total, pode usar um destes comandos:
$ awk '/MemTotal/ {print $2}' /proc/meminfo6102476$ grep MemTotal /proc/meminfoMemTotal: 6102476 kB
As entradas DirectMap dividem a informação sobre memória em categorias.
$ grep DirectMap /proc/meminfoDirectMap4k: 213568 kBDirectMap2M: 6076416 kB
DirectMap4k representa a quantidade de memória a ser mapeada para páginas padrão de 4k, enquanto DirectMap2M mostra a quantidade de memória a ser mapeada para páginas de 2MB.
O comando getconf é aquele que fornecerá um pouco mais de informação do que a maioria de nós quer contemplar.
$ getconf -a | moreLINK_MAX 65000_POSIX_LINK_MAX 65000MAX_CANON 255_POSIX_MAX_CANON 255MAX_INPUT 255_POSIX_MAX_INPUT 255NAME_MAX 255_POSIX_NAME_MAX 255PATH_MAX 4096_POSIX_PATH_MAX 4096PIPE_BUF 4096_POSIX_PIPE_BUF 4096SOCK_MAXBUF_POSIX_ASYNC_IO_POSIX_CHOWN_RESTRICTED 1_POSIX_NO_TRUNC 1_POSIX_PRIO_IO_POSIX_SYNC_IO_POSIX_VDISABLE 0ARG_MAX 2097152ATEXIT_MAX 2147483647CHAR_BIT 8CHAR_MAX 127--More--
P>Pare essa saída para algo específico com um comando como o mostrado abaixo, e obterá o mesmo tipo de informação fornecida por alguns dos comandos acima.
$ getconf -a | grep PAGES | awk 'BEGIN {total = 1} {if (NR == 1 || NR == 3) total *=$NF} END {print total / 1024" kB"}'6102476 kB
Este comando calcula a memória multiplicando os valores na primeira e última linhas de saída como este:
PAGESIZE 4096 <==_AVPHYS_PAGES 1022511_PHYS_PAGES 1525619 <==
Calculando isso independentemente, podemos ver como esse valor é derivado.
$ expr 4096 \* 1525619 / 10246102476
P>Esse é claramente um daqueles comandos que merece ser transformado num alias!
Outro comando com saída muito digerível está no topo. Nas primeiras cinco linhas de saída do top, verá alguns números que mostram como a memória está a ser utilizada.
$ toptop - 15:36:38 up 8 days, 2:37, 2 users, load average: 0.00, 0.00, 0.00Tasks: 266 total, 1 running, 265 sleeping, 0 stopped, 0 zombie%Cpu(s): 0.2 us, 0.4 sy, 0.0 ni, 99.4 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 stMiB Mem : 3244.8 total, 377.9 free, 1826.2 used, 1040.7 buff/cacheMiB Swap: 3536.0 total, 3535.7 free, 0.3 used. 1126.1 avail Mem
E finalmente um comando que irá responder à pergunta “Então, quanto RAM está instalado neste sistema?” de uma forma sucinta:
$ sudo dmidecode -t 17 | grep "Size.*MB" | awk '{s+=$2} END {print s / 1024 "GB"}'6GB
Dependente de quanto detalhe quer ver, os sistemas Linux fornecem muitas opções para ver quanta memória está instalada nos seus sistemas e quanto é utilizada e disponível.