Отношение OOM к vm.swappiness = 0 в новом ядре
Отношение OOM к vm.swappiness = 0 в новом ядре
Недавно я участвовал в диагностике причин вызова OOM, который мог бы убить процесс сервера MySQL. Конечно, эти серверы в основном работали с MySQL. Таким образом, серверный процесс MySQL был с наибольшим объемом выделенной памяти.
Но странная вещь заключалась в том, что во всех случаях не было обнаружено ни одной операции свопинга, и в кеше страниц было достаточно страниц. По иронии судьбы все эти серверы были CentOS 6.4 с ядром версии 2.6.32-358. Другая распространенность заключалась в том, что для vm.swappiness было установлено значение 0. Это довольно стандартная практика, которая применяется практически на каждом сервере, на котором работает MySQL.
Заглядывая дальше, я понял, что в ядре 3.5-rc1 было внесено изменение, которое изменило поведение подкачки, когда «vm.swappiness = 0».
Ниже приведено описание коммита, который изменил поведение «vm.swappiness = 0» вместе с diff:
Это изменение было объединено с ядром RHEL 2.6.32-303:
Это, очевидно, изменило наш взгляд на «vm.swappiness = 0». Ранее считалось, что установка этого параметра в 0 уменьшает тенденцию к обмену пользовательскими процессами, но не отключает ее полностью. Как таковой, он ожидал увидеть небольшой обмен вместо ООМ.
Это относится ко всем ядрам RHEL / CentOS> 2.6.32-303 и к другим дистрибутивам, которые предоставляют более новые ядра, такие как Debian и Ubuntu. Или любой другой дистрибутив, в котором это изменение было перенесено, как в RHEL.
Позвольте мне поделиться с вами статистикой, связанной с зонами памяти, которые были зарегистрированы в системном журнале одного из событий OOM.
Как можно видеть, объем свободной памяти и объем памяти в кеше страниц был больше, чем верхний водяной знак, что предотвращало любую операцию подкачки. И все же из-за ненужного давления памяти вызывался OOM, который убивал процесс сервера MySQL.
MySQL, получающий OOM'ed, является плохим по многим причинам и может иметь нежелательное влияние, например, привести к потере незафиксированных транзакций или транзакций, еще не сброшенных в журнал из-за innodb_flush_log_at_trx_commit = 0, или гораздо более сильному воздействию из-за холодных кэшей при перезапуске.
Я предпочитаю старое поведение vm.swappiness, и теперь я установил для него значение «1». Установка vm.swappiness = 0 будет означать, что теперь вам нужно будет гораздо точнее настраивать размер различных глобальных и сессионных буферов.
Комментариев нет:
Отправить комментарий