powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Apache Stomp: слишком медленная работа
42 сообщений из 42, показаны все 2 страниц
Apache Stomp: слишком медленная работа
    #39366891
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Приложение забирает данные из 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.
    private static StompConnection stompConnection = new StompConnection();
    .........
    public static void main(String[] args) {
                stompConnection.open(
                        Properties.getInstance().getProperty("stomp_server_host"),
                        Integer.parseInt(Properties.getInstance().getProperty("stomp_server_port"))
                );
                stompConnection.connect("", "");
                logger.info("Success connected to " + Properties.getInstance().getProperty("stomp_server_host"));
                stompConnection.subscribe("/queue/clients_status", Stomp.Headers.Subscribe.AckModeValues.CLIENT);
                stompConnection.getStompSocket().setKeepAlive(true);
                stompConnection.getStompSocket().setSoTimeout(5000);

                while (!isShuttingDown) {
                    try {
                        message = stompConnection.receive(300000);
                        final JsonObject jsonMessage = jsonParser.parse(message.getBody()).getAsJsonObject();
                        stompConnection.ack(message);
                        .....
                        .....
                    } catch (SocketTimeoutException e) {
                        // no write traceback here!
                        logger.warn("Error read from MQ");
                    }
                }
    }



Смутила большая нагрузка на процессор, приложение раньше было написано на ПХП и нагрузку он давал не хуже.
Стал искать узкое место, профайлер показывает на stompConnection.receive
Как дальше понять проблему?
...
Рейтинг: 0 / 0
Apache Stomp: слишком медленная работа
    #39366939
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так это не потребление CPU, а длительность исполнения. Очевидно что блокирующее чтение по TCP занимает кучу времени. Но там не только время работы, но и время ожидания TCP пакетов.
...
Рейтинг: 0 / 0
Apache Stomp: слишком медленная работа
    #39366944
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Рекомендую вот это посмотреть. Обе части.
YouTube Video
...
Рейтинг: 0 / 0
Apache Stomp: слишком медленная работа
    #39366990
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hett,

А еще 6 секунд это тест ни о чем. Надо запускать на серверной JVM и прогревать код, чтобы видеть более актуальную картину. Кстати, точно ли на серверной запускаете? Ну, и JMH еще можно взять, чтобы отдельные методы померять, исключая IO.
...
Рейтинг: 0 / 0
Apache Stomp: слишком медленная работа
    #39367058
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczТак это не потребление CPU, а длительность исполнения. Очевидно что блокирующее чтение по TCP занимает кучу времени. Но там не только время работы, но и время ожидания TCP пакетов.
Runnable - как раз только время выполнения, без учета ожидания io.
Да и в top процесс в самом верху
...
Рейтинг: 0 / 0
Apache Stomp: слишком медленная работа
    #39367060
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczHett,

А еще 6 секунд это тест ни о чем. Надо запускать на серверной JVM и прогревать код, чтобы видеть более актуальную картину. Кстати, точно ли на серверной запускаете? Ну, и JMH еще можно взять, чтобы отдельные методы померять, исключая IO.

