O que acontece se você ficar sem RAM e trocar?

6

Executando o MySQL em uma caixa com 32 GB de RAM. O swap está 99% cheio e há cerca de 200 MB de RAM livres. O MySQL é o culpado, é claro. O que acontece quando a RAM e a troca estão completamente preenchidas? Obrigado!

    
por cat pants 14.03.2012 / 19:58

5 respostas

12

9/10 OO killer virá e matará o programa com o maior consumo de memória. Senão seu sistema irá falhar.

Estou assumindo que você está no Linux.

    
por 14.03.2012 / 20:00
5

Isso depende do sistema operacional, mas quando você realmente acaba, algo morre. Mais especificamente, algo diz ao sistema operacional "por favor, me dê mais memória", e o sistema operacional diz "não".

(Isso pode ser em virtude de apenas tocar em alguma memória que já foi dito foi alocado, fazendo com que a página copie-on-write, por isso não é tão simples como "chamar o alocador de memória do kernel")

Tecnicamente, o processo poderia lidar com essas falhas e se recuperar, mas praticamente resulta em um travamento.

O Linux tenta adivinhar o que é um bom candidato a matar, e acho que o Windows faz o mesmo, antes de você chegar a esse estado - mate algo marginalmente mais limpo para que a memória seja liberada.

    
por 14.03.2012 / 20:01
2

Como a RAM livre é um desperdício de memória RAM, o Linux tenta usar o máximo possível. É possível que existam muitas páginas de disco em cache e outras coisas mantidas na RAM apenas porque havia espaço. Execute free -m para ver como a RAM é usada em sua máquina. Ele também mostrará o número de megas que podem ser usadas pelos aplicativos, se necessário (coluna 'livre', segunda linha).

    
por 14.03.2012 / 20:38
1

Abra algumas sessões ssh sobressalentes para o host até que não seja tarde demais. Quando o sistema não tem RAM / swap livre, nenhum novo processo pode ser iniciado.

Parece que alguma consulta produz uma quantidade inesperada de dados armazenados na (s) tabela (s) temporária (s) - na memória. Tente matar o thread mais antigo lançado pelo mysql:

SELECT ID, USER, HOST, DB, COMMAND, TIME, STATE, LEFT(INFO, 51200) AS Info FROM information_schema.PROCESSLIST;

Campo TIME mostra os segundos que o mysql gastou realizando a consulta. Aqueles com maior TEMPO são os culpados.

    
por 14.03.2012 / 20:35
1

Tente implantar um agente personalizado, como o New Relic, para ver quais processos são desnecessários e começar a eliminá-los. Isso pode salvar seu servidor de travar

    
por 22.04.2012 / 10:31