Limitar uso de memória de um usuário ou grupo sem programas adicionais

The Limit

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;