LINUX.ORG.RU

Выделение памяти в linux | Ограничения в VPS.


0

0

Хочется наиболее полно задать вопрос, но буду нудно подходить с нескольких сторон.

1. Есть такая история, когда вы можете выделить памяти больше, чем вообще RAM. Свопа нет. То есть, как-то можно память так выделить, что система позволит застолбить больше, чем RAM, но что будет когда вы попытаетесь использовать всё выделенное я незнаю.

2. Есть ещё такая штука, как /proc/sys/vm/overcommit_memory - но допустим она равна 0, как по-умолчанию.

3. У меня была ситуация. Тут ещё надо сделать скидку, что я не представляю подробно, как себя ведёт то, что я тут буду упоминать. Я запускал несколько процессов java с ключом -Xmx1000M. Таких процессов запускал штук 5 на машине с 2 GB RAM и они успешно работали. Мне сказали, правда до меня не очень дошло (постижение природы этого явления и есть смысл этого поста), что java как-то так выделяет этот гиг памяти, что пять таких процессов прекрасно работают на 2GB RAM.

Ситуация в том, что мне дали OpenVZ - виртуалку (VPS), память = 3.5GB, свопа нет. Я обломался запустить там 5 процессов java -Xmx1000M. Ява говорила, что не может инициализировать VM. Или в некоторых местах падала, не могла выделить память. Или вела себя странно (странность в том, что не могла вызвать fork, чтобы выполнить команду «chmod», например, причина - памяти не хватало (ловятся исключения, в исключении говорится «cannot allocate memory»). Ok, сорри за лишни детали.

И вот объяснение одного человека, которое до меня не дошло:

OpenVZ allows you to limit 6 different «kinds» of memory: lockedpages privvmpages shmpages physpages vmguarpages oomguarpages What exactly to do limit? «privvmpages»? Have you checked OpenVZ bean counters for processes hitting the limit in your VPSes? Generally, if we won't go into the details, OpenVZ «privvmpages» and having X megabytes of physical RAM in physical system is two very different things. If you use «privvmpages», you effectively limit the available address space of all processes inside VPS that they can _allocate_. Java applications are fairly sensitive to this - if, for example, you will run Java machines with -Xmx1024M in your «2.5GB RAM» VPS, and it's really «2.5GB worth of privvmpages», you'd likely would be able to run only 2 jvms: third one would fail mysteriously by hitting the limit.

Я не понял смысла здесь: If you use «privvmpages», you effectively limit the available address space of all processes inside VPS that they can _allocate_. (Если у тебя «privvmpages», то для всех процессов в твоей VPS ты обрезаешь адресное пространство, которое они могут выделять).

У меня не вяжется «пространство» и «выделять», ибо когда я выделяю память, я ничего не говорю о месте в пространстве, где я хочу выделить память, я сообщаю только количество байт.

Не дошло, короче. То есть, диагноз я понял - не взлетит, но механизм взлетания и невзлетани хотелось-бы понять. Спасибо.

Считай что privvmpages описывает объем памяти, который суммарно могут затребовать все процессы внутри VPS. Так понятней?

no-dashi ★★★★★
()

А в чем проблема увеличить privvmpages для контейнера?

najar
()

> У меня не вяжется «пространство» и «выделять», ибо когда я выделяю память, я ничего не говорю о месте в пространстве, где я хочу выделить память, я сообщаю только количество байт.

Допустим на 32 битной машине адресное пространство 4GB без PAE и чтобы ты не делал обратиться выше не получиться, даже для виртуальной памяти. Потому что размер таблицы страниц и регистров не позволяет. Здесь тоже самое.

frey ★★
()

не вчитывался, но у openvz лимиты работают, грубо говоря, по сумме virtsize в top. Т.е. с точки зрения openvz если процесс хавал гиг а потом форкнулся то типа суммарно они выжирают 2гига.

true_admin ★★★★★
()
Ответ на: комментарий от true_admin

Вотъ! Простите, я не появиялся тут нек. время. За это время до меня дошли такие явства:

1. В не-виртуальном линуксе, я могу успешно запустить дофига процессов, каждый из которых будет просить гиг памяти, когда у меня всего 2 гига оперативы и нет свопа. Это и есть один из «эффектов» механизма «виртуальная память» в действии. А вот если я попытаюсь выделенные страницы поюзать, тут начнутся проблемы. Но юзать-то я не собирался. По условиям задачи, я только выделить хочу. Софтина у меня есть глупая, которой надо выделить гиг, а юзать только 64 метра. Дура она, но никак не поменять... На обычном линуксе работает хорошо, на OpenVZ уже несколько не запустить...

2. В OpenVZ не получается запустить 3-ю копию этого процесса, если (размер RAM) минус (суммарный размер VIRT двух уже запущенных) < (VIRT, который хочет откушать 3-й). Для не-виртуального линукса (или для VirtualBox, qemu и проч) такое ужасное для меня условие не работает.

Вопрос: как с точки зрения хост-линукса выглядит память, которая под OpenVZ является каким-то процессом выделенной, но не обязательно использованной? С точки зрения хост-линукса она использована или нет? Т.е. если я поставлю OpenVZ лимит в 16 GB RAM (на железке 32), у меня эти 16 в хост-линуксе будут уходить в RES или нет, когда кто-то под OpenVZ будет их выделять? Если да, то жесть, надо искать другие пути.

Короче, хочу в отношении выделения памяти под OpenVZ иметь возможность, как в нормальных линуксах SUM(VIRTs) > RAM. Без свопа)

mriadus
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.