Я загнал туда 10 тыс фреймов. При длительных тестах ничего не меняется, скрин делал жалко не на первом тесте.
...
Рейтинг: 0 / 0
Apache Stomp: слишком медленная работа
    #39367064
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторПотому что график на который вы смотрите он вообще не о том
Изначально нагрузка была обнаружена утилитой top. Процесс точно грузит cpu
...
Рейтинг: 0 / 0
Apache Stomp: слишком медленная работа
    #39367115
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HettRunnable - как раз только время выполнения, без учета ожидания io.
Да и в top процесс в самом верху
Лолшто? Runnable это состояние потока на данный момент
https://docs.oracle.com/javase/7/docs/api/java/lang/Thread.State.html
Вы себе что-то вообще не то нафантазировали.
DriverManager.getConnection() по вашему тоже жрет CPU?
...
Рейтинг: 0 / 0
Apache Stomp: слишком медленная работа
    #39367116
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HettавторПотому что график на который вы смотрите он вообще не о том
Изначально нагрузка была обнаружена утилитой top. Процесс точно грузит cpu
Я же не говорю что нагрузки нет. Она есть. Просто ваша картинка показывает, в основном, ожидание на блокирующем IO. Понять из нее кто именно нагружает CPU решительно не возомжно.
...
Рейтинг: 0 / 0
Apache Stomp: слишком медленная работа
    #39367183
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ожидание io расходует время cpu?
...
Рейтинг: 0 / 0
Apache Stomp: слишком медленная работа
    #39367185
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ожидание io расходует время cpu?
...
Рейтинг: 0 / 0
Apache Stomp: слишком медленная работа
    #39367186
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ок, тогда почему если фреймов нет в очереди, то процессор не загружен и профалер не показывает расход времени, хотя поток ожидает ввода?
...
Рейтинг: 0 / 0
Apache Stomp: слишком медленная работа
    #39367197
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Впн с шифрованием?
...
Рейтинг: 0 / 0
Apache Stomp: слишком медленная работа
    #39367199
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Неа. Никакого шифрования нет.
...
Рейтинг: 0 / 0
Apache Stomp: слишком медленная работа
    #39367233
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне больше нечего добавить. Я просто могу присоединится в Блажковичу и сказать
что сведения с профайлера нам просто говорят о том что имеют место сетевые ожидания
в методе StompConnection::receive(). Это вовсе не говорит нам что ситуация ужасна.
Это просто распределение общего времени по состояниям этого конечного автомата.

Почему загружен CPU - ХЗ. Тут-бы взять другую конфигурацию и запустить на ней этот
макет и просто посмотреть. Может будут различия и тогда уже копать? Непропатчен JDK?
Сетевой стек где-то тормозит? (Я уже сталкивался в этим в шестерке. И ловили
мы бесконечные таймауты. И сокеты не закрывались долгими месяцами.) Сильно
сложный firewall? Где-то включен логгер tcpdump?
...
Рейтинг: 0 / 0
Apache Stomp: слишком медленная работа
    #39367321
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот профайл -agentlib:hprof=cpu=samples,format=b

Код: java
1.
2.
3.
4.
5.
6.
CPU SAMPLES BEGIN (total = 3415) Wed Dec 14 11:30:23 2016
rank   self  accum   count trace method
   1 90.25% 90.25%    3082 300794 java.net.SocketInputStream.socketRead0
   2  1.20% 91.45%      41 300920 java.net.PlainSocketImpl.socketAvailable
   3  1.05% 92.50%      36 300934 java.net.SocketOutputStream.socketWrite0
   4  0.82% 93.32%      28 301154 java.net.SocketOutputStream.socketWrite0



Ну тут видно, что чтение из сокета тормозит.
Проблема одинаково воспроизводится как на локальной машине с виндовс, так и на сервере с убунтой.

авторНепропатчен JDK?
Это как?

авторИ сокеты не закрывались долгими месяцами
Ну если без keep-alive, то это нормально.
...
Рейтинг: 0 / 0
Apache Stomp: слишком медленная работа
    #39367357
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть похожий баг https://bugs.openjdk.java.net/browse/JDK-8075484 закрыт 3 месяца назад.

Возможно имеет смысл проверить updates.
...
Рейтинг: 0 / 0
Apache Stomp: слишком медленная работа
    #39367461
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня не openjdk...

Померил скорости в человеко-понятных единицах:

- java приложение читает и обрабатывает 10 тыс фреймов за 10 секунд.
- php приложение записывает 10 тыс фреймов за 0.5-0.6 секунды.

Т.е. разница почти в 20 раз, это и смущает. Причем не важно, обрабатываю я пришедшие фреймы или просто читаю их и ничего не делаю, время то же. Т.е. на фоне чтения время выполнения остального кода незначительно.
...
Рейтинг: 0 / 0
Apache Stomp: слишком медленная работа
    #39367477
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подключение/Отправка/Отключение

