powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Выделение памяти в линуксах.
25 сообщений из 39, страница 1 из 2
Выделение памяти в линуксах.
    #36365926
Фотография mriadus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хочется наиболее полно задать вопрос, но буду нудно подходить с нескольких сторон.

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, сорри за лишни детали.

И вот объяснение одного человека, которое до меня не дошло:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
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 ты обрезаешь адресное пространство, которое они могут выделять).

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

Не дошло, короче. То есть, диагноз я понял - не взлетит, но механизм взлетания и невзлетани хотелось-бы понять.
Спасибо.
...
Рейтинг: 0 / 0
Выделение памяти в линуксах.
    #36365928
Фотография mriadus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Напоминание и P.S.:

Там, где я запускал 5 процессов -Xmx1000M, свопа нет, только 2GB RAM. У меня даже получилось запустить эти 5 процессов в linux под VirtualBox с памятью 350MB.
...
Рейтинг: 0 / 0
Выделение памяти в линуксах.
    #36366114
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почитай про Java Application Launcer . Обрати внимание на параметр -Xms
...
Рейтинг: 0 / 0
Выделение памяти в линуксах.
    #36366141
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mriadus wrote:

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

Если свопа нет, то нельзя.

> система позволит застолбить больше, чем RAM, но что будет когда вы
> попытаетесь использовать всё выделенное я незнаю.

Будет защита памяти и крах программы.

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

Нет, просто любое приложение в LINUX (и Win32 тоже кстати) работает
в своём собственном адресном пространстве, 3Gb, если не ошибаюсь.
У одного приложения 3Gb, а все они физически располагаются
в одной и той же памяти, её, как известно, может быть максимум 4GB,
если в x86-32bit работа идёт. Всё, что не влазит, идёт в своп,
на диск, тот самый, который ты так не любишь почему-то. Если своп-файла
не будет, на всех суммарно будет 4Gb физ. памяти.

> Ситуация в том, что мне дали OpenVZ - виртуалку (VPS), память = 3.5GB,
> свопа нет. Я обломался запустить там 5 процессов java -Xmx1000M. Ява

Создавать своп надо. Своп можно отключить только если тебе хватит
ТОЛЬКО оперативки на все приложения.

> И вот объяснение одного человека, которое до меня не дошло:
>
> OpenVZ allows you to limit *6* different "kinds" of memory:

Это всё -- излишние подробности, тебе В ДАННОМ СЛУЧАЕ это
знать не обязательно.

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

Своп-файл и виртуальная память.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Выделение памяти в линуксах.
    #36366228
Фотография mriadus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А почему вы забили на то, что я пишу, как у меня прекрасно запускается 5 java -Xmx1000M без свопа на 2 GB RAM ?
...
Рейтинг: 0 / 0
Выделение памяти в линуксах.
    #36366229
Фотография mriadus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вы мне рассказываете общую теорию, не обращая внимания на ситуацию с двумя разными линуксами - настоящим и виртуальным, о которых я говорю. У меня нет свопа и там и тут, но на настоящем линуксе (2GB) запускается 5 java -Xmx1000M, на виртуальном OpenVZ не хочет.
...
Рейтинг: 0 / 0
Выделение памяти в линуксах.
    #36366590
Фотография mriadus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Зацените скриншот в следующем сообщении. В нём будет показана разница, между VIRT и RES. Свопа нет, но процессам позволяется выделить виртуальной памяти больше, чем есть физической.
...
Рейтинг: 0 / 0
Выделение памяти в линуксах.
    #36366593
Фотография mriadus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Выделение памяти в линуксах.
    #36366602
Фотография mriadus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Скриншот - от невиртуального линукса.
...
Рейтинг: 0 / 0
Выделение памяти в линуксах.
    #36366860
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mriadus wrote:

