LINUX.ORG.RU

Java создает дополнительные процессы в ubuntu server

 ,


1

1

В общем, есть самописный софт, он берет инфу через socket. Обрабатывает по определенным алгоритмам, сохраняет результаты в MySql. Программа многопоточная, написанна на яве.

На windows работает все хорошо, максимальная загрузка оперативной памяти 2Гб(всего 8Гб) при максимальной нагрузке. Нагрузка на ядро не больше 40% в пиковом режиме. Java --version 10.0.2

Проблема: На ubuntu 16.04, java --version 10.0.2 циклически создаются процессы, спустя 40 минут работы софта оперативная память забивает 8Гб (100% оперативной памяти) и 4 ядра процессора на 100%.

P.S. на «окнах» таких проблем нет. Кто может подсказать, в какую сторону копать? Т.к. в приоритете необходимо использовать ubuntu server, нежели окна. P.S.S Что в окнах, что в ubuntu - mysql-server и софт находятся на одной машине. Но результаты разные.

P.S.S.S Прошу не рекомендовать использовать «Окна»

Используй профилировщик на ubuntu или сними дамп памяти.

dave ★★★★★ ()

Из бесплатного есть Eclipse MAT, где можно изучать дамп.

dave ★★★★★ ()

На ubuntu 16.04, java --version 10.0.2 циклически создаются процессы

JVM самопроизвольно процессы не порождает. Копать в сторону скриптов запуска. Может там что-то воде watchdog который смотрит запущен ли процесс и если нет, то запускает процесс повторна, вот там может быть ошибка, в месте где происходит определении выполняется ли уже обработка.

Aber ★★★★ ()
Ответ на: Скрин от clydezX

Опра

Причем с оперативной памятью не ясно, бывает, что за 30 мин 8 ГБ, бывает что 2-4 за 30-60 минут.

clydezX ()
Ответ на: Опра от clydezX

У тебя там exception вылазит часто. Не может он привести к такому поведению?

dave ★★★★★ ()
Ответ на: Exeption от clydezX

Этот exception неправильный. Он означает, что в логике есть проблема. Не сетевая же ошибка. Код kanni.grand доступен? Что у вас там творится с ним? IDEA его подгружает? Как минимум, она умеет «дизассемблировать» байт-код.

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

Есть исходники этого кода, скинуть их не могу сюда, но интересна разница между работой окон с этим кодом, когда данных проблем не возникает и с ubuntu-server

clydezX ()
Ответ на: Скрин от clydezX

Нет, не поможет, как это процесс запускается? По крону? Вручную? Какая команда используется? java -jar project-priority-SNAPSHOT...? Если используется shell скрипт посмотри в него, как он порождает процессы, есть ли там циклы.

Из скриншотов я вижу только то, что процесс запущен из под рута, плохо. Для долгоживущих сервисов делают своего, системного пользователя с пермишенами только на те директории которые нужны сервису для выполнения работы. Это не касается текущей проблемы, просто лучшая практика на будущее.

Aber ★★★★ ()
Последнее исправление: Aber (всего исправлений: 1)
Ответ на: комментарий от clydezX

Этот exception и тот стектрейс вверху - зацепки.

И если я правильно понимаю, у вас все же один многопоточный процесс, а не много процессов? htop показывает потоки отдельной строчкой - так сложилось на линуксе исторически.

Если все же один процесс, то еще раз советую снять дамп. Это многое может прояснить. Дамп снимается одной простой командой с консоли. Это не корку сиплюсплюсную снять - на яве все очень быстро снимается. Тем более, один фиг у вас OOM.

dave ★★★★★ ()
Последнее исправление: dave (всего исправлений: 1)
Ответ на: комментарий от Aber

запускался из под пользователя без прав та же ситуация. запускался из под рута: Способ 1: Автостарт с помощью sh скрипта в init.d Способ 2: В ручную java - jar * Результаты одни и те же.

clydezX ()
Ответ на: Скрин от clydezX

Всё плохо, программа кривая.

Deleted ()
Ответ на: комментарий от clydezX

В ручную java - jar * Результаты одни и те же.