Код: 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.
root@proxy:/opt/activemq# tcpdump port 61613
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
14:28:34.677359 IP Range.51870 > 192.168.4.230.61613: Flags [S], seq 1354240226, win 8192, options [mss 1460,nop,wscale 8,nop,nop,sackOK], length 0
14:28:34.677445 IP 192.168.4.230.61613 > Range.51870: Flags [S.], seq 675989400, ack 1354240227, win 29200, options [mss 1460,nop,nop,sackOK,nop,wscale 7], length 0
14:28:34.677534 IP Range.51870 > 192.168.4.230.61613: Flags [S], seq 1354240226, win 8192, options [mss 1460,nop,wscale 8,nop,nop,sackOK], length 0
14:28:34.677561 IP 192.168.4.230.61613 > Range.51870: Flags [S.], seq 675989400, ack 1354240227, win 29200, options [mss 1460,nop,nop,sackOK,nop,wscale 7], length 0
14:28:34.677610 IP 192.168.4.230.61613 > Range.51870: Flags [S.], seq 675989400, ack 1354240227, win 29200, options [mss 1460,nop,nop,sackOK,nop,wscale 7], length 0
14:28:34.677627 IP 192.168.4.230.61613 > Range.51870: Flags [S.], seq 675989400, ack 1354240227, win 29200, options [mss 1460,nop,nop,sackOK,nop,wscale 7], length 0
14:28:34.678900 IP Range.51870 > 192.168.4.230.61613: Flags [.], ack 1, win 513, options [nop,nop,sack 1 {0:1}], length 0
14:28:34.678994 IP Range.51870 > 192.168.4.230.61613: Flags [.], ack 1, win 513, options [nop,nop,sack 1 {0:1}], length 0
14:28:34.678997 IP Range.51870 > 192.168.4.230.61613: Flags [.], ack 1, win 513, options [nop,nop,sack 1 {0:1}], length 0
14:28:34.678998 IP Range.51870 > 192.168.4.230.61613: Flags [.], ack 1, win 513, options [nop,nop,sack 1 {0:1}], length 0
14:28:34.678999 IP Range.51870 > 192.168.4.230.61613: Flags [.], ack 1, win 513, options [nop,nop,sack 1 {0:1}], length 0
14:28:34.679000 IP Range.51870 > 192.168.4.230.61613: Flags [.], ack 1, win 513, options [nop,nop,sack 1 {0:1}], length 0
14:28:34.689793 IP Range.51870 > 192.168.4.230.61613: Flags [P.], seq 1:28, ack 1, win 513, length 27
14:28:34.689863 IP 192.168.4.230.61613 > Range.51870: Flags [.], ack 28, win 229, length 0
14:28:34.689971 IP Range.51870 > 192.168.4.230.61613: Flags [P.], seq 1:28, ack 1, win 513, length 27
14:28:34.689991 IP 192.168.4.230.61613 > Range.51870: Flags [.], ack 28, win 229, options [nop,nop,sack 1 {1:28}], length 0
14:28:34.690033 IP 192.168.4.230.61613 > Range.51870: Flags [.], ack 28, win 229, length 0
14:28:34.690053 IP 192.168.4.230.61613 > Range.51870: Flags [.], ack 28, win 229, options [nop,nop,sack 1 {1:28}], length 0
14:28:34.694586 IP 192.168.4.230.61613 > Range.51870: Flags [P.], seq 1:105, ack 28, win 229, length 104
14:28:34.694851 IP 192.168.4.230.61613 > Range.51870: Flags [P.], seq 1:105, ack 28, win 229, length 104
14:28:34.696297 IP Range.51870 > 192.168.4.230.61613: Flags [.], ack 105, win 512, options [nop,nop,sack 1 {1:105}], length 0
14:28:34.696330 IP Range.51870 > 192.168.4.230.61613: Flags [.], ack 105, win 512, options [nop,nop,sack 1 {1:105}], length 0
14:28:34.696468 IP Range.51870 > 192.168.4.230.61613: Flags [P.], seq 28:308, ack 105, win 512, length 280
14:28:34.696492 IP Range.51870 > 192.168.4.230.61613: Flags [FP.], seq 308:321, ack 105, win 512, length 13
14:28:34.696499 IP Range.51870 > 192.168.4.230.61613: Flags [P.], seq 28:308, ack 105, win 512, length 280
14:28:34.696512 IP 192.168.4.230.61613 > Range.51870: Flags [.], ack 322, win 237, options [nop,nop,sack 1 {28:308}], length 0
14:28:34.696579 IP Range.51870 > 192.168.4.230.61613: Flags [FP.], seq 308:321, ack 105, win 512, length 13
14:28:34.696585 IP 192.168.4.230.61613 > Range.51870: Flags [.], ack 322, win 237, options [nop,nop,sack 1 {308:322}], length 0
14:28:34.696624 IP 192.168.4.230.61613 > Range.51870: Flags [.], ack 322, win 237, options [nop,nop,sack 1 {28:308}], length 0
14:28:34.696626 IP 192.168.4.230.61613 > Range.51870: Flags [.], ack 322, win 237, options [nop,nop,sack 1 {308:322}], length 0
14:28:34.698297 IP 192.168.4.230.61613 > Range.51870: Flags [F.], seq 105, ack 322, win 237, length 0
14:28:34.698544 IP 192.168.4.230.61613 > Range.51870: Flags [F.], seq 105, ack 322, win 237, length 0
14:28:34.699739 IP Range.51870 > 192.168.4.230.61613: Flags [.], ack 106, win 512, length 0
14:28:34.699785 IP Range.51870 > 192.168.4.230.61613: Flags [.], ack 106, win 512, length 0
14:28:34.699810 IP 192.168.4.230.61613 > Range.51870: Flags [R], seq 675989506, win 0, length 0
14:28:34.699945 IP Range.51870 > 192.168.4.230.61613: Flags [.], ack 106, win 0, length 0
14:28:34.699956 IP 192.168.4.230.61613 > Range.51870: Flags [R], seq 675989506, win 0, length 0
14:28:34.700017 IP Range.51870 > 192.168.4.230.61613: Flags [.], ack 106, win 0, length 0
14:28:34.700026 IP 192.168.4.230.61613 > Range.51870: Flags [R], seq 675989506, win 0, length 0
14:28:34.700086 IP 192.168.4.230.61613 > Range.51870: Flags [R], seq 675989506, win 0, length 0
14:28:34.700088 IP 192.168.4.230.61613 > Range.51870: Flags [R], seq 675989506, win 0, length 0
14:28:34.700088 IP 192.168.4.230.61613 > Range.51870: Flags [R], seq 675989506, win 0, length 0
^C
42 packets captured
42 packets received by filter
0 packets dropped by kernel




