Ну определенно, проблемы бывают. А что за проблемы можно узнать поподробнее? Ограничение JVM в чем именно - по расходу памяти (например, сравните, сколько весит Java String "hello, world!" и сколько аналогичная строка в C++ если строка однобайтовая), или сколько весит Long vs. long. по управлению хипом и GC, по работе сетевого стека, по выполнению JIT-тернутого кода? Мне интересно стало. И что за железо, спарки, x86/64, что за OS?Flash-04 wrote:sorry за оффтоп, по работе плотно общаюсь с SIEM (security events management) системами, которые все как один написаны на Java. так там давно уже уперлись в ограничения JVM из-за которых даже на могучем "железе" производительность аховая. Я всё жду, что будут создатели их систем с этим безобразием делать? Как-то не верится что они бросятся переписывать всё на C++crypto5 wrote:Твиттер например, и фейсбук на Ц++ наверное уже на большую половину написан.
Java ThreadPoolExecutor - достучаться до working threads
-
- Уже с Приветом
- Posts: 6969
- Joined: 26 Feb 2011 17:40
Re: Java ThreadPoolExecutor - достучаться до working threads
-
- Уже с Приветом
- Posts: 63430
- Joined: 03 Nov 2004 05:31
- Location: RU -> Toronto, ON
Re: Java ThreadPoolExecutor - достучаться до working threads
вот тут более релевантно:
http://stackoverflow.com/questions/9104 ... t-on-linux
http://stackoverflow.com/questions/9104 ... t-on-linux
Not everyone believes what I believe but my beliefs do not require them to.
-
- Уже с Приветом
- Posts: 13684
- Joined: 16 Jan 2001 10:01
Re: Java ThreadPoolExecutor - достучаться до working threads
Не слышал о таком. Можно подробнее?Flash-04 wrote: 2. Ограничения JVM на кол-во сетевых соединений (для коллекторов)
Вообще-то график memory allocation JVM должен выглядить как пила.3. Ограничения производительносьти JVM связанные с garbage collectors. Для "правил" требуется много памяти, т.к. создается дофига динамических объектов, которые кроме того имеют малое время жизни. В итоге очень забавно смотреть на график memory allocation JVM, выглядит как пила. В итоге при росте нагрузки JVM только и занимается "сборкой мусора".
У моего любимого вендора для одного коннектора эмпирическое ограничение - всего 1,000 записей в секунду, потом коннектор становится неустойчивым и "падает". Причем "падает" не приложение, а весь JVM контейнер.
Я конечно не знаю подробностей, но однажды воевал именно с такой проблемой. Причём успешно. Ключевые слова - generations, growth rate of old generation... есть много литературы по этому поводу.
Забавно что моя драма имела совершенно неожиданный поворот сюжета: как оказалось, память засорялась совсем не там где мы думали - наше приложение тоже создавало кучу короткоживущих объектов, но утечка памяти была внутри JBoss, который создавал кучу объектов-долгожителей. Наши объекты практически не двигали стрелку...
Наш случай конечно показывает что Java sucks, но не потому что у ней внутри Garbage Collector. А потому что java породила монстроидально сложные решения, которые используются даже для простых случаев. Всё равно что создавать мелкие частные фирмы используя Газпром в качестве платформы.
-
- Уже с Приветом
- Posts: 6969
- Joined: 26 Feb 2011 17:40
Re: Java ThreadPoolExecutor - достучаться до working threads
А что за ограничение БД? И какая сейчас используется? У вас Java NIO используется как я понимаю, селекторы?Flash-04 wrote:известна. там совокупность нескольких факторов (кстати предел у всех примерно одинаков):
1. ограничения SQL БД которая используется для хранения собираемых данных. Там я смотрю есть тенденция "переползать" на облегченные версии MySQL/Postgress
2. Ограничения JVM на кол-во сетевых соединений (для коллекторов)
3. Ограничения производительносьти JVM связанные с garbage collectors. Для "правил" требуется много памяти, т.к. создается дофига динамических объектов, которые кроме того имеют малое время жизни. В итоге очень забавно смотреть на график memory allocation JVM, выглядит как пила. В итоге при росте нагрузки JVM только и занимается "сборкой мусора".
У моего любимого вендора для одного коннектора эмпирическое ограничение - всего 1,000 записей в секунду, потом коннектор становится неустойчивым и "падает". Причем "падает" не приложение, а весь JVM контейнер.
-
- Уже с Приветом
- Posts: 63430
- Joined: 03 Nov 2004 05:31
- Location: RU -> Toronto, ON
Re: Java ThreadPoolExecutor - достучаться до working threads
В данный момент RHL-4 x64, памяти там сколько хочешь (20Gb, но для JVM выделено 6Gb).Zorkus wrote:Ну определенно, проблемы бывают. А что за проблемы можно узнать поподробнее? Ограничение JVM в чем именно - по расходу памяти (например, сравните, сколько весит Java String "hello, world!" и сколько аналогичная строка в C++ если строка однобайтовая), или сколько весит Long vs. long. по управлению хипом и GC, по работе сетевого стека, по выполнению JIT-тернутого кода? Мне интересно стало. И что за железо, спарки, x86/64, что за OS?
Сервер то не особо загружен, но вендор говорит что какое железо ни ставь, выше 3000 событий в секунду их софт не осилит (а у нас в перспективе и 10,000 на него не особо трудно возложить).
Not everyone believes what I believe but my beliefs do not require them to.
-
- Уже с Приветом
- Posts: 63430
- Joined: 03 Nov 2004 05:31
- Location: RU -> Toronto, ON
Re: Java ThreadPoolExecutor - достучаться до working threads
Oracle. ограничение простое - жрёт многоZorkus wrote:А что за ограничение БД? И какая сейчас используется? У вас Java NIO используется как я понимаю, селекторы?
Что там у вендора в Java приложении наворочано, я без понятия. Я всего лишь юзер, хоть и software programming background
Not everyone believes what I believe but my beliefs do not require them to.
-
- Уже с Приветом
- Posts: 63430
- Joined: 03 Nov 2004 05:31
- Location: RU -> Toronto, ON
Re: Java ThreadPoolExecutor - достучаться до working threads
я привел ссылочку выше. там вроде как не получается слишком быстро открывать новые соединения.Palych wrote:Не слышал о таком. Можно подробнее?
Not everyone believes what I believe but my beliefs do not require them to.
-
- Уже с Приветом
- Posts: 63430
- Joined: 03 Nov 2004 05:31
- Location: RU -> Toronto, ON
Re: Java ThreadPoolExecutor - достучаться до working threads
это понятно, но в разумных пределах. При хорошей нагрузке получается что в какие-то моменты системе надо бы память почистить и при это не останавливаться на обработку новых данных которые никого ждать не собираются.Palych wrote:Вообще-то график memory allocation JVM должен выглядить как пила.
лог когда смотришь, вначале идет куча сообщений об иницилизации того или иного фреймворка. понятно что overhead значительный в итоге.А потому что java породила монстроидально сложные решения, которые используются даже для простых случаев. Всё равно что создавать мелкие частные фирмы используя Газпром в качестве платформы.
Not everyone believes what I believe but my beliefs do not require them to.
-
- Уже с Приветом
- Posts: 4195
- Joined: 27 Apr 2011 03:43
- Location: Сергели ->Chicago
Re: Java ThreadPoolExecutor - достучаться до working threads
могу ошибаться, но что то мне подсказывает что виноваты не ограничения java, а ограничения программистовFlash-04 wrote:известна. там совокупность нескольких факторов (кстати предел у всех примерно одинаков):
1. ограничения SQL БД которая используется для хранения собираемых данных. Там я смотрю есть тенденция "переползать" на облегченные версии MySQL/Postgress
2. Ограничения JVM на кол-во сетевых соединений (для коллекторов)
3. Ограничения производительносьти JVM связанные с garbage collectors. Для "правил" требуется много памяти, т.к. создается дофига динамических объектов, которые кроме того имеют малое время жизни. В итоге очень забавно смотреть на график memory allocation JVM, выглядит как пила. В итоге при росте нагрузки JVM только и занимается "сборкой мусора".
У моего любимого вендора для одного коннектора эмпирическое ограничение - всего 1,000 записей в секунду, потом коннектор становится неустойчивым и "падает". Причем "падает" не приложение, а весь JVM контейнер.
-
- Уже с Приветом
- Posts: 63430
- Joined: 03 Nov 2004 05:31
- Location: RU -> Toronto, ON
Re: Java ThreadPoolExecutor - достучаться до working threads
возможно. но почему падает JVM?
ещё раз подчеркну - на рынке несколько схожих продуктов, ограничения практически одинаковые. silver bullet пока нет. ждёмс
и эта, sorry за офтоп
ещё раз подчеркну - на рынке несколько схожих продуктов, ограничения практически одинаковые. silver bullet пока нет. ждёмс
и эта, sorry за офтоп
Not everyone believes what I believe but my beliefs do not require them to.
-
- Уже с Приветом
- Posts: 4195
- Joined: 27 Apr 2011 03:43
- Location: Сергели ->Chicago
Re: Java ThreadPoolExecutor - достучаться до working threads
вот об этом и должны задуматься разработчики.Flash-04 wrote:возможно. но почему падает JVM?
1) разобраться почему падает
2) понять, можно ли задизайнить так чтобы не падало
(например из вышесказаного: не плодить миллион мелких объектов, реюзать потоки, распаралелить на несколько jvm или перейти на другой язык)
3) накодить так чтобы не падало
такие косяки выходят из неверного дизайна, если те же дизайнеры, а язык С++ то наврядли вас это спасет.
-
- Уже с Приветом
- Posts: 13684
- Joined: 16 Jan 2001 10:01
Re: Java ThreadPoolExecutor - достучаться до working threads
Java умеет очищать память не останавливая работы. И делает это весьма эффективно.Flash-04 wrote:это понятно, но в разумных пределах. При хорошей нагрузке получается что в какие-то моменты системе надо бы память почистить и при это не останавливаться на обработку новых данных которые никого ждать не собираются.Palych wrote:Вообще-то график memory allocation JVM должен выглядить как пила.
-
- Уже с Приветом
- Posts: 17281
- Joined: 07 Sep 2011 10:05
- Location: Seattle, WA
Re: Java ThreadPoolExecutor - достучаться до working threads
И да и нет. Даже новый G1 garbage collector иногда останавливает работу, хотя делает это реже и на более короткие интервалы, чем старые gc на тех же задачах.Palych wrote:Java умеет очищать память не останавливая работы. И делает это весьма эффективно.Flash-04 wrote:это понятно, но в разумных пределах. При хорошей нагрузке получается что в какие-то моменты системе надо бы память почистить и при это не останавливаться на обработку новых данных которые никого ждать не собираются.Palych wrote:Вообще-то график memory allocation JVM должен выглядить как пила.
-
- Уже с Приветом
- Posts: 6969
- Joined: 26 Feb 2011 17:40
Re: Java ThreadPoolExecutor - достучаться до working threads
Ну так как вы знаете, JVM падает потому, что она не порождает массу легким мелких процессов, а треды внутри JVM не имеют раздельного хипа и прочее. Где нибудь OOM в одном треде и все. А если они еще и вызывают нативный код на каком-нибудь уровне через JNI - любой выход на границу массива или повисший указатель в нем, JVM падаетFlash-04 wrote:возможно. но почему падает JVM?
ещё раз подчеркну - на рынке несколько схожих продуктов, ограничения практически одинаковые. silver bullet пока нет. ждёмс
и эта, sorry за офтоп
-
- Уже с Приветом
- Posts: 63430
- Joined: 03 Nov 2004 05:31
- Location: RU -> Toronto, ON
Re: Re: Java ThreadPoolExecutor - достучаться до working thr
Java 7?Интеррапт wrote:И да и нет. Даже новый G1 garbage collector иногда останавливает работу, хотя делает это реже и на более короткие интервалы, чем старые gc на тех же задачах.Palych wrote:Java умеет очищать память не останавливая работы. И делает это весьма эффективно.Flash-04 wrote:это понятно, но в разумных пределах. При хорошей нагрузке получается что в какие-то моменты системе надо бы память почистить и при это не останавливаться на обработку новых данных которые никого ждать не собираются.Palych wrote:Вообще-то график memory allocation JVM должен выглядить как пила.
Not everyone believes what I believe but my beliefs do not require them to.
-
- Уже с Приветом
- Posts: 6969
- Joined: 26 Feb 2011 17:40
Re: Re: Java ThreadPoolExecutor - достучаться до working thr
его добавили в 6 яве еще, довольно давно, просто там он выключен по умолчанию.Flash-04 wrote:Java 7?Интеррапт wrote:И да и нет. Даже новый G1 garbage collector иногда останавливает работу, хотя делает это реже и на более короткие интервалы, чем старые gc на тех же задачах.Palych wrote:Java умеет очищать память не останавливая работы. И делает это весьма эффективно.Flash-04 wrote:это понятно, но в разумных пределах. При хорошей нагрузке получается что в какие-то моменты системе надо бы память почистить и при это не останавливаться на обработку новых данных которые никого ждать не собираются.Palych wrote:Вообще-то график memory allocation JVM должен выглядить как пила.
-
- Уже с Приветом
- Posts: 17281
- Joined: 07 Sep 2011 10:05
- Location: Seattle, WA
Re: Re: Java ThreadPoolExecutor - достучаться до working thr
В Java 6 появилось. С каким-то из апдейтов (update 14 или 15, не помню). Правда включать нужно было явно -XX:+UseG1GCFlash-04 wrote:Java 7?Интеррапт wrote: И да и нет. Даже новый G1 garbage collector иногда останавливает работу, хотя делает это реже и на более короткие интервалы, чем старые gc на тех же задачах.
(упс, не заметил, что Zorkus уже ответил)
-
- Уже с Приветом
- Posts: 63430
- Joined: 03 Nov 2004 05:31
- Location: RU -> Toronto, ON
Re: Java ThreadPoolExecutor - достучаться до working threads
ага, интересно, можно попробовать включить его принудительно.
Not everyone believes what I believe but my beliefs do not require them to.
-
- Уже с Приветом
- Posts: 3647
- Joined: 23 May 2010 15:10
Re: Java ThreadPoolExecutor - достучаться до working threads
1. а в чем конкретно затык на базе?Flash-04 wrote:известна. там совокупность нескольких факторов (кстати предел у всех примерно одинаков):
1. ограничения SQL БД которая используется для хранения собираемых данных. Там я смотрю есть тенденция "переползать" на облегченные версии MySQL/Postgress
2. Ограничения JVM на кол-во сетевых соединений (для коллекторов)
3. Ограничения производительносьти JVM связанные с garbage collectors. Для "правил" требуется много памяти, т.к. создается дофига динамических объектов, которые кроме того имеют малое время жизни. В итоге очень забавно смотреть на график memory allocation JVM, выглядит как пила. В итоге при росте нагрузки JVM только и занимается "сборкой мусора".
У моего любимого вендора для одного коннектора эмпирическое ограничение - всего 1,000 записей в секунду, потом коннектор становится неустойчивым и "падает". Причем "падает" не приложение, а весь JVM контейнер.
остальные - ежели сесть на белого коня и достать меч богатырский
2. скинуть транспорт в native код
3. пулы объектов в таких случаях должны сильно помогать. Либо есть еще один класс систем, у которых поток вертится на верхушки стека, создаются много много много мелких объектов, но в концу цикла обработки они все garbage (asp.net по этой модели сделан)
-
- Уже с Приветом
- Posts: 3647
- Joined: 23 May 2010 15:10
Re: Java ThreadPoolExecutor - достучаться до working threads
зырьте java sockets + niovalchkou wrote:Извините, а это что за зверь? дайте ссыль почитать если естьFlash-04 wrote: 2. Ограничения JVM на кол-во сетевых соединений (для коллекторов)
http://www.java2s.com/Code/Java/Network ... server.htm
-
- Уже с Приветом
- Posts: 63430
- Joined: 03 Nov 2004 05:31
- Location: RU -> Toronto, ON
Re: Java ThreadPoolExecutor - достучаться до working threads
requests multiplier. один запрос из Java приложения порождает 5-10 запросов к БД. Только не спрашивайте меня почему, это мне говорили консультанты интегратора которые собаку съели на этом продукте.Alexandr wrote:1. а в чем конкретно затык на базе?
о!2. скинуть транспорт в native код
Not everyone believes what I believe but my beliefs do not require them to.
-
- Posts: 16
- Joined: 26 Jun 2002 02:04
Re: Java ThreadPoolExecutor - достучаться до working threads
А что если использовать ThreadFactory (передать параметром в constructor ThreadPoolExecutor) и в этой Factory все Threads создавать в одной ThreadGroup?Montchik wrote:Это понятно. Мне бы только до этого runnable добраться...
Тогда все созданные Threds можно enumerate через ThreadGroup.
[Сам не пробовал. Если получится - дайте знать.]
-
- Уже с Приветом
- Posts: 17281
- Joined: 07 Sep 2011 10:05
- Location: Seattle, WA
Re: Java ThreadPoolExecutor - достучаться до working threads
Я, честно говоря, вообще не понимаю, в чем смысл собственно получить доступ к списку threads, так мы от ТС этого и не добились. Ведь по большму счету, у вас может быть, например, с десяток threads в пуле и штук 100 разных Runnable's собственно с задачами, которые переодически на этом десятке thread-ов будут выполнятся. В чем тогда поинт получить ссылку на worker thread, если ты все равно не знаешь, какой в данный момент на этом thread выполняется runnable и как следствие ты с этим runnable не можешь взаимодействовать? В то время, как если иметь свой hash map, куда добавлять/удалять runntable/thread в beforeExecute/afterExecute, то ты как бы всегда знаешь активные runnable и на каком thread он выполняется. И всегда можешь послать interrupt() этому потоку (ну и это уже дело автора, корректно имплементировать runnable, для обработки interrupt).Gnome wrote:А что если использовать ThreadFactory (передать параметром в constructor ThreadPoolExecutor) и в этой Factory все Threads создавать в одной ThreadGroup?Montchik wrote:Это понятно. Мне бы только до этого runnable добраться...
Тогда все созданные Threds можно enumerate через ThreadGroup.
[Сам не пробовал. Если получится - дайте знать.]
-
- Уже с Приветом
- Posts: 4637
- Joined: 24 Oct 2009 01:38
- Location: Chicago ;-) -> SFBA!
Re: Java ThreadPoolExecutor - достучаться до working threads
А есть уверенность что executorservice от этого не поломается?Интеррапт wrote:И всегда можешь послать interrupt() этому потокуGnome wrote:А что если использовать ThreadFactory (передать параметром в constructor ThreadPoolExecutor) и в этой Factory все Threads создавать в одной ThreadGroup?Montchik wrote:Это понятно. Мне бы только до этого runnable добраться...
Тогда все созданные Threds можно enumerate через ThreadGroup.
[Сам не пробовал. Если получится - дайте знать.]
In vino Veritas!
-
- Уже с Приветом
- Posts: 13684
- Joined: 16 Jan 2001 10:01
Re: Java ThreadPoolExecutor - достучаться до working threads
IMHO, в этой hash map лучше хранить не runnable, а то что надобно обрабатывать/сигналить/убивать.Интеррапт wrote:В то время, как если иметь свой hash map, куда добавлять/удалять runntable/thread в beforeExecute/afterExecute, то ты как бы всегда знаешь активные runnable и на каком thread он выполняется. И всегда можешь послать interrupt() этому потоку (ну и это уже дело автора, корректно имплементировать runnable, для обработки interrupt).
Так будет понятнее и безопаснее.