|
|
|
Выделение памяти в линуксах.
|
|||
|---|---|---|---|
|
#18+
Хочется наиболее полно задать вопрос, но буду нудно подходить с нескольких сторон. 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. Я не понял смысла здесь: If you use "privvmpages", you effectively limit the available address space of all processes inside VPS that they can _allocate_ . (Если у тебя "privvmpages", то для всех процессов в твоей VPS ты обрезаешь адресное пространство, которое они могут выделять). У меня не вяжется "пространство" и "выделять", ибо когда я выделяю память, я ничего не говорю о месте в пространстве, где я хочу выделить память, я сообщаю только количество байт. Не дошло, короче. То есть, диагноз я понял - не взлетит, но механизм взлетания и невзлетани хотелось-бы понять. Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2009, 21:03:03 |
|
||
|
Выделение памяти в линуксах.
|
|||
|---|---|---|---|
|
#18+
Напоминание и P.S.: Там, где я запускал 5 процессов -Xmx1000M, свопа нет, только 2GB RAM. У меня даже получилось запустить эти 5 процессов в linux под VirtualBox с памятью 350MB. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2009, 21:05:22 |
|
||
|
Выделение памяти в линуксах.
|
|||
|---|---|---|---|
|
#18+
Почитай про Java Application Launcer . Обрати внимание на параметр -Xms ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2009, 00:34:45 |
|
||
|
Выделение памяти в линуксах.
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2009, 01:22:26 |
|
||
|
Выделение памяти в линуксах.
|
|||
|---|---|---|---|
|
#18+
А почему вы забили на то, что я пишу, как у меня прекрасно запускается 5 java -Xmx1000M без свопа на 2 GB RAM ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2009, 07:47:07 |
|
||
|
Выделение памяти в линуксах.
|
|||
|---|---|---|---|
|
#18+
Вы мне рассказываете общую теорию, не обращая внимания на ситуацию с двумя разными линуксами - настоящим и виртуальным, о которых я говорю. У меня нет свопа и там и тут, но на настоящем линуксе (2GB) запускается 5 java -Xmx1000M, на виртуальном OpenVZ не хочет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2009, 07:50:32 |
|
||
|
Выделение памяти в линуксах.
|
|||
|---|---|---|---|
|
#18+
Зацените скриншот в следующем сообщении. В нём будет показана разница, между VIRT и RES. Свопа нет, но процессам позволяется выделить виртуальной памяти больше, чем есть физической. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2009, 11:29:13 |
|
||
|
Выделение памяти в линуксах.
|
|||
|---|---|---|---|
|
#18+
Скриншот - от невиртуального линукса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2009, 11:31:58 |
|
||
|
Выделение памяти в линуксах.
|
|||
|---|---|---|---|
|
#18+
mriadus wrote: > Вы мне рассказываете общую теорию, не обращая внимания на ситуацию с > двумя разными линуксами - настоящим и виртуальным, о которых я говорю. У > меня нет свопа и там и тут, но на настоящем линуксе (2GB) запускается 5 > java -Xmx1000M, на виртуальном OpenVZ не хочет. Я ничего не знаю про виртуальный линукс. Но подозреваю, что даже если внутри виртуального линукса нет свопа, виртуальная машина может предоставлять своим приложениям больше (или меньше) памяти, чем реальная оперативка, и использовать свои механизмы, аналогичные свопу системы. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2009, 12:49:51 |
|
||
|
Выделение памяти в линуксах.
|
|||
|---|---|---|---|
|
#18+
mriadusjava как-то так выделяет этот гиг памяти, что пять таких процессов прекрасно работают на 2GB RAM. Ситуация в том, что мне дали OpenVZ - виртуалку (VPS), память = 3.5GB, свопа нет. Я обломался запустить там 5 процессов java -Xmx1000M. Ява говорила, что не может инициализировать VM. Или в некоторых местах падала, не могла выделить память. Или вела себя странно (странность в том, что не могла вызвать fork, чтобы выполнить команду "chmod", например, причина - памяти не хватало (ловятся исключения, в исключении говорится "cannot allocate memory"). Ok, сорри за лишни детали. Ты можешь искусственно сымитировать ситуацию чтобы ошибка возникала сразу-же? И приведи тест который выдаёт стек исключений. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2009, 14:14:58 |
|
||
|
Выделение памяти в линуксах.
|
|||
|---|---|---|---|
|
#18+
maytonmriadusjava как-то так выделяет этот гиг памяти, что пять таких процессов прекрасно работают на 2GB RAM. Ситуация в том, что мне дали OpenVZ - виртуалку (VPS), память = 3.5GB, свопа нет. Я обломался запустить там 5 процессов java -Xmx1000M. Ява говорила, что не может инициализировать VM. Или в некоторых местах падала, не могла выделить память. Или вела себя странно (странность в том, что не могла вызвать fork, чтобы выполнить команду "chmod", например, причина - памяти не хватало (ловятся исключения, в исключении говорится "cannot allocate memory"). Ok, сорри за лишни детали. Ты можешь искусственно сымитировать ситуацию чтобы ошибка возникала сразу-же? И приведи тест который выдаёт стек исключений. Напишу длинный интересный рассказ (-; Каждый день её "имитирую" -> имитация заключается в выполнении двух стартовых скриптов hadoop :) Чтобы не заходить в тёмный лес, проще будет говорить, что эти скрипты выполняют просто запуск нескольких java -Xmx1000M . Первый скрипт создаёт два таких процесса, второй ещё два-три... Важный момент (у обоих процессов этот момент идентичен) - после запуска, на один такой процесс оказывается сожрано памяти: Код: plaintext 1. 2. А теперь фишка: (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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2009, 15:37:18 |
|
||
|
Выделение памяти в линуксах.
|
|||
|---|---|---|---|
|
#18+
Чесно говоря, не помю, чтобы в Linux, java форкала процессы. Хотя... может ошибаюсь. Сегодня приду домой - проверю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2009, 15:40:53 |
|
||
|
Выделение памяти в линуксах.
|
|||
|---|---|---|---|
|
#18+
Короче, два момента: (1) В обоих линуксах (железном и виртуальном) отжирается ~1.4G VIRT, 64M RES. (2) Но на железном линуксе сумма всех выделенных VIRT может превышать объём его RAM, а в OpenVZ не может. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2009, 15:41:14 |
|
||
|
Выделение памяти в линуксах.
|
|||
|---|---|---|---|
|
#18+
maytonЧесно говоря, не помю, чтобы в Linux, java форкала процессы. Хотя... может ошибаюсь. Сегодня приду домой - проверю. А в java разве нет чего-то типа "system()" или ещё чего такого? Нарыл стек исключений: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2009, 15:46:07 |
|
||
|
Выделение памяти в линуксах.
|
|||
|---|---|---|---|
|
#18+
Я не очень корректно выражаюсь про VIRT вообще, ибо он есть ещё и сумма всех замапленных в память файлов, всех шаред-либ и т.п., но чуЙства стараюсь передать) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2009, 22:18:45 |
|
||
|
Выделение памяти в линуксах.
|
|||
|---|---|---|---|
|
#18+
maytonЧесно говоря, не помю, чтобы в Linux, java форкала процессы. Хотя... может ошибаюсь. Сегодня приду домой - проверю. Под windows java создаёт потоки WindowsThread на каждый JavaThread. Плюс еще резервирует около 10 потоков для собстенных нужд. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2009, 23:48:20 |
|
||
|
Выделение памяти в линуксах.
|
|||
|---|---|---|---|
|
#18+
maytonmaytonЧесно говоря, не помю, чтобы в Linux, java форкала процессы. Хотя... может ошибаюсь. Сегодня приду домой - проверю. Под windows java создаёт потоки WindowsThread на каждый JavaThread. Плюс еще резервирует около 10 потоков для собстенных нужд. А программу внешнюю из java-программы выполнить как? Без создания ещё одного процесса? ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2009, 00:04:12 |
|
||
|
Выделение памяти в линуксах.
|
|||
|---|---|---|---|
|
#18+
Под Linux java создаёт потоки. В начале - в количестве девяти штук после бута а потом, по одному потоку на каждый работающий экземляр класса java.lang.Thread. Я только что убедился в этом используя top -H. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2009, 00:20:11 |
|
||
|
Выделение памяти в линуксах.
|
|||
|---|---|---|---|
|
#18+
А как в линуксе можно выполнить другую программу без создания нового процесса? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2009, 00:22:21 |
|
||
|
Выделение памяти в линуксах.
|
|||
|---|---|---|---|
|
#18+
mriadusА программу внешнюю из java-программы выполнить как? Без создания ещё одного процесса? ) Это требует отдельного обсуждения. Возм. такие технологии как JNI и будут запускать экземпляры процессов но тогда при чём тут java? Ведь в вашем случае, насколько я понял мы обсуждаем особенности работы pure java в окружении так называемой OpenVZ. Или не так? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2009, 00:23:31 |
|
||
|
Выделение памяти в линуксах.
|
|||
|---|---|---|---|
|
#18+
maytonmriadusА программу внешнюю из java-программы выполнить как? Без создания ещё одного процесса? ) Это требует отдельного обсуждения. Возм. такие технологии как JNI и будут запускать экземпляры процессов но тогда при чём тут java? Ведь в вашем случае, насколько я понял мы обсуждаем особенности работы pure java в окружении так называемой OpenVZ. Или не так? Не так. Наша речь о потоках началась с упоминания мной проблем с выполнением из java-программ других бинарей. Потом вы зачем-то написали о потоках. "зачем-то" я пишу потому, что я не в курсе, что можно запустить параллельное выполнение биаря с диска из моего процесса не создавая ещё одного процесса ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2009, 00:34:40 |
|
||
|
Выделение памяти в линуксах.
|
|||
|---|---|---|---|
|
#18+
Несколько вопросов. 1) Почему ты использовал java.lang.ProcessBuilder.start а не java.lang.Runtime.exec ? 2) Ты анализировал возможность утечки ресурсов вследствие того, что ты не контролируешь событие завершения процесса chmod? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2009, 00:47:20 |
|
||
|
Выделение памяти в линуксах.
|
|||
|---|---|---|---|
|
#18+
maytonНесколько вопросов. 1) Почему ты использовал java.lang.ProcessBuilder.start а не java.lang.Runtime.exec ? 2) Ты анализировал возможность утечки ресурсов вследствие того, что ты не контролируешь событие завершения процесса chmod? Не я автор софтины. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2009, 00:51:25 |
|
||
|
Выделение памяти в линуксах.
|
|||
|---|---|---|---|
|
#18+
И я не понял, зачем ты говоришь о потоках. Какое они имеют отношение к выполнению бинаря с диска? Могут разве использоваться для этого? Как мне подсказывает мой моск, нет ) Для параллельного (с нами) выполнения бинаря с диска делают (в юниск системах): fork() -> execve(); vfork() -> execve(); Вот я тормоз, то на ты, то на вы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2009, 00:56:00 |
|
||
|
|

start [/forum/topic.php?fid=16&msg=36366602&tid=1343670]: |
0ms |
get settings: |
8ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
216ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
64ms |
get tp. blocked users: |
1ms |
| others: | 206ms |
| total: | 528ms |

| 0 / 0 |