Подключение/Получение/Отключение
Код: 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.
root@proxy:/opt/activemq# tcpdump port 61613
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
14:28:45.788824 IP Range.51875 > 192.168.4.230.61613: Flags [S], seq 20892152, win 8192, options [mss 1460,nop,wscale 8,nop,nop,sackOK], length 0
14:28:45.788889 IP 192.168.4.230.61613 > Range.51875: Flags [S.], seq 879498913, ack 20892153, win 29200, options [mss 1460,nop,nop,sackOK,nop,wscale 7], length 0
14:28:45.789019 IP Range.51875 > 192.168.4.230.61613: Flags [S], seq 20892152, win 8192, options [mss 1460,nop,wscale 8,nop,nop,sackOK], length 0
14:28:45.789043 IP 192.168.4.230.61613 > Range.51875: Flags [S.], seq 879498913, ack 20892153, win 29200, options [mss 1460,nop,nop,sackOK,nop,wscale 7], length 0
14:28:45.789092 IP 192.168.4.230.61613 > Range.51875: Flags [S.], seq 879498913, ack 20892153, win 29200, options [mss 1460,nop,nop,sackOK,nop,wscale 7], length 0
14:28:45.789109 IP 192.168.4.230.61613 > Range.51875: Flags [S.], seq 879498913, ack 20892153, win 29200, options [mss 1460,nop,nop,sackOK,nop,wscale 7], length 0
14:28:45.789591 IP Range.51875 > 192.168.4.230.61613: Flags [.], ack 1, win 513, options [nop,nop,sack 1 {0:1}], length 0
14:28:45.789688 IP Range.51875 > 192.168.4.230.61613: Flags [.], ack 1, win 513, options [nop,nop,sack 1 {0:1}], length 0
14:28:45.790478 IP Range.51875 > 192.168.4.230.61613: Flags [.], ack 1, win 513, options [nop,nop,sack 1 {0:1}], length 0
14:28:45.790527 IP Range.51875 > 192.168.4.230.61613: Flags [.], ack 1, win 513, options [nop,nop,sack 1 {0:1}], length 0
14:28:45.790528 IP Range.51875 > 192.168.4.230.61613: Flags [.], ack 1, win 513, options [nop,nop,sack 1 {0:1}], length 0
14:28:45.790529 IP Range.51875 > 192.168.4.230.61613: Flags [.], ack 1, win 513, options [nop,nop,sack 1 {0:1}], length 0
14:28:45.792254 IP Range.51875 > 192.168.4.230.61613: Flags [P.], seq 1:28, ack 1, win 513, length 27
14:28:45.792299 IP 192.168.4.230.61613 > Range.51875: Flags [.], ack 28, win 229, length 0
14:28:45.792411 IP Range.51875 > 192.168.4.230.61613: Flags [P.], seq 1:28, ack 1, win 513, length 27
14:28:45.792419 IP 192.168.4.230.61613 > Range.51875: Flags [.], ack 28, win 229, options [nop,nop,sack 1 {1:28}], length 0
14:28:45.792456 IP 192.168.4.230.61613 > Range.51875: Flags [.], ack 28, win 229, length 0
14:28:45.792458 IP 192.168.4.230.61613 > Range.51875: Flags [.], ack 28, win 229, options [nop,nop,sack 1 {1:28}], length 0
14:28:45.798444 IP 192.168.4.230.61613 > Range.51875: Flags [P.], seq 1:105, ack 28, win 229, length 104
14:28:45.798751 IP 192.168.4.230.61613 > Range.51875: Flags [P.], seq 1:105, ack 28, win 229, length 104
14:28:45.799410 IP Range.51875 > 192.168.4.230.61613: Flags [.], ack 105, win 512, options [nop,nop,sack 1 {1:105}], length 0
14:28:45.799460 IP Range.51875 > 192.168.4.230.61613: Flags [.], ack 105, win 512, options [nop,nop,sack 1 {1:105}], length 0
14:28:45.801322 IP Range.51875 > 192.168.4.230.61613: Flags [P.], seq 28:83, ack 105, win 512, length 55
14:28:45.801389 IP Range.51875 > 192.168.4.230.61613: Flags [P.], seq 28:83, ack 105, win 512, length 55
14:28:45.801407 IP 192.168.4.230.61613 > Range.51875: Flags [.], ack 83, win 229, options [nop,nop,sack 1 {28:83}], length 0
14:28:45.801519 IP 192.168.4.230.61613 > Range.51875: Flags [.], ack 83, win 229, options [nop,nop,sack 1 {28:83}], length 0
14:28:45.805811 IP 192.168.4.230.61613 > Range.51875: Flags [P.], seq 105:486, ack 83, win 229, length 381
14:28:45.806085 IP 192.168.4.230.61613 > Range.51875: Flags [P.], seq 105:486, ack 83, win 229, length 381
14:28:45.807239 IP Range.51875 > 192.168.4.230.61613: Flags [.], ack 486, win 511, options [nop,nop,sack 1 {105:486}], length 0
14:28:45.807289 IP Range.51875 > 192.168.4.230.61613: Flags [.], ack 486, win 511, options [nop,nop,sack 1 {105:486}], length 0
^C
30 packets captured
30 packets received by filter
0 packets dropped by kernel



