Nossos servidores em produção às vezes sob carga apresentam o seguinte problema (Linux 4.10):
- O aplicativo que manipula a carga (servidor web) está sendo executado com carga alta.
- Um novo trabalho é iniciado (por exemplo, cron). Isso requer uma chamada de sistema clone(), que não consegue alocar memória.
- O Kernel OOM killer é inicializado e encerra um dos processos do aplicativo do servidor web, para que o novo trabalho possa ser iniciado.
- "free -m" mostra que a memória livre está criticamente baixa, cerca de 1-3 GB dos 64 GB do servidor. No entanto, a maior parte da memória está no cache de páginas.
- O sistema não possui nenhuma configuração de partição/arquivo swap e vm.swappiness está definido com seu valor padrão de 60.
Em vez disso, se tivéssemos executado "echo 3> /proc/sys/vm/drop_caches" antes do início do carregamento, o OOM não acabaria matando nosso aplicativo de servidor web e tudo funcionaria bem.
Nas condições acima, o kernel não libera o cache da página antes de tentar encerrar um processo para liberar memória?