> Вы мне рассказываете общую теорию, не обращая внимания на ситуацию с
> двумя разными линуксами - настоящим и виртуальным, о которых я говорю. У
> меня нет свопа и там и тут, но на настоящем линуксе (2GB) запускается 5
> java -Xmx1000M, на виртуальном OpenVZ не хочет.

Я ничего не знаю про виртуальный линукс.
Но подозреваю, что даже если внутри виртуального линукса нет
свопа, виртуальная машина может предоставлять своим приложениям
больше (или меньше) памяти, чем реальная оперативка, и
использовать свои механизмы, аналогичные свопу системы.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Выделение памяти в линуксах.
    #36367139
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mriadusjava как-то так выделяет этот гиг памяти, что пять таких процессов прекрасно работают на 2GB RAM.

Ситуация в том, что мне дали OpenVZ - виртуалку (VPS), память = 3.5GB, свопа нет. Я обломался запустить там 5 процессов java -Xmx1000M. Ява говорила, что не может инициализировать VM. Или в некоторых местах падала, не могла выделить память. Или вела себя странно (странность в том, что не могла вызвать fork, чтобы выполнить команду "chmod", например, причина - памяти не хватало (ловятся исключения, в исключении говорится "cannot allocate memory"). Ok, сорри за лишни детали.
Ты можешь искусственно сымитировать ситуацию чтобы ошибка возникала сразу-же? И приведи тест который выдаёт стек исключений.
...
Рейтинг: 0 / 0
Выделение памяти в линуксах.
    #36367487
Фотография mriadus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonmriadusjava как-то так выделяет этот гиг памяти, что пять таких процессов прекрасно работают на 2GB RAM.

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

Напишу длинный интересный рассказ (-;

Каждый день её "имитирую" -> имитация заключается в выполнении двух стартовых скриптов hadoop :) Чтобы не заходить в тёмный лес, проще будет говорить, что эти скрипты выполняют просто запуск нескольких java -Xmx1000M .

Первый скрипт создаёт два таких процесса, второй ещё два-три... Важный момент (у обоих процессов этот момент идентичен) - после запуска, на один такой процесс оказывается сожрано памяти:

Код: plaintext
1.
2.
VIRT = 1461M
RES = 64M

А теперь фишка:

(1) На не-OpenVZ, на реальном ноуте
htop показывает, что свободной памяти убавилось на ~64M.
До:

После:


(2) На OpenVZ
htop показывает, что свободной памяти убавилось на ~1461M.
До:

После:

(ну не точно 1461, да)

Вот в этом и порылась собака. Реальный линукс "ограничивает по RES", виртуальный "ограничивает по VIRT". Конечно, нет таких понятий, и не так всё работает, это просто описание картины художественным языком )

Исключения я привести не могу, софт большой и в падает в разных местах - то не может fork() сделать (прочитал, что тупо делать fork() для execv(), есть же vfork(), но не я афтар софта), чтобы вызвать execv для запуска "chmod", то ещё что. Куча виртуальных машин просто не может запуститься после запуска собратьев, сожравших память, типа вот так:


Could not reserve enough space for object heap
Could not create the Java virtual machine.
...
Рейтинг: 0 / 0
Выделение памяти в линуксах.
    #36367508
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чесно говоря, не помю, чтобы в Linux, java форкала процессы. Хотя... может ошибаюсь. Сегодня приду домой - проверю.
...
Рейтинг: 0 / 0
Выделение памяти в линуксах.
    #36367510
Фотография mriadus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Короче, два момента:

(1) В обоих линуксах (железном и виртуальном) отжирается ~1.4G VIRT, 64M RES.
(2) Но на железном линуксе сумма всех выделенных VIRT может превышать объём его RAM, а в OpenVZ не может.
...
Рейтинг: 0 / 0
Выделение памяти в линуксах.
    #36367533
Фотография mriadus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЧесно говоря, не помю, чтобы в Linux, java форкала процессы. Хотя... может ошибаюсь. Сегодня приду домой - проверю.
А в java разве нет чего-то типа "system()" или ещё чего такого?

