Eu tenho um laptop Linux (teste Debian) padrão, com uma partição swap.
Eu faço muitas experiências com isso. Alguns deles têm muita memória e a maneira como o Linux se comporta por padrão é um problema para mim ... Vamos dar um exemplo estúpido:
- Sente-se na frente do laptop
- Abra um terminal
- Digite
python
, entãoa = [0]*100000000
Agora são grandes as chances de você não ter RAM suficiente para lidar com essa grande lista. O Linux preencherá a RAM, depois a troca e, alguns minutos depois, o OOM killer será acionado e matará (quase) serviços aleatórios e, esperançosamente, se você pressionar Ctrl + C na hora certa python
, e se o terminal ainda tinha o foco, o computador se tornaria responsivo novamente.
Gostaria de impor alguns limites de memória para evitar essa troca indesejada e recusar a um processo o direito de alocar mais memória do que tenho (na RAM). Se a demanda de memória estiver abaixo de um determinado limite ou solicitada pelo root, basta matar o processo que mais consome memória de qualquer usuário, exceto o root.
ulimit -Sv [mem]
Eu ouço lá atrás!
Ho Ho! "Use cgroups
via cgexec
!" alguém diz na primeira linha!
Sim, você está certo: estas são realmente muito boas soluções. Mas:
- Eles não se aplicam a todo o sistema
- Os limites são definidos por processo
- Os limites são estáticos, desconsiderando a quantidade real de RAM livre (AFAIK)
- Aqui e ali , eles dizem que essas não são realmente uma boa solução para impor limites rígidos.
O que eu gostaria é que o kernel dissesse: "Você pertence ao usuário foo (não root), você usa muita memória e nós ficaremos sem memória. Desculpe cara ... morra agora!"
Ou: "O que diabos você está fazendo? Você precisa de x MB e há apenas y MB disponíveis. Sim, o SWAP está vazio, mas você não pretende usá-lo para fazer seu trabalho sujo, não é? disse que não! Não há memória para você! Se você insistir, vai morrer! "
overcommit_memory
arquivo especial usa RAM + SWAP como memória utilizável. Eu ainda vou trocar :) #
ulimits
são uma péssima idéia, como mostrado em quase todos os lugares, pois é uma limitação por processo ... Eu garfo você sabe :) Sobre cgroups
, isso é definitivamente melhor, mas falta algo mais geral: estou falando do meu laptop, mas também possuir um servidor de "cálculo" que somos três para compartilhar. Se eu aplicar esses limites por usuário, ficarei limitado pelo pior cenário, não é?
/proc/sys/vm/overcommit_memory
afeta o comportamento do kernel com pouca memória.