Então, eu tenho 4 GB de RAM + 4 GB de swap. Quero criar um usuário com ram e swap limitados: 3 GB de RAM e 1 GB de swap. Isso é possível? É possível iniciar aplicativos com RAM limitada e trocar disponível para eles sem criar um usuário separado (e não instalar nenhum aplicativo especial - tendo apenas uma configuração padrão do servidor Debian / CentOS e sem usar o sudo)?
Atualizar:
Então eu abri o terminall e digitei o comando ulimit : ulimit -v 1000000
que deve ser como 976,6Mb
limitação. Em seguida, liguei ulimit -a
e vi que a limitação está "ativada". Então iniciei um script bash que compila e inicia meu aplicativo nohup
, um longo nohup ./cloud-updater-linux.sh >& /dev/null &
... mas depois de algum tempo, vi:
(o que seria aceitável se nenhuma limitação fosse aplicada - ele baixou uma grande lib e começou a compilá-la.)
Mas pensei em aplicar limitações ao shell e a todos os processos iniciados com / a partir dele ulimit -v 1000000
? O que eu errei? Como fazer um terminal e todos os subprocessos lançados serem limitados ao uso de memória ram?
fonte
Respostas:
ulimit
é feito para isso. Você pode configurar os padrõesulimit
por usuário ou por grupo emulimit -v KBYTES
define o tamanho máximo da memória virtual. Eu não acho que você pode dar uma quantidade máxima de troca. É apenas um limite para a quantidade de memória virtual que o usuário pode usar.Então você
limits.conf
teria a linha (no máximo4G
de memória)UPDATE - CGroups
Os limites impostos por
ulimit
elimits.conf
são por processo. Eu definitivamente não estava claro sobre esse ponto.Se você deseja 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
:Isso cria um
cgroup
que possui um limite máximo de memória de 4GiB.Em
/etc/cgrules.conf
:Isso fará com que todos os processos executados
luser
sejam executados dentro dosmemlimit
cgroups criados nocgconfig.conf
.fonte
useradd
?Você não pode limitar o uso da memória no nível do usuário, o ulimit pode fazer isso, exceto por um único processo.
Mesmo com o uso de limites por usuário
/etc/security/limits.conf
, um usuário pode usar toda a memória executando vários processos.Se você realmente deseja limitar os recursos, precisa usar uma ferramenta de gerenciamento de recursos, como o rcapd usado por projetos e zonas no Solaris.
Há algo que parece fornecer recursos semelhantes no Linux que você pode investigar: cgroups .
fonte
cgroups
são a maneira correta de fazer isso, como outras respostas apontaram. Infelizmente, não há uma solução perfeita para o problema, como veremos abaixo. Existem várias maneiras diferentes de definir os limites de uso de memória do cgroup. O modo como alguém faz com que a sessão de login de um usuário faça parte automaticamente de um cgroup varia de sistema para sistema. O Red Hat tem algumas ferramentas, e o systemd também .memory.memsw.limit_in_bytes
ememory.limit_in_bytes
definir limites, incluindo e não incluindo swap, respectivamente. A desvantagemmemory.limit_in_bytes
é que ele conta os arquivos armazenados em cache pelo kernel em nome dos processos no cgroup contra a cota do grupo. Menos cache significa mais acesso ao disco; portanto, você está potencialmente perdendo algum desempenho se o sistema tiver alguma memória disponível.Por outro lado,
memory.soft_limit_in_bytes
permite que o cgroup exceda a cota, mas se o killer do OOM do kernel for invocado, os cgroups que estão acima de suas cotas serão mortos primeiro, logicamente. A desvantagem disso, no entanto, é que existem situações em que é necessária alguma memória imediatamente e não há tempo para o OOM killer procurar processos a serem eliminados; nesse caso, algo pode falhar antes que os processos do usuário com excesso de cota sejam morto.ulimit
, no entanto, é absolutamente a ferramenta errada para isso. O ulimit impõe limites ao uso da 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 memória física. A maioria dos tempos de execução coletados por lixo (Java, Go) funciona dessa maneira para evitar a fragmentação. Um programa trivial "olá mundo" em C, se compilado com desinfetante de endereço, pode usar 20 TB de memória virtual. Alocadores nos quais não dependemsbrk
, como jemalloc (que é o alocador padrão para Rust) ou tcmalloc, também terão uso de memória virtual substancialmente superior ao uso físico. Para maior eficiência, muitas ferramentas mapearão 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. Estou em um laptop com 8 GB de memória física. De qualquer maneira que alguém tentasse configurar cotas de memória virtual aqui, ele quebraria o Chrome, forçaria o Chrome a desativar alguns recursos de segurança que dependem da alocação (mas não o uso) de grandes quantidades de memória virtual ou seria completamente ineficaz para impedir que um usuário abuse do sistema .fonte