Нарыл стек исключений:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
Exception in thread "main" java.io.IOException: Cannot run program "chmod": java.io.IOException: error= 12 , Cannot allocate memory
at java.lang.ProcessBuilder.start(ProcessBuilder.java: 459 )
at TestSysCall.main(TestSysCall.java: 21 )
Caused by: java.io.IOException: java.io.IOException: error= 12 , Cannot allocate memory
at java.lang.UNIXProcess.<init>(UNIXProcess.java: 148 )
at java.lang.ProcessImpl.start(ProcessImpl.java: 65 )
at java.lang.ProcessBuilder.start(ProcessBuilder.java: 452 )
...  1  more
...
Рейтинг: 0 / 0
Выделение памяти в линуксах.
    #36368301
Фотография mriadus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я не очень корректно выражаюсь про VIRT вообще, ибо он есть ещё и сумма всех замапленных в память файлов, всех шаред-либ и т.п., но чуЙства стараюсь передать)
...
Рейтинг: 0 / 0
Выделение памяти в линуксах.
    #36368391
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЧесно говоря, не помю, чтобы в Linux, java форкала процессы. Хотя... может ошибаюсь. Сегодня приду домой - проверю.
Под windows java создаёт потоки WindowsThread на каждый JavaThread. Плюс еще резервирует около 10 потоков для собстенных нужд.
...
Рейтинг: 0 / 0
Выделение памяти в линуксах.
    #36368409
Фотография mriadus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonmaytonЧесно говоря, не помю, чтобы в Linux, java форкала процессы. Хотя... может ошибаюсь. Сегодня приду домой - проверю.
Под windows java создаёт потоки WindowsThread на каждый JavaThread. Плюс еще резервирует около 10 потоков для собстенных нужд.
А программу внешнюю из java-программы выполнить как? Без создания ещё одного процесса? )
...
Рейтинг: 0 / 0
Выделение памяти в линуксах.
    #36368425
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Под Linux java создаёт потоки. В начале - в количестве девяти штук после бута а потом, по одному потоку на каждый работающий экземляр класса java.lang.Thread. Я только что убедился в этом используя top -H.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
[mayton@host java]$ uname -a
Linux host.localdomain  2 . 6 . 18 - 53 .el5 # 1  SMP Sat Nov  10   18 : 24 : 52  EST  2007  i686 i686 i386 GNU/Linux

[mayton@host java]$ java -version
java version "1.6.0_06"
Java(TM) SE Runtime Environment (build  1 . 6 .0_06-b02)
Java HotSpot(TM) Client VM (build  10 . 0 -b22, mixed mode, sharing)
[mayton@host java]$

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
[mayton@host java]$ top -U mayton -H -c
top -  23 : 12 : 11  up   1 : 37 ,   2  users,  load average:  0 . 02 ,  0 . 04 ,  0 . 11 
Tasks:  145  total,    3  running,  142  sleeping,    0  stopped,    0  zombie
Cpu(s):   0 . 3 %us,   0 . 7 %sy,   0 . 0 %ni,  99 . 0 %id,   0 . 0 %wa,   0 . 0 %hi,   0 . 0 %si,   0 . 0 %st
Mem:   1035328k total,   728000k used,   307328k free,    72800k buffers
Swap:  4192956k total,        0k used,  4192956k free,   399580k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
 17320  mayton     16     0    2168   1028    788  R   1 . 0    0 . 1     0 : 00 . 81  top -U mayton -H -c
 16964  mayton     15     0    9152   1496    976  S   0 . 0    0 . 1     0 : 00 . 23  sshd: mayton@pts/ 0 
 16965  mayton     15     0    4504   1416   1164  S   0 . 0    0 . 1     0 : 00 . 10  -bash
 17108  mayton     15     0    8996   1480    972  S   0 . 0    0 . 1     0 : 00 . 07  sshd: mayton@pts/ 1 
 17109  mayton     15     0    4504   1416   1164  S   0 . 0    0 . 1     0 : 00 . 07  -bash
 17322  mayton     17     0   210m  8332   4344  S   0 . 0    0 . 8     0 : 00 . 00  java Main
 17323  mayton     18     0   210m  8332   4344  S   0 . 0    0 . 8     0 : 00 . 09  java Main
 17324  mayton     15     0   210m  8332   4344  S   0 . 0    0 . 8     0 : 00 . 00  java Main
 17325  mayton     21     0   210m  8332   4344  S   0 . 0    0 . 8     0 : 00 . 00  java Main
 17326  mayton     22     0   210m  8332   4344  S   0 . 0    0 . 8     0 : 00 . 00  java Main
 17327  mayton     23     0   210m  8332   4344  S   0 . 0    0 . 8     0 : 00 . 00  java Main
 17328  mayton     18     0   210m  8332   4344  S   0 . 0    0 . 8     0 : 00 . 01  java Main
 17329  mayton     25     0   210m  8332   4344  S   0 . 0    0 . 8     0 : 00 . 00  java Main
