Запуск MySQL на коробке с 32 гигабайтами ОЗУ. Своп заполнен на 99%, а ОЗУ свободно около 200 МБ. Конечно, виноват MySQL. Что произойдет, если и оперативная память, и своп полностью заполнены? Спасибо!
9/10 OOM убийца придет и убьет программу с самым большим потреблением памяти. В противном случае ваша система выйдет из строя.
Я предполагаю, что вы работаете в Linux.
Это зависит от ОС, но когда действительно заканчивается, что-то умирает. Точнее, что-то говорит ОС: «Пожалуйста, дайте мне больше памяти», а ОС говорит «нет».
(Это может быть связано с простым касанием некоторой памяти, о которой уже было сказано, что она была выделена, что вызывает копирование страницы при записи, поэтому это не так просто, как «вызвать распределитель памяти ядра»)
Технически процесс может справиться с этими сбоями и восстановиться, но на практике это приводит к сбою.
Linux изо всех сил пытается угадать, какой хороший кандидат для убийства, и я думаю, что Windows делает то же самое, прежде чем вы полностью доберетесь до этого состояния, однако - убейте что-нибудь чуть более аккуратно, чтобы освободить память.
Поскольку свободная оперативная память - это потраченная впустую оперативная память, Linux пытается использовать как можно больше ее. Возможно, что в ОЗУ хранится много кешированных страниц на диске и других вещей только из-за наличия свободного места. Бегать free -m
чтобы увидеть, как используется оперативная память на вашем компьютере. Он также покажет вам количество мегабайт, которое может быть использовано приложениями при необходимости (столбец «бесплатно», вторая строка).
Откройте несколько свободных сеансов ssh для хоста, пока не станет слишком поздно. Когда в системе нет свободной оперативной памяти / свопа, запуск новых процессов невозможен.
Кажется, что какой-то запрос производит неожиданный объем данных, хранящихся во временной таблице (ах) - в памяти. Попробуйте убить самый старый поток, запущенный mysql:
SELECT ID, USER, HOST, DB, COMMAND, TIME, STATE, LEFT(INFO, 51200) AS Info FROM information_schema.PROCESSLIST;
Поле TIME показывает секунды, которые mysql потратил на выполнение запроса. Вероятно, виноваты те, у кого больше ВРЕМЕНИ.
Попробуйте развернуть специальный агент, например New Relic, чтобы увидеть, какие процессы не нужны, и начать их убивать. Это может спасти ваш сервер от сбоя