Uma forma simples e nativa de controlar o uso de Memoria RAM por usuário ou grupo é usando o arquivo /etc/security/limits.conf
Note que esse arquivo é um canivete suiço, da pra limitar quantidade de logins, uso de cpu, memoria, processos simultâneos etc. porém aqui vamos abordar especificamente o uso da memoria ram.
Para aplicar o limite, basta inserir uma linha ao final deste arquivo na sintaxe abaixo:
Limitando um único usuário em 1Gb de ram:
usuario hard as 1024000
Para limitar um grupo:
@grupo hard as 1024000
Observações: Para grupo, o “@” faz parte da sintaxe e deve ser mantido. O limite de memória é em KB, para saber o valor exato, da pra jogar na busca do google “1 GB in Kb”
O melhor de tudo é que não precisa reiniciar e nem restartar nenhum serviço.
Para testar se está funcionando segue um fonte em C que pode ser sado para simular o uso de memória ram
/*
* xmalloc.c
*
* Just allocate a chunk of memory
* and make sure it gets written, so that
* the demand-paging mechanism of Linux actually
* has to find physical pages or swap for it
*
* Vangelis Koukis <[email protected]>
* July 2007
*/
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc, char *argv[])
{
char *p;
long i;
size_t n;
/* I'm too bored to do proper cmdline parsing */
if (argc != 2 || atol(argv[1]) <= 0 ) {
fprintf(stderr, "I'm bored... Give me the size of the memory chunk in KB\n");
return 1;
}
n = 1024 * atol(argv[1]);
if (! (p = malloc(n))) {
perror("malloc failed");
return 2;
}
/* Temp, just want to check malloc */
printf("Malloc was successful\n");
return 0;
/* Touch all of the buffer, to make sure it gets allocated */
for (i = 0; i < n; i++)
p[i] = 'A';
printf("Allocated and touched buffer, sleeping for 60 sec...\n");
sleep(60);
printf("Done!\n");
return 0;
}
Quando for limitar um usuário, temos que ter em mente que o próprio bash consome uma porção da memoria ram, então é normal que setando em 1Gb o programa retorne “erro ao alocar memoria” testando com, por exemplo, 990Mb;