Cent OS: Como desativo ou reduzo o comprometimento excessivo da memória e é seguro fazê-lo?

20

De tempos em tempos, o "meu" servidor para porque fica sem memória e espaço de troca. (continua respondendo ao ping, mas nada além disso, nem mesmo ssh).

Disseram-me que o linux faz um comprometimento excessivo de memória, que, pelo que entendi, é o mesmo que os bancos com dinheiro: concede aos processos mais memória do que realmente disponível, assumindo que a maioria dos processos não use realmente toda a memória que solicita, em pelo menos nem todos ao mesmo tempo.

Suponha que essa seja realmente a causa pela qual meu sistema ocasionalmente trava; não vamos discutir aqui se esse é ou não o caso (consulte O que pode fazer com que TODOS os serviços de um servidor sejam inoperantes, ainda respondendo ao ping? E como descobrir ) .

Tão,

  1. como desabilito ou reduzo drasticamente o comprometimento excessivo da memória no CentOS? Eu li que existem duas configurações chamadas vm.overcommit_memory (valores 0, 1 ou 2) e vm.overcommit_ratiom, mas não tenho idéia de onde devo encontrá-las e alterá-las (espero que algum arquivo de configuração), que valores devo tentar e se preciso reiniciar o servidor para efetivar as alterações.

  2. e é seguro? Que efeitos colaterais eu poderia esperar? Ao pesquisar no overcommit_memory, encontro coisas assustadoras, como pessoas dizendo que o servidor não pode mais inicializar ....

Como o que causa o aumento repentino no uso da memória é o mysql, devido a consultas feitas pelo php que, por sua vez, são chamadas enquanto atendem solicitações http, eu esperaria que apenas algum script php não fosse concluído e, portanto, 500 respostas de tempos em tempos quando o servidor está muito ocupado, o que é um risco que posso correr (certamente melhor que todo o servidor fique inacessível e precise reiniciá-lo com força).

Ou pode realmente fazer com que o meu servidor não consiga reiniciar se eu escolher as configurações incorretas?

matteo
fonte
11
Desativar a confirmação excessiva não ajudará quando você estiver realmente ficando sem memória. Adicionar RAM ao servidor pode ajudar, no entanto.
Michael Hampton
2
Desativar o overcommit não será a solução final, mas ajudará bastante, se o servidor ficar sem memória (o que ocorre de vez em quando por alguns segundos), tenho apenas algumas solicitações http rejeitadas (ou mal servido), em vez de ter o meu DIE servidor completamente e para sempre (até que eu reiniciá-lo)
Matteo

Respostas:

30

O overcommit de memória pode ser desativado por vm.overcommit_memory=2

0 é o modo padrão, em que o kernel determina heuristicamente a alocação, calculando a memória livre em comparação com a solicitação de alocação que está sendo feita. E defini-lo como 1 ativa o modo de assistente, onde o kernel sempre anuncia que possui memória livre suficiente para qualquer alocação. Definir como 2 significa que os processos podem alocar apenas uma quantidade configurável ( overcommit_ratio) de RAM e começarão a receber falha na alocação ou mensagens OOM quando ultrapassar essa quantidade.

É seguro fazê-lo, não. Não vi nenhum caso de uso adequado em que a descompressão de memória realmente ajudou, a menos que você esteja 100% certo da carga de trabalho e da capacidade do hardware. Caso esteja interessado, instale o kernel-docspacote e vá /Documentation/sysctl/vm.txtpara ler mais ou leia online .

Se você definir vm.overcommit_memory=2, ele será comprometido demais com a porcentagem de RAM física configurada vm.overcommit_ratio(o padrão é 50%).

echo 0/1/2 > /proc/sys/vm/overcommit_memory 

Isso não sobreviverá a uma reinicialização. Para persistência, coloque isso no /etc/sysctl.confarquivo:

vm.overcommit_memory=X

e corra sysctl -p. Não há necessidade de reiniciar.

Soham Chakraborty
fonte
a parte que você fez não resposta é em qual arquivo eu alterar essa configuração vm.memory_overcommit e, especialmente, se eu precisar de reboot (ou o que mais) para ter efeito
Matteo
2
eco 0/1/2> / proc / sys / vm / overcommit_memory Isso não sobreviverá a uma reinicialização. Para persistência, coloque isso no arquivo /etc/sysctl.conf vm.overcommit_memory = X e execute sysctl -p. Não há necessidade de reinicialização
Soham Chakraborty
Muito obrigado. Você pode adicioná-lo ao corpo da resposta para que eu possa "aceitá-lo" formalmente.
Matteo
11
Adicionada a nova peça.
214132Preço
4
"overcommit_ratio" tem um efeito importante ao usar overcommit_memory = 2 - determina a porcentagem da RAM física que pode ser alocada! Portanto, se a proporção for <100, você deixará alguma RAM não alocada, talvez para cache de disco ou similar. A proporção padrão é de 50%; portanto, você usará apenas 50% da RAM física se não mudar isso!
David Gardner
6

Instrução totalmente não qualificada: desabilitar a confirmação excessiva de memória é definitivamente "mais seguro" do que habilitá-lo.

O $ customer o configurou em algumas centenas de servidores web e ajudou muito nos problemas de estabilidade. Existe até um cheque de Nagios chamando o fogo bem alto, se NÃO estiver desativado.

Por outro lado, as pessoas podem não considerar "seguro" deixar seus processos sem memória quando apenas desejam exagerar um pouco de memória RAM e nunca realmente usam isso. (ou seja, SAP seria um bom exemplo)

Então, você voltou a ver se isso melhora as coisas para você. Como você já está pesquisando para se livrar de problemas relacionados - acho que isso pode ajudar você.

(Eu sei que vou arriscar um voto negativo por alguma pessoa mal-humorada)

Florian Heigl
fonte
3

Concordo que desabilitar o overcommit é mais seguro do que habilitá-lo em algumas circunstâncias. Se o servidor executar apenas alguns trabalhos de memória grandes (como simulações de circuito no meu caso), é muito mais seguro negar ao aplicativo a solicitação de memória antecipadamente, em vez de esperar por um evento OOM (que certamente ocorrerá em breve). Frequentemente, vemos servidores tendo problemas depois que o assassino da OOM fez seu trabalho.

user185690
fonte