Skip to content


Былина о memory overcommit

Давным-давно в одной далёкой деревне заморской жили серверов линуксячих CentOS-ных десятков пару. Ядра – чистый изумруд (2.6.18-194.17.1.el5). Жили-не тужили, винтами шуршали да лампочками весело перемигивались. И жили вместе с ними в той деревне девелопер-буйная головушка и админ-добрый молодец. Девелопер всякие хитрые штуки на java выдумывал, а админ мёд-пиво пил, по усам текло, на клавиатуру капало.

И вот однажды девелоперу пришла в светлу головушку мысль – на этих серверах всякие документы дивные в форматах иноземных в чистый html превращать, да не просто превращать, а через openoffice. Задумано - сделано. И стали вдруг в одночасье чудеса происходить - сервера повадились один за другим кручиниться, работать как заведено переставали, на консоль жалобно писали, что, мол, нету в них больше силушки богатырской, ибо память оперативныя вся свободная вышла, и даже oom-killer делу не помогает (ибо хоть и пытается процессы до памяти охочие казнить, да редко попадает в какие нужно). Да не просто вышла, а так что и "swap free: 0Kb". И далее только волшебный ребут помогал. Загрустил тогда админ, ибо мёд-пиво больше пить было некогда, всё сервера упавшие только и поднимал. Да делать нечего – не будешь же писАлом на бересте html писать, openoffic-ом как-то всё ж сподручнее было.

Однажды приснился админу сон. Явился ему святой Патрег в золотом сиянии и говорит человеческим голосом: "А ты политику выделения памяти, издревле в линукс-ядрах по-умолчанию принятую, да поменял бы. Поставь vm.overcommit_memory=2 вместо дефолтного 0, авось, перестанет память заканчиваться". Послушался совета админ, поутру взял bash чудодейственный и сделал как ему Патрег во сне говорил:

  1. echo 2 > /proc/sys/vm/overcommit_memory

И случилось чудо тогда – перестали сервера в кручину впадать, вновь заработали пуще прежнего. Возрадовался админ, и решил мудрость добытую в скрижалях высечь, дабы сыновьям и внукам легче было с норовистым линуксом совладать и еще впрок в /etc/sysctl.conf запасы сделал:

  1. vm.overcommit_ratio = 100
  2. vm.overcommit_memory = 2

Про vm.overcommit_ratio = 100 админ уже сам смекнул, ибо с дефолтным 50 слишком часто java "Cannot allocate memory" получала. И вот дошла с той поры мудрость следующая до наших времён:

Есть ядре два основных параметра, отвечающих за overcommit памяти:

  • vm.overcommit_memory — отвечает за стратегию overcommit.
  • vm.overcommit_ratio — отвечает за уровень (в процентах) overcommit-а

Стратегии есть такие (см. файл с исходниками ядра mm/mmap.c):

  • 0 - OVERCOMMIT_GUESS — эвристический подход к распределению памяти. В нем выделяется столько памяти, сколько хочет процесс. Но в swap/res попадает только те страницы, которые используются этим процессом.
  • 1 - OVERCOMMIT_ALWAYS — overcommit памяти есть всегда. Использовать лучше с совсем кривыми приложениями и быть готовым при этому ко всему.
  • 2 - OVERCOMMIT_NEVER — без overcommit. В этом случае допустимый объем пространства памяти будет swap+ram*overcommit_ratio/100 .

По умолчанию используется стратегия OVERCOMMIT_GUESS, а vm.overcommit_ratio находится в значение 50% и используется только в случае OVERCOMMIT_NEVER. Система резервирует около 3% памяти для процессов пользователя root.

Размещено в категории *nix, Howto. Теги: , , , .

Комментариев: 7

Чтобы быть всегда в курсе здесь происходящего, Вы можете подписаться на RSS feed для комментариев на эту заметку.

  1. Serg said

    А мне вот интересно - к чему эти танцы с бубном, если есть oom_killer? Который просто прибивает в случае острой нехватки памяти лишние процессы и тем самым освобождает память.

  2. vitich said

    Былина просто пестня :)

  3. Admin said

    Serg, oom_killer с дефолтными настройками очень часто прибивает не то, что нужно (например, sshd). Чтобы он работал более адекватно, нужно тюнить /proc//oom_adj. А это задача более трудоёмкая, чем просто поменять пару параметров в sysctl.conf

  4. anonim said

    Сказка шикарна. -)

  5. Юрий said

    Что-то мне рекомендации не помогли, 1с 8.3 на CentOS 6.4 не хочет запускать базу, пишет Превышен максимальный размер памяти сервера за один вызов. Если увеличить физическую память, то ок. Сейчас стоит 1гб (Это для теста).
    Не подскажите куда копать?

  6. xakru said

    копать в 1с, возьмите с собой ядерную боеголовку. Как только доберетесь до логова 1с, тут же включайте режим самоуничтожения на боеголовке. Возможно хоть вам повезет уничтожить силу нечистую.

  7. Пашка said

    Ваще чОткая былина древляная

Some HTML is OK

(required)

(required, but never shared)

, или ответить через trackback.

Страница 1 из 11