Давным-давно в одной далёкой деревне заморской жили серверов линуксячих 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" получала. И вот дошла с той поры мудрость следующая до наших времён:
- 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.
А мне вот интересно - к чему эти танцы с бубном, если есть oom_killer? Который просто прибивает в случае острой нехватки памяти лишние процессы и тем самым освобождает память.
Былина просто пестня :)
Serg, oom_killer с дефолтными настройками очень часто прибивает не то, что нужно (например, sshd). Чтобы он работал более адекватно, нужно тюнить /proc//oom_adj. А это задача более трудоёмкая, чем просто поменять пару параметров в sysctl.conf
Сказка шикарна. -)
Что-то мне рекомендации не помогли, 1с 8.3 на CentOS 6.4 не хочет запускать базу, пишет Превышен максимальный размер памяти сервера за один вызов. Если увеличить физическую память, то ок. Сейчас стоит 1гб (Это для теста).
Не подскажите куда копать?
копать в 1с, возьмите с собой ядерную боеголовку. Как только доберетесь до логова 1с, тут же включайте режим самоуничтожения на боеголовке. Возможно хоть вам повезет уничтожить силу нечистую.
Ваще чОткая былина древляная
Хрень какая-то. Хотел работать без свопа (6 ГБ ram 64bit Ubuntu 16.04), но когда браузер выжирает всю память, система уходит в жёсткий iowait, задрачивая винт, спасает только резет. Сделал OVERCOMMIT_NEVER - сесия тут же упала, войти невозможно! Добавил vm.overcommit_ratio = 100 - стало возможно входить, но фаерфокс не запускается, скайп не запускается, даже компиз не запускается... Добавил гиг свопа - сессия нормально запускается, но фаерфокс всё ещё нет. И вообще, я хотел жить без свопа!
Прежде, чем отключать swap (особенно на десктопах), стоит почитать вот эту статью: https://habr.com/ru/company/flant/blog/348324/
Бред это всё.
Если памяти мало - нужно увеличивать память.
Если свапа мало - нужно добавить хотя бы файлом.