|
|
|
Apache Stomp: слишком медленная работа
|
|||
|---|---|---|---|
|
#18+
Приложение забирает данные из AMQ сервера по TCP/IP подключению Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. Смутила большая нагрузка на процессор, приложение раньше было написано на ПХП и нагрузку он давал не хуже. Стал искать узкое место, профайлер показывает на stompConnection.receive Как дальше понять проблему? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2016, 15:04 |
|
||
|
Apache Stomp: слишком медленная работа
|
|||
|---|---|---|---|
|
#18+
Так это не потребление CPU, а длительность исполнения. Очевидно что блокирующее чтение по TCP занимает кучу времени. Но там не только время работы, но и время ожидания TCP пакетов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2016, 15:29 |
|
||
|
Apache Stomp: слишком медленная работа
|
|||
|---|---|---|---|
|
#18+
Рекомендую вот это посмотреть. Обе части. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2016, 15:34 |
|
||
|
Apache Stomp: слишком медленная работа
|
|||
|---|---|---|---|
|
#18+
Hett, А еще 6 секунд это тест ни о чем. Надо запускать на серверной JVM и прогревать код, чтобы видеть более актуальную картину. Кстати, точно ли на серверной запускаете? Ну, и JMH еще можно взять, чтобы отдельные методы померять, исключая IO. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2016, 16:00 |
|
||
|
Apache Stomp: слишком медленная работа
|
|||
|---|---|---|---|
|
#18+
BlazkowiczТак это не потребление CPU, а длительность исполнения. Очевидно что блокирующее чтение по TCP занимает кучу времени. Но там не только время работы, но и время ожидания TCP пакетов. Runnable - как раз только время выполнения, без учета ожидания io. Да и в top процесс в самом верху ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2016, 17:31 |
|
||
|
Apache Stomp: слишком медленная работа
|
|||
|---|---|---|---|
|
#18+
BlazkowiczHett, А еще 6 секунд это тест ни о чем. Надо запускать на серверной JVM и прогревать код, чтобы видеть более актуальную картину. Кстати, точно ли на серверной запускаете? Ну, и JMH еще можно взять, чтобы отдельные методы померять, исключая IO. Я загнал туда 10 тыс фреймов. При длительных тестах ничего не меняется, скрин делал жалко не на первом тесте. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2016, 17:32 |
|
||
|
Apache Stomp: слишком медленная работа
|
|||
|---|---|---|---|
|
#18+
авторПотому что график на который вы смотрите он вообще не о том Изначально нагрузка была обнаружена утилитой top. Процесс точно грузит cpu ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2016, 17:35 |
|
||
|
Apache Stomp: слишком медленная работа
|
|||
|---|---|---|---|
|
#18+
HettRunnable - как раз только время выполнения, без учета ожидания io. Да и в top процесс в самом верху Лолшто? Runnable это состояние потока на данный момент https://docs.oracle.com/javase/7/docs/api/java/lang/Thread.State.html Вы себе что-то вообще не то нафантазировали. DriverManager.getConnection() по вашему тоже жрет CPU? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2016, 18:30 |
|
||
|
Apache Stomp: слишком медленная работа
|
|||
|---|---|---|---|
|
#18+
HettавторПотому что график на который вы смотрите он вообще не о том Изначально нагрузка была обнаружена утилитой top. Процесс точно грузит cpu Я же не говорю что нагрузки нет. Она есть. Просто ваша картинка показывает, в основном, ожидание на блокирующем IO. Понять из нее кто именно нагружает CPU решительно не возомжно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2016, 18:31 |
|
||
|
Apache Stomp: слишком медленная работа
|
|||
|---|---|---|---|
|
#18+
Ожидание io расходует время cpu? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2016, 20:08 |
|
||
|
Apache Stomp: слишком медленная работа
|
|||
|---|---|---|---|
|
#18+
Ожидание io расходует время cpu? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2016, 20:10 |
|
||
|
Apache Stomp: слишком медленная работа
|
|||
|---|---|---|---|
|
#18+
Ок, тогда почему если фреймов нет в очереди, то процессор не загружен и профалер не показывает расход времени, хотя поток ожидает ввода? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2016, 20:12 |
|
||
|
Apache Stomp: слишком медленная работа
|
|||
|---|---|---|---|
|
#18+
Впн с шифрованием? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2016, 21:03 |
|
||
|
Apache Stomp: слишком медленная работа
|
|||
|---|---|---|---|
|
#18+
Неа. Никакого шифрования нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2016, 21:07 |
|
||
|
Apache Stomp: слишком медленная работа
|
|||
|---|---|---|---|
|
#18+
Мне больше нечего добавить. Я просто могу присоединится в Блажковичу и сказать что сведения с профайлера нам просто говорят о том что имеют место сетевые ожидания в методе StompConnection::receive(). Это вовсе не говорит нам что ситуация ужасна. Это просто распределение общего времени по состояниям этого конечного автомата. Почему загружен CPU - ХЗ. Тут-бы взять другую конфигурацию и запустить на ней этот макет и просто посмотреть. Может будут различия и тогда уже копать? Непропатчен JDK? Сетевой стек где-то тормозит? (Я уже сталкивался в этим в шестерке. И ловили мы бесконечные таймауты. И сокеты не закрывались долгими месяцами.) Сильно сложный firewall? Где-то включен логгер tcpdump? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2016, 22:25 |
|
||
|
Apache Stomp: слишком медленная работа
|
|||
|---|---|---|---|
|
#18+
Вот профайл -agentlib:hprof=cpu=samples,format=b Код: java 1. 2. 3. 4. 5. 6. Ну тут видно, что чтение из сокета тормозит. Проблема одинаково воспроизводится как на локальной машине с виндовс, так и на сервере с убунтой. авторНепропатчен JDK? Это как? авторИ сокеты не закрывались долгими месяцами Ну если без keep-alive, то это нормально. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2016, 08:11 |
|
||
|
Apache Stomp: слишком медленная работа
|
|||
|---|---|---|---|
|
#18+
Есть похожий баг https://bugs.openjdk.java.net/browse/JDK-8075484 закрыт 3 месяца назад. Возможно имеет смысл проверить updates. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2016, 09:41 |
|
||
|
Apache Stomp: слишком медленная работа
|
|||
|---|---|---|---|
|
#18+
У меня не openjdk... Померил скорости в человеко-понятных единицах: - java приложение читает и обрабатывает 10 тыс фреймов за 10 секунд. - php приложение записывает 10 тыс фреймов за 0.5-0.6 секунды. Т.е. разница почти в 20 раз, это и смущает. Причем не важно, обрабатываю я пришедшие фреймы или просто читаю их и ничего не делаю, время то же. Т.е. на фоне чтения время выполнения остального кода незначительно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2016, 11:22 |
|
||
|
Apache Stomp: слишком медленная работа
|
|||
|---|---|---|---|
|
#18+
Подключение/Отправка/Отключение Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. Подключение/Получение/Отключение Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. На получение еще меньше TCP пакетов уходит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2016, 11:31 |
|
||
|
Apache Stomp: слишком медленная работа
|
|||
|---|---|---|---|
|
#18+
Hett, Вы видео посмотрели? Померяйте в какой ресурс упирается работа. Добавьте потоков\ядер. Будет ли чтение быстрее? Если, да, то упираемся в CPU и смотреть надо в код. Если, нет, то упираемся в сеть и смотреть надо на работу с сетью. Совершенно не понимаю почему "запись на PHP" сравниваеися с "записью и чтением на Java". Чтение вообще другая операция. Там парсинг, обычно, кучу времени отъедает. Вы проверили что вы запускаете на Server JVM и меряете производительность после разогрева? Иначе, ведь все работает на интерпретации байт-кода. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2016, 12:20 |
|
||
|
Apache Stomp: слишком медленная работа
|
|||
|---|---|---|---|
|
#18+
Лень было тест писать для чтения, сейчас все таки написал. 25 секунд на 10.000 фреймов (у явы на это уходит 10 секунд). Тем не менее либа на нативном пхп написана и я подозреваю, что там основное время как раз на парсинг уходит. авторВы проверили что вы запускаете на Server JVM и меряете производительность после разогрева? Иначе, ведь все работает на интерпретации байт-кода. Исключено, тестировал нормально, используемые мной профайлеры показывают картину за последние несколько секунд (не среднее с начала запуска), да и даже если будет среднее, то при тестировании в несколько минут оно бы не имело большого веса в общей картине. Определенно узкое место java.net.SocketInputStream.socketRead0 Почему пишет быстро а читает так медленно не знаю, может быть это сам AMQ сервер отдает сообщения не так быстро, как хотелось бы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2016, 12:29 |
|
||
|
Apache Stomp: слишком медленная работа
|
|||
|---|---|---|---|
|
#18+
Кстати подключаюсь к AMQ серверу на локальной машине. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2016, 12:30 |
|
||
|
Apache Stomp: слишком медленная работа
|
|||
|---|---|---|---|
|
#18+
Переделал тест на более одинаковый (в Java еще вчера AUTO ack сделал). Так вот, если в пхп сделать AUTO то он 10 тыс фреймов за 2 секунды прогоняет. А Ява, напомню, за 10 секунд (при тоже ack=auto). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2016, 12:43 |
|
||
|
Apache Stomp: слишком медленная работа
|
|||
|---|---|---|---|
|
#18+
В проблемное место вот здесь Читают по 1 байту из сокета. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2016, 13:48 |
|
||
|
Apache Stomp: слишком медленная работа
|
|||
|---|---|---|---|
|
#18+
Завернул все через BufferedInputStream, общая скорость возросла в 10 раз. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2016, 14:05 |
|
||
|
Apache Stomp: слишком медленная работа
|
|||
|---|---|---|---|
|
#18+
Да что уж там в 10, было 10.000 мс, стало 600. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2016, 14:07 |
|
||
|
Apache Stomp: слишком медленная работа
|
|||
|---|---|---|---|
|
#18+
HettЗавернул все через BufferedInputStream, общая скорость возросла в 10 раз. Блин. Который раз считаю что такие банальные вещи можно даже не спрашивать и уже не первый раз ошибаюсь. Хотел же спросить не по одному ли вы байту читаете. Но, вроде, вы опытный разработчик. Не должны такой ерунды делать. И протокол у вас не много странный. 0 же по доке валидное значение? Или это у вас данные так разделяются? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2016, 14:37 |
|
||
|
Apache Stomp: слишком медленная работа
|
|||
|---|---|---|---|
|
#18+
HettДа что уж там в 10, было 10.000 мс, стало 600. а какие есть в Java профилировщики, которые выдают время работы public Object unmarshal(DataInput in) throws IOException { как функции, так и объекта. Ведь вы бы увидели: автор было 10.000 мс, стало 600. ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2016, 14:43 |
|
||
|
Apache Stomp: слишком медленная работа
|
|||
|---|---|---|---|
|
#18+
Да была бы это моя либа. [group: 'org.apache.activemq', name: 'activemq-all', version: '5.11.+'], Вроде как источник весьма почетный. Аналогично и думал, что не могут они там "фигни написать". Потом уже стал глубже разбираться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2016, 14:45 |
|
||
|
Apache Stomp: слишком медленная работа
|
|||
|---|---|---|---|
|
#18+
Petro123HettДа что уж там в 10, было 10.000 мс, стало 600. а какие есть в Java профилировщики, которые выдают время работы public Object unmarshal(DataInput in) throws IOException { как функции, так и объекта. Ведь вы бы увидели: автор было 10.000 мс, стало 600. ? Это я уже не профилировщиком смотрел, а у себя в приложении написал небольшой кусочек, который "засекал" за сколько времени проходит 10к фреймов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2016, 14:48 |
|
||
|
Apache Stomp: слишком медленная работа
|
|||
|---|---|---|---|
|
#18+
авторИ протокол у вас не много странный. 0 же по доке валидное значение? Или это у вас данные так разделяются? И да, это тоже все из org.apache.activemq, но работает без нареканий. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2016, 14:50 |
|
||
|
Apache Stomp: слишком медленная работа
|
|||
|---|---|---|---|
|
#18+
Hett, Это в ActiveMQ баг такой? А где именно? Потому как это какая-то жесть реальная. Как такое могло в продашн попасть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2016, 14:52 |
|
||
|
Apache Stomp: слишком медленная работа
|
|||
|---|---|---|---|
|
#18+
BlazkowiczHett, Это в ActiveMQ баг такой? А где именно? Потому как это какая-то жесть реальная. Как такое могло в продашн попасть. Строка 107 примерно. http://activemq.apache.org/maven/apidocs/src-html/org/apache/activemq/transport/stomp/StompWireFormat.html ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2016, 14:54 |
|
||
|
Apache Stomp: слишком медленная работа
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, Ааа, это тот самый StompConnection.receive() ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2016, 14:55 |
|
||
|
Apache Stomp: слишком медленная работа
|
|||
|---|---|---|---|
|
#18+
Причем после того, как я скопировал один класс либы себе src (не спрашивайте зачем) К моему удивлению JProfiler стал более точно показывать где проблема. (Это скрин еще до решения проблемы) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2016, 14:59 |
|
||
|
Apache Stomp: слишком медленная работа
|
|||
|---|---|---|---|
|
#18+
Hett, А если вы таки и отправляете и получаете, то почему content-length потерялся? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2016, 15:01 |
|
||
|
Apache Stomp: слишком медленная работа
|
|||
|---|---|---|---|
|
#18+
Сейчас, кстати, вот так выглядит картина (узкое место примерно там же, но скорость работы самого приложения в дюжину раз больше). Возможно еще что-то можно оптимизировать, но пока и так хватит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2016, 15:02 |
|
||
|
Apache Stomp: слишком медленная работа
|
|||
|---|---|---|---|
|
#18+
BlazkowiczHett, А если вы таки и отправляете и получаете, то почему content-length потерялся? гмм, я вообще предполагал, что этот заголовок сам AMQ ставит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2016, 15:04 |
|
||
|
Apache Stomp: слишком медленная работа
|
|||
|---|---|---|---|
|
#18+
HettBlazkowiczHett, А если вы таки и отправляете и получаете, то почему content-length потерялся? гмм, я вообще предполагал, что этот заголовок сам AMQ ставит. Да, похоже, там эта Stomp интеграция кривая и примитивная целиком и полностью. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2016, 16:46 |
|
||
|
Apache Stomp: слишком медленная работа
|
|||
|---|---|---|---|
|
#18+
Да как-то странно, если клиент может управлять такими вещами, то тут надо учитывать, что клиенту доверять нельзя. Отправит заголовок, что у него пакет больше, чем есть, в итоге консумер вычитает кучу пакетов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2016, 20:11 |
|
||
|
Apache Stomp: слишком медленная работа
|
|||
|---|---|---|---|
|
#18+
А что бы вместо Код: java 1. 2. 3. 4. не написать Код: java 1. 2. 3. 4. 5. 6. ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2016, 23:37 |
|
||
|
|

start [/forum/topic.php?all=1&fid=59&tid=2123374]: |
0ms |
get settings: |
9ms |
get forum list: |
19ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
80ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
92ms |
get tp. blocked users: |
2ms |
| others: | 246ms |
| total: | 471ms |

| 0 / 0 |
