В этой статье рассказывается о ООМ-убийце и о том, как он может повлиять на нашу операционную систему Linux.
“Убийца ООМ” – это сокращение от “Убийцы нехватки памяти” и компонент Linux, предназначенный для предотвращения исчерпания оперативной памяти. У ООМ-убийцы есть одна задача, и эта задача состоит в том, чтобы проверить, достаточно ли доступной памяти, и если нет, то выбрать процесс для уничтожения, чтобы освободить немного оперативной памяти. Ситуации с исчерпанной памятью возникают из-за того, что ядро Linux слишком много выделило для своих процессов. В следующих параграфах мы поговорим о чрезмерном выделении памяти, жизненном цикле ООМ-убийцы, о том, как он выбирает, какой процесс следует уничтожить, о сообщениях ООМ-убийцы и т.д.
Каждый процесс в системе запрашивает блок памяти у ядра. Ядро выделяет памяти больше, чем требуется процессу при запуске. Ядро осознает этот сценарий. Однако он чрезмерно выделяет оперативную память. Это означает, что если в системе 4 ГБ оперативной памяти, ядро может выделить 5 ГБ для всех запущенных процессов, что на 1 ГБ больше установленного предела. Обычно вначале все процессы не используют память, выделенную в их блоках, но через некоторое время они могут использовать всю память. Наступает момент, когда системе не хватает физически доступной оперативной памяти и она не в состоянии обслуживать все процессы.
В дополнение к предыдущему параграфу мы знаем, что в данный момент на сервере недостаточно оперативной памяти. Следующим будет вызываемый убойщик ООМ. Он проверяет все запущенные процессы, но прежде чем выбрать, какой процесс будет уничтожен, необходимо выполнить пару шагов, которые необходимо проверить:
Если одно из этих условий противоположно, то у нас заканчивается память, и убойщик ООМ выбирает, какой процесс следует убить. Выбор основан на функции select_bad_process(). Он решает, проходя через каждый запущенный процесс и вычисляя, насколько он подходит для уничтожения выбранного процесса, на основе функции badness():
badness_for_task = total_vm_for_task / (sqrt(cpu_time_in_seconds) * sqrt(sqrt(cpu_time_in_minutes)))
Приведенную выше формулу можно объяснить простыми словами: функция badness task выбирает процесс, который использует много памяти, но долгое время не выполнялся. Длительно работающие процессы вряд ли вызовут нехватку памяти. Как только эта функция выбирает процесс, “Убийца ООМ” немедленно убивает его.
Когда веб-сайт перестает работать, скорее всего, перестала работать какая-то служба. Нам нужно выяснить, что это за служба и какой процесс, возможно, был убит. Для этого мы можем выполнить следующую команду cat:
cat /var/log/messages | grep "Killed"
В качестве выходных данных мы можем получить сообщение, похожее на это:
Mar 02 14:04:48 host kernel: Out of Memory: Killed process 2574 (mysqld).
Это указывает на то, что “ООМ киллер” остановил процесс MySQL из-за нехватки памяти. Вот почему служба MySQL перестала работать и привела к простою нашего веб-сайта. Отключение службы MySQL часто приводит к необратимому повреждению системы баз данных, и мы можем потерять все данные, которые храним. Есть пара шагов, которые мы можем предпринять, чтобы избежать этих сценариев уничтожения процесса MySQL из-за перегрузки памяти. Имейте в виду, что это не рекомендуется. Нам нужно просто обновить сервер, чтобы у нас было больше доступных ресурсов.
Вот и все. Мы объяснили немного больше о ZOMBIE killer и о том, как он влияет на сервер. Конечно, вам не нужно заботиться об этом, когда на вашем сервере не хватает памяти.
PS. Если вам понравился этот пост о ООМ-убийце в Linux, пожалуйста, поделитесь им со своими друзьями в социальных сетях или просто оставьте комментарий в разделе комментариев. Спасибо.