Como criar um usuário com uso limitado de RAM?

34

Então eu tenho 4 GB de RAM + 4 GB de swap. Eu quero criar um usuário com ram limitado e swap: 3 GB de RAM e 1 GB de swap. Isso é possível? É possível iniciar aplicativos com RAM e swap limitados disponíveis para eles sem criar um usuário separado (e não instalar nenhum aplicativo especial - tendo apenas uma configuração de servidor Debian / CentOS padrão e não usando sudo)?

Atualização:

Então eu abri o terminal e digitei o comando ulimit : ulimit -v 1000000 , que será como 976,6Mb de limitação. Em seguida, chamei ulimit -a e vi que a limitação é "on". Então eu comecei um script bash que compila e inicia meu aplicativo em nohup , um longo nohup ./cloud-updater-linux.sh >& /dev/null & ... mas depois de algum tempo eu vi:

(o que seria ok se nenhuma limitação fosse aplicada - ele baixou alguma biblioteca grande e começou a compilá-la).

Mas pensei em aplicar limitações ao shell e a todos os processos iniciados com / a partir dele com ulimit -v 1000000 ? O que eu errei? Como fazer um terminal e todos os subprocessos iniciados por ele são limitados no uso de memória RAM?

    
por myWallJSON 16.03.2012 / 13:54

3 respostas

54

ulimit é feito para isso. Você pode configurar os padrões para ulimit em uma base por usuário ou por grupo em

/etc/security/limits.conf

ulimit -v KBYTES define o tamanho máximo da memória virtual. Eu não acho que você pode dar uma quantidade máxima de swap. É apenas um limite na quantidade de memória virtual que o usuário pode usar.

Então você limits.conf teria a linha (até um máximo de 4G de memória)

luser  hard  as   4000000

UPDATE - CGroups

Os limites impostos por ulimit e limits.conf são por processo. Eu definitivamente não estava claro sobre esse ponto.

Se você quiser limitar a quantidade total de memória que um usuário usa (que é o que você pediu). Você quer usar cgroups .

Em /etc/cgconfig.conf :

group memlimit {
    memory {
        memory.limit_in_bytes = 4294967296;
    }
}

Isso cria um cgroup que tem um limite máximo de memória de 4GiB.

Em /etc/cgrules.conf :

luser   memory   memlimit/

Isso fará com que todos os processos executados por luser sejam executados dentro dos memlimit cgroups criados em cgconfig.conf .

    
por 16.03.2012 / 14:09
3

Você não pode limitar o uso da memória no nível do usuário, o ulimit pode fazer isso, mas para um único processo.

Mesmo com o uso de limites por usuário em /etc/security/limits.conf , um usuário pode usar toda a memória executando vários processos.

Se você realmente quiser limitar os recursos, precisará usar uma ferramenta de gerenciamento de recursos, como rcapd usado por projetos e zonas no Solaris.

Há algo que parece fornecer recursos semelhantes no Linux que você pode investigar: cgroups .

    
por 17.03.2012 / 01:52
0

cgroups é o caminho certo para fazer isso, como outras respostas apontaram. Infelizmente, não há solução perfeita para o problema, como veremos abaixo. Há várias formas diferentes de definir limites de uso de memória do cgroup. Como alguém faz a sessão de login de um usuário automaticamente parte de um cgroup varia de sistema para sistema. Red Hat tem algumas ferramentas, e o mesmo acontece com systemd .

memory.memsw.limit_in_bytes e memory.limit_in_bytes definem limites incluindo e não incluindo swap, respectivamente. O lado negativo memory.limit_in_bytes é que ele conta os arquivos armazenados em cache pelo kernel em nome dos processos no cgroup em relação à cota do grupo. Menos caching significa mais acesso ao disco, então você está potencialmente desistindo de algum desempenho se o sistema tiver alguma memória disponível.

Por outro lado, memory.soft_limit_in_bytes permite que o cgroup ultrapasse a cota, mas se o killer da OOM do kernel for invocado, os cgroups que estiverem sobre suas cotas serão mortos primeiro, logicamente. A desvantagem disso, no entanto, é que há situações em que alguma memória é necessária imediatamente e não há tempo para o assassino de OOM procurar por processos para matar, caso em que algo pode falhar antes que os processos do usuário com excesso de cotas sejam morto.

ulimit , no entanto, é absolutamente a ferramenta errada para isso. O ulimit coloca limites no uso de memória virtual, o que quase certamente não é o que você deseja. Muitos aplicativos do mundo real usam muito mais memória virtual do que a memória física. A maioria dos tempos de execução colecionados de lixo (Java, Go) funciona dessa maneira para evitar a fragmentação. Um programa "hello world" trivial em C, se compilado com sanitizante de endereço, pode usar 20 TB de memória virtual. Alocadores que não dependem de sbrk , como jemalloc (que é o alocador padrão para Rust) ou tcmalloc também terá um uso de memória virtual substancialmente acima de seu uso físico. Por eficiência, muitas ferramentas irão mapear arquivos, o que aumenta o uso virtual, mas não necessariamente o uso físico. Todos os meus processos do Chrome estão usando 2 TB de memória virtual cada. Eu estou em um laptop com 8GB de memória física. De qualquer forma, se alguém tentasse configurar as cotas de memória virtual quebraria o Chrome, forçaria o Chrome a desabilitar alguns recursos de segurança que dependem da alocação (mas não do uso) de grandes quantidades de memória virtual ou ser completamente ineficiente para evitar que um usuário abuse do sistema .

    
por 10.12.2018 / 20:35