На получение еще меньше TCP пакетов уходит.
...
Рейтинг: 0 / 0
Apache Stomp: слишком медленная работа
    #39367530
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hett,

Вы видео посмотрели? Померяйте в какой ресурс упирается работа.
Добавьте потоков\ядер. Будет ли чтение быстрее? Если, да, то упираемся в CPU и смотреть надо в код.
Если, нет, то упираемся в сеть и смотреть надо на работу с сетью.

Совершенно не понимаю почему "запись на PHP" сравниваеися с "записью и чтением на Java". Чтение вообще другая операция. Там парсинг, обычно, кучу времени отъедает.

Вы проверили что вы запускаете на Server JVM и меряете производительность после разогрева? Иначе, ведь все работает на интерпретации байт-кода.
...
Рейтинг: 0 / 0
Apache Stomp: слишком медленная работа
    #39367542
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лень было тест писать для чтения, сейчас все таки написал. 25 секунд на 10.000 фреймов (у явы на это уходит 10 секунд). Тем не менее либа на нативном пхп написана и я подозреваю, что там основное время как раз на парсинг уходит.

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

Исключено, тестировал нормально, используемые мной профайлеры показывают картину за последние несколько секунд (не среднее с начала запуска), да и даже если будет среднее, то при тестировании в несколько минут оно бы не имело большого веса в общей картине. Определенно узкое место java.net.SocketInputStream.socketRead0
Почему пишет быстро а читает так медленно не знаю, может быть это сам AMQ сервер отдает сообщения не так быстро, как хотелось бы.
...
Рейтинг: 0 / 0
Apache Stomp: слишком медленная работа
    #39367544
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати подключаюсь к AMQ серверу на локальной машине.
...
Рейтинг: 0 / 0
Apache Stomp: слишком медленная работа
    #39367563
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Переделал тест на более одинаковый (в Java еще вчера AUTO ack сделал). Так вот, если в пхп сделать AUTO то он 10 тыс фреймов за 2 секунды прогоняет. А Ява, напомню, за 10 секунд (при тоже ack=auto).
...
Рейтинг: 0 / 0
Apache Stomp: слишком медленная работа
    #39367676
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В проблемное место вот здесь
Читают по 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.
    @Override
    public Object unmarshal(DataInput in) throws IOException {

        try {

            // parse action
            String action = parseAction(in);

            // Parse the headers
            HashMap<String, String> headers = parseHeaders(in);

            // Read in the data part.
            byte[] data = NO_DATA;
            String contentLength = headers.get(Stomp.Headers.CONTENT_LENGTH);
            if ((action.equals(Stomp.Commands.SEND) || action.equals(Stomp.Responses.MESSAGE)) && contentLength != null) {

                // Bless the client, he's telling us how much data to read in.
                int length = parseContentLength(contentLength);

                data = new byte[length];
                in.readFully(data);

                if (in.readByte() != 0) {
                    throw new ProtocolException(Stomp.Headers.CONTENT_LENGTH + " bytes were read and " + "there was no trailing null byte", true);
                }

            } else {

                // We don't know how much to read.. data ends when we hit a 0
                byte b;
                ByteArrayOutputStream baos = null;
                while ((b = in.readByte()) != 0) {

                    if (baos == null) {
                        baos = new ByteArrayOutputStream();
                    } else if (baos.size() > getMaxDataLength()) {
                        throw new ProtocolException("The maximum data length was exceeded", true);
                    }

                    baos.write(b);
                }

                if (baos != null) {
                    baos.close();
                    data = baos.toByteArray();
                }
            }

            return new StompFrame(action, headers, data);

        } catch (ProtocolException e) {
            return new StompFrameError(e);
        }
    }
