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 чудодейственный и сделал как ему Патрег во сне говорил:

echo 2 > /proc/sys/vm/overcommit_memory

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

vm.overcommit_ratio = 100
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.

Posted in *nix, Howto.

Tagged with , , , .


10 Responses

Stay in touch with the conversation, subscribe to the RSS feed for comments on this post.

  1. Serg says

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

  2. vitich says

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

  3. Admin says

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

  4. anonim says

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

  5. Юрий says

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

  6. xakru says

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

  7. Пашка says

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

  8. frank says

    Хрень какая-то. Хотел работать без свопа (6 ГБ ram 64bit Ubuntu 16.04), но когда браузер выжирает всю память, система уходит в жёсткий iowait, задрачивая винт, спасает только резет. Сделал OVERCOMMIT_NEVER - сесия тут же упала, войти невозможно! Добавил vm.overcommit_ratio = 100 - стало возможно входить, но фаерфокс не запускается, скайп не запускается, даже компиз не запускается... Добавил гиг свопа - сессия нормально запускается, но фаерфокс всё ещё нет. И вообще, я хотел жить без свопа!

  9. Мфынф says

    Бред это всё.
    Если памяти мало - нужно увеличивать память.
    Если свапа мало - нужно добавить хотя бы файлом.

You must be logged in to post a comment.