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;