O Linux supercomprime a memória. Isso significa que permite que o processo solicite mais memória do que realmente disponível no sistema. Quando um programa tenta malloc (), o kernel diz "OK, você pegou a memória", mas não a reserva. A memória só será reservada quando o processo escrever algo nesse espaço.
Para ver a diferença, você tem 2 indicadores: Memória Virtual e Memória Residente. Virtual é a memória solicitada pelo processo, Residente é a memória realmente usada pelo processo.
Com este sistema, você pode entrar em "overbooking", o kernel concede mais memória do que a disponível. Então, quando seu sistema ficar com 0 byte de memória livre e Swap, ele deve sacrificar (matar) um processo para ganhar memória livre.
É quando o OOM Killer entra em ação. O OOM seleciona um processo baseado em seu consumo de memória e muitos outros elementos (o pai ganha 1/2 da pontuação de seus filhos; se for um processo de propriedade da raiz, a pontuação é dividida por 4, etc. Dê uma olhada em Linux-MM.org/OOM_Killer
Você pode influenciar na pontuação da OOM, sintonizando o arquivo /proc/MySQL_PID/oom_adj
. Ao defini-lo como -17
, seu processo nunca será eliminado. Mas antes de fazer isso , você deve ajustar seu arquivo de configuração do MySQL para limitar o uso de memória do MySQL. Caso contrário, o OOM Killer matará outro processo do sistema (como SSH, crontab, etc ...) e seu servidor estará em um estado muito instável, talvez levando a corrupção de dados , que é pior do que qualquer coisa.
Além disso, você pode considerar usar mais troca.
[EDITAR]
Você também pode alterar o comportamento de supercomprometimento por meio desses 2 sysctls:
vm.overcommit_memory
vm.overcommit_ratio
Como declarado em Documentação do Kernel
overcommit_memory:
This value contains a flag that enables memory overcommitment.
When this flag is 0, the kernel attempts to estimate the amount of free memory left when userspace requests more memory.
When this flag is 1, the kernel pretends there is always enough memory until it actually runs out.
When this flag is 2, the kernel uses a "never overcommit" policy that attempts to prevent any overcommit of memory. Note that user_reserve_kbytes affects this policy.
This feature can be very useful because there are a lot of programs that malloc() huge amounts of memory "just-in-case" and don't use much of it.
The default value is 0.
See Documentation/vm/overcommit-accounting and security/commoncap.c::cap_vm_enough_memory() for more information.
overcommit_ratio:
When overcommit_memory is set to 2, the committed address space is not permitted to exceed swap plus this percentage of physical RAM. See above.
[/ EDIT]