99.9% ошибка в коде этого приложения, поищи в коде «Runtime.getRuntime().exec» или «new ProcessBuilder», оба метода позволяют породить новый дочерний процесс, посмотри есть ли цикл (наверное есть), посмотри там логику принятия решения о запуске нового дочернего процесса. Хех, по логике цикла там может и не быть, посмотри дерево процессов: ps -aef --forest

Aber ★★★★ ()
Последнее исправление: Aber (всего исправлений: 1)
Ответ на: комментарий от Aber

Проверил, данные конструкции присутствуют в используемых библиотеках, но почему windows не создает дочерних процессов и работает нормально?

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

А не видно с какими параметрами новые процессы появляются?

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

Потому что программисты писали код на windows и не тестировали под linux. Как можно проверить запущен ли экземпляр приложения? Только средствами самой операционной системы. Например можно создать lock файл где-то не проверив работу такой схемы под linux, можно открыть сокет на конкретном порту (другой процесс уже не сможет), и наверное можно проверить по результату вывода команды для отображения списка запущенных процессов (не самый умный способ из-за латентности, и для каждой ос будет совя команда со своим форматом вывода).

Aber ★★★★ ()
Последнее исправление: Aber (всего исправлений: 1)
Ответ на: комментарий от clydezX

Судя по тому что в названии присутствует слово SNAPSHOT, значит ты работаешь непосредственно трудами с этой командой разработки, самая правильная стратегия просто писать баг репорт на трекере разработчиков, еще кинуть письмо лицу которое исполняет роль project-manager'а с описанием проблемы, чтоб твой баг не «утонул» среди прочих, он как погонщик должен расставить приоритеты и следить чтоб работа была исполнена.

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

Спасибо за информацию, так и сделаю. Начну продвигать разработку конкретно под ubuntu. Возможно разработку делали именно из под окон и в результате возникает такая проблема. Спасибо всем, кто откликнулся.

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

Ну без автора сего чуда ты ничего не сделаешь. Вот тебе гадание:

- Судя по скринам у вас там запускаются потоки, а не процессы (т.к. RES VIRT и т.п. колонки одинаковые, что крайне маловероятно обычно). Убедится можно, скрыв userland threads в настройках htop.

- Судя по логу (это уже совсем гадание), автор программы вполне моет не знать о ThreadPoolExecutor, и воротит потоки примерно как new Thread().start() - что есть не хорошо, но не страшно.

- Судя по результатам, эти потоки «текут» (гугли tread leak).

Почему текут? А тут хз. Судя по тому что автор ПО использует подчёркивания и в именах классов, он в java не местный, и не учится, а значит не умеет писать многопоточный код, возможно где-то race condition, возможно некое исключение (которого не видно, такие авторы часто их молча давят) вылетает и из-за него поток остаётся висеть.

Короче, сам ты тут ничего не сделашь, ну разве что ткнуть автора в его поделку и заставить переедлывать\исправлять. Если ты для него и начальства не авторитет, то можете заказать независимую экспертизу, у какого-нибудь специалиста (лучше сразу у нескольких, а то тоже нарвётесь на такого же), чтобы он вам описал проблемы вашей «программы».

Deleted ()
Последнее исправление: Deleted (всего исправлений: 2)
Ответ на: комментарий от Deleted

Спасибо за конструктивный ответ, буду копать в этом направлении

clydezX ()
Ответ на: комментарий от Aber

99.9% ошибка в коде этого приложения

Или в исходных данных для него. Точно это можно определить с помощью отладчика, чем должен заниматься афтар.

В сообщении об ошибке показано место ошибки - файл All_indicators.java, строка 264, и суть ошибки: ArrayOutOfBoundsException: -12 (индекс массива: -12 - вне диапазона. В Java индексы могут начинаться от 0). Значит, в этот Java-класс поступили неправильные данные. Они могут быть созданы в самой программе (ошибка в программе) или поступить в неё откуда-нибудь (например, из базы данных). Пусть афтар программы разбирается, администратор должен только описать ему ошибку.

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

так и есть, отправил информацию, в данный момент в режиме тестирования программы результаты в разы лучше

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