Diferença entre RSS e VSZ
Quanto de memória um processo está consumindo? R: Depende!
Uma dúvida que é muito recorrente quando se estuda gerenciamento de processos no Linux é como determinar a quantidade de memória utilizada por um processo. Especialmente a diferença entre os valores RSS e VSZ.
RSS é a sigla para Resident Set Size. VSZ é a Virtual Memory Size.
RSS indica a quantidade de bytes realmente utilizados pelo processo, ou seja, a memória ocupada na RAM. O VSZ é a quantidade de memória virtual consumida pelo processo (que na maioria dos casos é sempre maior que RSS).
Verifique a quantidade de memória usada pela instância do bash corrente:
$ ps -o rss,vsz,cmd -p $$
RSS VSZ CMD
3180 116304 bashA grande dúvida que surge é a seguinte: Se a VSZ é maior que a RSS, onde estes bytes excedentes estão armazenados? No swap? Não!
Uma das grandes sacadas da memória virtual é permitir que os processos “achem” que estão reservando espaço na memória real, sendo que na realidade não estão.
A memória alocada pela função malloc(), por exemplo, não afeta a RSS enquanto nada for escrito na memória reservada.
Para ilustrar melhor, vamos a estes códigos de exemplo:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>int main(void)
{
pid_t pid;
char command[30]; pid = getpid();
printf(" Estado inicial:\n");
snprintf(command, 30, "ps -o rss,vsz,cmd -p %d", pid);
system(command);
sleep(5); puts("\n Reservando 1MiB de memória...\n");
char *p = malloc(1048576);
sleep(5); snprintf(command, 30, "ps -o rss,vsz,cmd -p %d", pid);
system(command);
sleep(5); puts("\n Limpando memória reservada...\n");
free(p); snprintf(command, 30, "ps -o rss,vsz,cmd -p %d", pid);
system(command); puts(""); return 0;
}
Compile com:
$ gcc virtual_memory_size.c -o virtual_memory_sizeAo executá-lo, observe como o valor VSZ aumenta e o RSS permanece:
Estado inicial: RSS VSZ CMD
344 4160 ./virtual_memory_size Reservando 1MiB de memória... RSS VSZ CMD
344 5188 ./virtual_memory_size Limpando memória reservada... RSS VSZ CMD
512 4160 ./virtual_memory_size
Curiosidade: criando seu próprio TOP para processos que mais estão consumindo memória:
$ watch -n1 -e 'ps -axo rss,vsz,cmd --sort=-rss | head -10'