Existe uma maneira de limitar o uso da memória “buffer” no Linux?

2

Gostaria de limitar a atribuição de RAM do servidor Linux ao buffer de cache de disco e, em vez disso, deixá-lo ocioso. (CentOS 5 se isso importa). Eu sei que é ideal estar usando cada gota de RAM física disponível para alguma coisa mesmo se apenas em cache de disco - o Linux é ótimo nisso. Na maioria das vezes eu nem consideraria tentar derrotar isso. Deixe-me dizer-lhe porque eu quero (eu sou não preocupado com o monitoramento):

Minha empresa tem um contrato com terceiros para algumas VMs e temos um limite de memória comprometido incluído em nossa fatura mensal. Os excedentes são caros demais. 2 dessas VMs executam um aplicativo que apenas mastiga RAM durante a inicialização do processo, mas, uma vez estável, o uso cai muito. Devs me asseguram que é o que este serviço deve fazer e não vai ficar "melhor" em breve. Por isso, mantenho estas VMs provisionadas com cerca de 2x a RAM normalmente necessária no modo de execução normal. Uma vez estável, o extra é jogado no cache do buffer e todo mundo fica feliz. Exceto os caras de finanças.

Nosso provedor conta a RAM alocada para o cache de buffer em relação ao nosso valor total comprometido para o data center virtual, portanto, pagamos por isso todos os meses. Muito. Eu não acredito que me importo com o que está em cache - eu ficaria feliz em rodar com menos RAM (ou seja, menos cache) e ter um pouco de performance no acesso a arquivos (eu assumo ...) exceto quando o aplicativo inicia do zero e precisa dessa RAM para não trocar para o inferno e voltar.

Então eu estou procurando uma maneira de dizer ao Linux algo como "ei, só use 1GB (ou melhor, x%) de RAM livre para armazenar em cache o cache de disco, sim, vá em frente e desperdice o resto!" ". Poderíamos economizar muito ao longo dos anos, já que, se a RAM fosse mantida livre e não fosse alocada para os buffers, ela não contaria contra o valor comprometido e não teríamos que "alugá-la". Mas como alguma coisa está usando, mesmo que seja apenas o cache do buffer, nós pagamos por isso.

Pesquisei bastante, e principalmente vi perguntas como "OMG, por que meu servidor está quase em 100% o tempo todo ..." e as pessoas estão pirando sobre o monitoramento / alarme / nms e sendo educadas pelas respostas - isso não é minha pergunta; Eu tive essas mesmas reações 10 anos atrás, mas neste caso eu realmente não quero realmente usar essa RAM, então eu não tenho que "pagar aluguel" por isso quando o aplicativo não precisa dele.

Sugestões alternativas são bem-vindas se você pensar em outra maneira de realizar isso.

Muito obrigado ...

    
por BrentHarsh 02.02.2016 / 07:05

2 respostas

1

Não sei se você pode impedir o armazenamento em cache, mas você pode pedir regularmente ao Linux para remover o cache. A maneira de fazer isso é explicada lá: link Se você sync antes do comando echo to /proc/sys/vm/drop_caches , ele deve liberar muito memória ram.

O Linux não preencherá ativamente o seu RAM abrindo arquivos e armazenando-os em cache. Apenas os arquivos que estão realmente ativos serão armazenados em cache. Esses podem ser os arquivos usados pelo seu aplicativo, incluindo o código binário do programa.

Também pode ser os arquivos de log. Você poderia usar o log de rede para evitar isso.

Outra abordagem poderia ser executar seu aplicativo em uma máquina virtual, com muito menos memória RAM e um disco RAM como dispositivo de permuta (e depois controlar o nível de sappiness), mas é um pouco mais complicado.

Gostaria de saber como o seu provedor sabe quanto ram está alocado mas não é usado pelo seu sistema. Essas páginas de memória RAM, mesmo que não sejam usadas, não estarão vazias.

    
por 02.02.2016 / 09:43
0

Se o cache for criado por esse aplicativo, acho que você poderia usar cgroups depois que o aplicativo estiver estabilizado:

Crie um cgroup chamado like group1 com um limite de memória (de 50GB, por exemplo, outros limites como CPU são suportados, no exemplo CPU também é mencionado):

cgcreate -g memory,cpu:group1

cgset -r memory.limit_in_bytes=$((50*1024*1024*1024)) group1

Em seguida, leve o aplicativo para este cgroup após a inicialização:

cgclassify -g memory,cpu:group1 $(pidof your_app_name)
    
por 16.03.2018 / 14:27