|
|
|
С чем едят JAVA_OPTS ?
|
|||
|---|---|---|---|
|
#18+
Поставили новый сервер. CentOS 6.3. Больше 100 ядер. Но одна злостная программулина, если задаёшь ей более 4 ядер, сваливается с ошибкой: A fatal error has been detected by the Java Runtime Environment: java.lang.OutOfMemoryError: Cannot create GC thread. Out of system resources. Internal Error (gcTaskThread.cpp:38), pid=122484, tid=140387071719168 Error: Cannot create GC thread. Out of system resources. JRE version: 6.0_21-b06 Java VM: Java HotSpot(TM) 64-Bit Server VM (17.0-b16 mixed mode linux-amd64) Полистал интернеты, нашёл, что надо играться с JAVA_OPTS, но не могу найти правил игры, к тому же в javой ни разу не игрался. 1. Где прописывать параметры? Есть какой-то специальный конфигурационный файл java или можно прямо в .cshrc ? 2. Где найти описания всех ключей? Или хотя бы какие ключи тут подойдут? Нашёл описание параметра XmsIm, где говорится о размере кучи. Чё ещё за куча? И как вычислить I ? Только экспериментальным путём? __________________________________________________________________ Учиться на ошибках, особенно чужих, значит сделать свою жизнь скучной. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2013, 14:34:57 |
|
||
|
С чем едят JAVA_OPTS ?
|
|||
|---|---|---|---|
|
#18+
JAVA_OPTS это переменная которую обычно используют при запуске скрипты серверов приложений. Тут всё зависит от того как именно вы свою программу запускаете. По поводу ошибки, надо гуглить gcTaskThread.cpp:38. Больше похоже на багу JVM. Ну, и можно попробовать поменять тип GC. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2013, 14:58:21 |
|
||
|
С чем едят JAVA_OPTS ?
|
|||
|---|---|---|---|
|
#18+
Гуглил и gcTaskThread.cpp:38 гуглил, и Garbage Collection. В итоге, там тоже все пытаются менять параметры Xms и Xmx. А кроме GC какие ещё бывают? И как это скажется на приложении? Или приложение вообще не понимает с чем имеет дело? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2013, 15:09:03 |
|
||
|
С чем едят JAVA_OPTS ?
|
|||
|---|---|---|---|
|
#18+
Кстати, в сервере приложений (я думаю, что это он) нашёл лишь одну строчку со словом JAVA: export SM_XMX=4096m А как вообще посмотреть сейчасные данные по JAVA_OPTS ? echo, естественно, говорит, что такой переменной вообще нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2013, 15:18:24 |
|
||
|
С чем едят JAVA_OPTS ?
|
|||
|---|---|---|---|
|
#18+
Кoличество GC thread'ов зависит от реализации на конкретной платформе. На Win, как я помню, равно количеству ядер. 1 ядро - 1 GC thread 4 ядра - 4 GC thread'а 100 ядер - 100 GC thread'ов (никогда не видел 100 ядер) Может вашему новому серверу тяжко создать 100 thread'ов на выделенной памяти. Можно либо памяти процессу дать побольше, либо уменьшить количество GC thread'ов -XX:ParallelGCThreads=1 (или -XX:ConcGCThreads=1 - черт его знает, какой там default'овый на CentOS). Один GC thread ваш сервер уж должен осилить.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2013, 16:10:04 |
|
||
|
С чем едят JAVA_OPTS ?
|
|||
|---|---|---|---|
|
#18+
Im27thКстати, в сервере приложений (я думаю, что это он) нашёл лишь одну строчку со словом JAVA: export SM_XMX=4096m А как вообще посмотреть сейчасные данные по JAVA_OPTS ? echo, естественно, говорит, что такой переменной вообще нет. Какой сервер приложения и как вы его запускаете? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2013, 16:18:07 |
|
||
|
С чем едят JAVA_OPTS ?
|
|||
|---|---|---|---|
|
#18+
ParallelGCThreads или ConcGCThreads - этo и есть ключи Их мoжно указать прямо в командной строке, если запускаешь java напрямую (а не через какой-нибудь командный файл). А если запускаешь java именно через какой-нибудь командный файл (например Tomcat), то, чтобы передать ключи в java, есть два пути: 1. Поменять командный файл, что коряво. 2. Передать ключи в командный файл, а уж он их передаст в java. Сработает, если командный файл достаточно умный. Вот в Tomcat'e для этого надо задать в переменной JAVA_OPTS желаемые ключи перед вызовом командного файла. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2013, 16:21:52 |
|
||
|
С чем едят JAVA_OPTS ?
|
|||
|---|---|---|---|
|
#18+
Там 8 процессоров по 10 ядер по 2 потока. До 4 ядер ошибки нет. Некое никому неизвестное приложение SeisSpace. У него есть сервер - некий sitemanager. В нём много чего оказалось от java: # SM_XMX (Maximum Java Heap Size) # The default value for the SiteManager is 1024m but # can be modified with the export below. export SM_XMX=16000m было 4096m LGC_JAVA_XMX=4096m было 1024m JAVAFLAGS="$JAVAFLAGS -Xmx${LGC_JAVA_XMX} -Dcom.lgc.prowess.java.maxheap=512m" было 64m Теперь ошибка другая: 0: Error occurred during initialization of VM 0: Cannot create VM thread. Out of system resources. S: Current job state = Initializing however we have a bad exit code, setting job state to failed S: Phase updated - Failed No final report available Видимо я зря ВСЕ параметры увеличил. Я так понимаю, что что-то надо увеличивать - какой-то общий параметр, а что-то надо уменьшать - какие-то частные параметры, относящиеся к каждому потоку отдельно. JAVA_OPTS включал в различные файлы - не захватываются. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2013, 17:11:46 |
|
||
|
С чем едят JAVA_OPTS ?
|
|||
|---|---|---|---|
|
#18+
J.Serge А как бы доковыряться до того места, где лежат параметры ParallelGCThreads или ConcGCThreads ? Во-первых, чтобы узнать чему нынешний параметр равен? Во-вторых, чтобы поменять его. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2013, 17:24:05 |
|
||
|
С чем едят JAVA_OPTS ?
|
|||
|---|---|---|---|
|
#18+
Eсли "До 4 ядер ошибки нет" - ну и запускай на 4. Или надо именно на всех? JAVA_OPTS у тебя называется JAVAFLAGS. Сделай так: JAVAFLAGS="$JAVAFLAGS -XX:+UseSerialGC -Xmx${LGC_JAVA_XMX} -Dcom.lgc.prowess.java.maxheap=64m" Будет использоваться serialGC без кучи thread'ов. Почитай про GC и настраивай, как тебе надо. Посмотреть текущие значения можно через JConsole ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2013, 19:41:12 |
|
||
|
С чем едят JAVA_OPTS ?
|
|||
|---|---|---|---|
|
#18+
Im27th, попробуйте методом тыка на скольких ядрах оно еще заустится у ос есть ограничение на максимальное кол-во процессов-потоков, проверьте правильно ли там все выставлено ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2013, 23:48:21 |
|
||
|
С чем едят JAVA_OPTS ?
|
|||
|---|---|---|---|
|
#18+
Методом тыка давно всё испробовано. Запускается только на 4 ядрах. Если на 5, то иногда пишет, что не может создать GCThread, иногда, что не может создать VMThread. Если на 6 и больше, то всегда пишет, что не может создать GCThread. При запущенной JConsole вообще только на 2 ядрах задания в программе запускаются, а более - вылетает, то есть JConsole отъедает ещё часть ресурсов. ХОТЯ JConsole и программа пользуются разными javaми. JConsole - системной Java HotSpot 64-Bit Server VM version 11.2-b-01 а программа - своей Java HotSpot 64-Bit Server VM version 17.0-b16 Не нашёл где в JConsole увидеть значения по умолчанию. Параметров много, но все они без значений, выглядит это примерно так: По графикам видно, что для новые Threadы создаются и для них есть место. При создании новых Threadы - пик ещё поднимается, то есть как бы лимит не превышен. -XX:+UseSerialGC не помогло увеличение kernel.core_pipe_limit не помогло Сижу читаю про GC, смотрю в JConsole. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2013, 12:52:33 |
|
||
|
С чем едят JAVA_OPTS ?
|
|||
|---|---|---|---|
|
#18+
Im27thМетодом тыка давно всё испробовано. Запускается только на 4 ядрах. Если на 5, то иногда пишет, что не может создать GCThread, иногда, что не может создать VMThread. Если на 6 и больше, то всегда пишет, что не может создать GCThread. При запущенной JConsole вообще только на 2 ядрах задания в программе запускаются, а более - вылетает, то есть JConsole отъедает ещё часть ресурсов. Похоже проблема не совсем в Java. Где-то такие процессу установлен лимит в 4 ядра. Java запускается. Оппа - 5е ядро. Сейчас-ка я его заюзаю. А ОС говорит что ядро доступно, а при попытке использования - дули крутит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2013, 12:57:56 |
|
||
|
С чем едят JAVA_OPTS ?
|
|||
|---|---|---|---|
|
#18+
Blazkowicz Именно поэтому и увеличивал kernel.core_pipe_limit с 4 сначала до 8, потом до 12, но ничего вообще не изменилось. Кстати, после просмотра графиков подумал, что ядра и threadы связаны совсем не линейно, то есть при задании 8 ядер - это не означает, что создадутся 8 новых threadов, видимо не так я понимал их суть. И ещё меня удивило, что сервер приложений и само приложение запускают каждый свою JVM. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2013, 13:05:10 |
|
||
|
С чем едят JAVA_OPTS ?
|
|||
|---|---|---|---|
|
#18+
Im27th Blazkowicz Именно поэтому и увеличивал kernel.core_pipe_limit с 4 сначала до 8, потом до 12, но ничего вообще не изменилось. А если 0? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2013, 13:10:05 |
|
||
|
С чем едят JAVA_OPTS ?
|
|||
|---|---|---|---|
|
#18+
С 0 тоже самое. С -XX:ParallelGCThreads=разные цыфры тоже самое. В общем, думаю я, что это всё-таки системное. Пользователи сказали, что на старом сервере они запускали и с 8 и с 16 нодами. А там программу я ставил также один в один как и здесь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2013, 15:10:06 |
|
||
|
С чем едят JAVA_OPTS ?
|
|||
|---|---|---|---|
|
#18+
Im27thС 0 тоже самое. С -XX:ParallelGCThreads=разные цыфры тоже самое. В общем, думаю я, что это всё-таки системное. Пользователи сказали, что на старом сервере они запускали и с 8 и с 16 нодами. А там программу я ставил также один в один как и здесь. Зовите админа. Пусть смотрит, вдруг ещё какие ограничение есть на процесс или на юзера. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2013, 15:13:01 |
|
||
|
С чем едят JAVA_OPTS ?
|
|||
|---|---|---|---|
|
#18+
Вся грусть в том, что я и есть админ. Просто с java ни разу глубоко не работал. Системы ставились до меня, но менять любые параметры могу сколько угодно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2013, 16:20:04 |
|
||
|
С чем едят JAVA_OPTS ?
|
|||
|---|---|---|---|
|
#18+
Im27th, ulimit -a что показывает? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2013, 16:22:54 |
|
||
|
С чем едят JAVA_OPTS ?
|
|||
|---|---|---|---|
|
#18+
А /proc/{pid}/limits ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2013, 16:24:23 |
|
||
|
С чем едят JAVA_OPTS ?
|
|||
|---|---|---|---|
|
#18+
Да, ulimit я тоже смотрел, но единственное, что мне не понравилось - это max user processes (-u) 1024 Надо будет увеличить для пользователей, но для этого нужна перезагрузка, а сейчас пока никак, и в любом случае не думаю, что дело в этом, ибо все другие программы работают нормально. core file size (blocks, -c) 0 data seg size (kbytes, -d) unlimited scheduling priority (-e) 0 file size (blocks, -f) unlimited pending signals (-i) 8271882 max locked memory (kbytes, -l) 64 max memory size (kbytes, -m) unlimited open files (-n) 1024 pipe size (512 bytes, -p) 8 POSIX message queues (bytes, -q) 819200 real-time priority (-r) 0 stack size (kbytes, -s) 10240 cpu time (seconds, -t) unlimited max user processes (-u) 1024 virtual memory (kbytes, -v) unlimited file locks (-x) unlimited Все остальные параметры примерно как на старых серверах. Пока не могу посмотреть /proc/pid/limits, ибо пользователи забрали единственную лицензию для работы на другом сервере. Так что завтра утром продолжу эксперименты. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2013, 17:15:50 |
|
||
|
С чем едят JAVA_OPTS ?
|
|||
|---|---|---|---|
|
#18+
Im27th, нy а обычные java-програмки запускаются на том самом JDK, на котором крутится приложение, на 100 ядрах? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2013, 18:19:20 |
|
||
|
С чем едят JAVA_OPTS ?
|
|||
|---|---|---|---|
|
#18+
Так нету других java-программ. /proc/89655/limits Limit Soft Limit Hard Limit Units Max cpu time unlimited unlimited seconds Max file size unlimited unlimited bytes Max data size unlimited unlimited bytes Max stack size 10485760 unlimited bytes Max core file size 0 unlimited bytes Max resident set unlimited unlimited bytes Max processes 1024 8271882 processes Max open files 4096 4096 files Max locked memory 65536 65536 bytes Max address space unlimited unlimited bytes Max file locks unlimited unlimited locks Max pending signals 8271882 8271882 signals Max msgqueue size 819200 819200 bytes Max nice priority 0 0 Max realtime priority 0 0 Max realtime timeout unlimited unlimited us Но самое главное, что видимо никакие ухищрения менять параметры в конфиг-файлах не подхватывались. Я нашёл настройки в самой программе, поменял их и всё заработало. ВРОДЕ БЫ. Теперь надо изучать java и GC, все параметры, чёкуда, чёкак, а то может быть Serial медленней, чем Parallel (не зря же разработчики по умолчанию поставили такое значение?) или ещё какая-нибудь гадость позже вылезит. Но жрёт оно, конечно, нефигово: PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 92587 prouser 30 10 6331m 1.0g 23m S 99.6 0.1 15:17.07 ssexec 92589 prouser 30 10 6331m 933m 23m S 103.9 0.1 15:17.17 ssexec 92581 prouser 30 10 6332m 926m 23m S 99.6 0.1 15:16.52 ssexec 92590 prouser 30 10 6676m 893m 24m S 6.1 0.1 0:18.44 ssexec 92585 prouser 30 10 6331m 878m 23m S 99.6 0.1 15:16.40 ssexec 92588 prouser 30 10 6332m 874m 23m S 105.8 0.1 15:16.16 ssexec 92586 prouser 30 10 6397m 874m 23m S 99.6 0.1 15:15.63 ssexec 92584 prouser 30 10 6331m 874m 23m S 99.6 0.1 15:15.80 ssexec 92583 prouser 30 10 6332m 870m 23m S 100.0 0.1 15:16.73 ssexec 92582 prouser 30 10 6332m 867m 23m S 100.0 0.1 15:16.53 ssexec 89655 prouser 20 0 13.6g 867m 24m S 0.3 0.1 1:40.21 java 89311 prouser 20 0 25.3g 563m 16m S 0.3 0.1 0:12.93 java 92415 prouser 20 0 40.6g 123m 17m S 0.0 0.0 0:03.63 java ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.04.2013, 10:40:06 |
|
||
|
С чем едят JAVA_OPTS ?
|
|||
|---|---|---|---|
|
#18+
Im27thТеперь надо изучать java и GC, все параметры, чёкуда, чёкак, а то может быть Serial медленней, чем Parallel [i](не зря же разработчики по умолчанию поставили такое значение?) Serial должен быть быстрее, в целом, но от приводит к долгим stop-the-world паузам при сборке. Если система просто процессит какие-то данные и важно время достижения конкретной цели, то ок. А если это сервер обслуживающий множество юзеров, то Serial не подходит. Так как JVM может остановить все потоки и пол минуты собирать мусор. Юзеры всё это время будут ждать ответа от сервера. https://blogs.oracle.com/jonthecollector/entry/our_collectors ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.04.2013, 10:44:45 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=38238031&tid=2128214]: |
0ms |
get settings: |
7ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
178ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
45ms |
get tp. blocked users: |
1ms |
| others: | 198ms |
| total: | 456ms |

| 0 / 0 |