...
Рейтинг: 0 / 0
Apache Stomp: слишком медленная работа
    #39367713
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Завернул все через BufferedInputStream, общая скорость возросла в 10 раз.
...
Рейтинг: 0 / 0
Apache Stomp: слишком медленная работа
    #39367714
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да что уж там в 10, было 10.000 мс, стало 600.
...
Рейтинг: 0 / 0
Apache Stomp: слишком медленная работа
    #39367766
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HettЗавернул все через BufferedInputStream, общая скорость возросла в 10 раз.
Блин. Который раз считаю что такие банальные вещи можно даже не спрашивать и уже не первый раз ошибаюсь. Хотел же спросить не по одному ли вы байту читаете. Но, вроде, вы опытный разработчик. Не должны такой ерунды делать.

И протокол у вас не много странный. 0 же по доке валидное значение? Или это у вас данные так разделяются?
...
Рейтинг: 0 / 0
Apache Stomp: слишком медленная работа
    #39367773
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HettДа что уж там в 10, было 10.000 мс, стало 600.
а какие есть в Java профилировщики, которые выдают время работы
public Object unmarshal(DataInput in) throws IOException {
как функции, так и объекта.
Ведь вы бы увидели:
автор было 10.000 мс, стало 600.
?
...
Рейтинг: 0 / 0
Apache Stomp: слишком медленная работа
    #39367776
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да была бы это моя либа.

[group: 'org.apache.activemq', name: 'activemq-all', version: '5.11.+'],

Вроде как источник весьма почетный. Аналогично и думал, что не могут они там "фигни написать". Потом уже стал глубже разбираться.
...
Рейтинг: 0 / 0
Apache Stomp: слишком медленная работа
    #39367781
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123HettДа что уж там в 10, было 10.000 мс, стало 600.
а какие есть в Java профилировщики, которые выдают время работы
public Object unmarshal(DataInput in) throws IOException {
как функции, так и объекта.
Ведь вы бы увидели:
автор было 10.000 мс, стало 600.
?

Это я уже не профилировщиком смотрел, а у себя в приложении написал небольшой кусочек, который "засекал" за сколько времени проходит 10к фреймов.
...
Рейтинг: 0 / 0
Apache Stomp: слишком медленная работа
    #39367786
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторИ протокол у вас не много странный. 0 же по доке валидное значение? Или это у вас данные так разделяются?
И да, это тоже все из org.apache.activemq, но работает без нареканий.
...
Рейтинг: 0 / 0
Apache Stomp: слишком медленная работа
    #39367789
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hett,

Это в ActiveMQ баг такой? А где именно? Потому как это какая-то жесть реальная. Как такое могло в продашн попасть.
...
Рейтинг: 0 / 0
Apache Stomp: слишком медленная работа
    #39367791
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczHett,

Это в ActiveMQ баг такой? А где именно? Потому как это какая-то жесть реальная. Как такое могло в продашн попасть.

Строка 107 примерно.
http://activemq.apache.org/maven/apidocs/src-html/org/apache/activemq/transport/stomp/StompWireFormat.html
...
Рейтинг: 0 / 0
Apache Stomp: слишком медленная работа
    #39367793
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,

Ааа, это тот самый StompConnection.receive()
...
Рейтинг: 0 / 0
Apache Stomp: слишком медленная работа
    #39367798
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Причем после того, как я скопировал один класс либы себе src (не спрашивайте зачем)
К моему удивлению JProfiler стал более точно показывать где проблема.
(Это скрин еще до решения проблемы)
...
Рейтинг: 0 / 0
Apache Stomp: слишком медленная работа
    #39367801
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hett,

А если вы таки и отправляете и получаете, то почему content-length потерялся?
...
Рейтинг: 0 / 0
Apache Stomp: слишком медленная работа
    #39367802
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сейчас, кстати, вот так выглядит картина (узкое место примерно там же, но скорость работы самого приложения в дюжину раз больше). Возможно еще что-то можно оптимизировать, но пока и так хватит.
...
Рейтинг: 0 / 0
Apache Stomp: слишком медленная работа
    #39367807
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczHett,

А если вы таки и отправляете и получаете, то почему content-length потерялся?

гмм, я вообще предполагал, что этот заголовок сам AMQ ставит.
...
Рейтинг: 0 / 0
Apache Stomp: слишком медленная работа
    #39367963
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HettBlazkowiczHett,

А если вы таки и отправляете и получаете, то почему content-length потерялся?

гмм, я вообще предполагал, что этот заголовок сам AMQ ставит.
Да, похоже, там эта Stomp интеграция кривая и примитивная целиком и полностью.
...
Рейтинг: 0 / 0
Apache Stomp: слишком медленная работа
    #39368127
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да как-то странно, если клиент может управлять такими вещами, то тут надо учитывать, что клиенту доверять нельзя. Отправит заголовок, что у него пакет больше, чем есть, в итоге консумер вычитает кучу пакетов.
...
Рейтинг: 0 / 0
Apache Stomp: слишком медленная работа
    #39368219
Фотография fixxer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А что бы вместо

Код: java
1.
2.
3.
4.
stompConnection.open(
                        Properties.getInstance().getProperty("stomp_server_host"),
                        Integer.parseInt(Properties.getInstance().getProperty("stomp_server_port"))
                );



не написать

Код: java
1.
2.
3.
4.
5.
6.
Soket socket = new Socket(
                        Properties.getInstance().getProperty("stomp_server_host"),
                        Integer.parseInt(Properties.getInstance().getProperty("stomp_server_port"))
                );
socket.setReceiveBufferSize(DESIRED_BUFFER_SIZE);
stompConnection.open(socket);


?
...
Рейтинг: 0 / 0
Apache Stomp: слишком медленная работа
    #39368271
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пробовал, эффекта не дало, ставил 4096 и 4096*1024
...
Рейтинг: 0 / 0
42 сообщений из 42, показаны все 2 страниц
Форумы / Java [игнор отключен] [закрыт для гостей] / Apache Stomp: слишком медленная работа
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]