.....
...
Рейтинг: 0 / 0
Выделение памяти в линуксах.
    #36368427
Фотография mriadus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А как в линуксе можно выполнить другую программу без создания нового процесса?
...
Рейтинг: 0 / 0
Выделение памяти в линуксах.
    #36368429
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mriadusА программу внешнюю из java-программы выполнить как? Без создания ещё одного процесса? )
Это требует отдельного обсуждения. Возм. такие технологии как JNI и будут запускать экземпляры процессов но тогда при чём тут java? Ведь в вашем случае, насколько я понял мы обсуждаем особенности работы pure java в окружении так называемой OpenVZ.

Или не так?
...
Рейтинг: 0 / 0
Выделение памяти в линуксах.
    #36368439
Фотография mriadus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonmriadusА программу внешнюю из java-программы выполнить как? Без создания ещё одного процесса? )
Это требует отдельного обсуждения. Возм. такие технологии как JNI и будут запускать экземпляры процессов но тогда при чём тут java? Ведь в вашем случае, насколько я понял мы обсуждаем особенности работы pure java в окружении так называемой OpenVZ.

Или не так?
Не так. Наша речь о потоках началась с упоминания мной проблем с выполнением из java-программ других бинарей. Потом вы зачем-то написали о потоках. "зачем-то" я пишу потому, что я не в курсе, что можно запустить параллельное выполнение биаря с диска из моего процесса не создавая ещё одного процесса )
...
Рейтинг: 0 / 0
Выделение памяти в линуксах.
    #36368455
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Несколько вопросов.

1) Почему ты использовал java.lang.ProcessBuilder.start а не java.lang.Runtime.exec ?
2) Ты анализировал возможность утечки ресурсов вследствие того, что ты не контролируешь событие завершения процесса chmod?
...
Рейтинг: 0 / 0
Выделение памяти в линуксах.
    #36368459
Фотография mriadus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonНесколько вопросов.

1) Почему ты использовал java.lang.ProcessBuilder.start а не java.lang.Runtime.exec ?
2) Ты анализировал возможность утечки ресурсов вследствие того, что ты не контролируешь событие завершения процесса chmod?

Не я автор софтины.
...
Рейтинг: 0 / 0
Выделение памяти в линуксах.
    #36368465
Фотография mriadus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И я не понял, зачем ты говоришь о потоках. Какое они имеют отношение к выполнению бинаря с диска? Могут разве использоваться для этого? Как мне подсказывает мой моск, нет ) Для параллельного (с нами) выполнения бинаря с диска делают (в юниск системах):

fork() -> execve();
vfork() -> execve();

Вот я тормоз, то на ты, то на вы.
...
Рейтинг: 0 / 0
25 сообщений из 39, страница 1 из 2
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Выделение памяти в линуксах.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]