powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / А кто нибудь реально Java NIO для HTTP использует?
5 сообщений из 30, страница 2 из 2
А кто нибудь реально Java NIO для HTTP использует?
    #39291493
Leonidv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В качестве альтернативы контейнера сервлетов можно посмотреть на undertow.io . Используется в JBoss версии 8 и выше как реализация контейнера сервлета.
...
Рейтинг: 0 / 0
А кто нибудь реально Java NIO для HTTP использует?
    #39291915
breath
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в https://grizzly.java.net/ юзается nio
который юзается в glassfish/payarafish как минимум
...
Рейтинг: 0 / 0
А кто нибудь реально Java NIO для HTTP использует?
    #39292219
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем:
1. Снизили кол-во использований ConcurrentLinkedQueue - перед нем поставил свой буфер в который накапливаю данные в ThreadLocal<> классе и в ConcurrentLinkedQueue помещаю сразу 10-ок пакетов за раз.
(+ отдельный поток, который по таймеру может flush делать, что бы данные сильно долго не задерживались)
2. Избавился от неявных вызовов new при encode из String в ByteArray. Массив char из String извлекается копирование в предварительно выделенный (!!!) буфер, кодируется через CharsetEncoder в предварительно выделенный (!!!) ByteArray.
Если кто будет повторять:

Внутри CharsetEncoder содержит 2-е реализации: для массивов (private encodeArrayLoop) и для Buffer'ов (private encodeBufferLoop).

Первая (на строках <50 байт) работает в 2-а раза быстрее, чем String.toBytes() с неявным new. Вторая (encodeBufferLoop) - тупая как пробка и тормозная, как в анекдотах про некоторые страны Северной Европы ))). Т.ч. нужно быть аккуратным с типом параметров.


Код, по словам коллег, получился не сильно простой, но вроде работает )))

По словам тех, кто проверяет (на реальной железяке) потребление процессора вроде на 30-50% уменьшилось. Т.е. вернулось к до-NIO уровню.

У меня такое чувство, что Atomic-классы при неправильном использовании жрут процессора больше, чем банальный synchronized при правильном ))). Соответственно и ConcurrentLinkedQueue достаточно прожорливая для CPU вещь. Если конкуренция за очередь маленькая, то может оказаться лучше обычную коллекцию в synchronized обернуть (пока не проверял, мучаю систему step by step)
...
Рейтинг: 0 / 0
А кто нибудь реально Java NIO для HTTP использует?
    #39292250
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Заменил ConcurrentLinkedQueue на synchronized + обычный LinkedList

На моем тесте (много операций, 280 Mb/s строчками по 64 символа) и при небольшой конкуренции - фиолетово. Что ConcurrentLinkedQueue на Atomic, что synchronized - при небольшом кол-во коллизий (попыток одновременного доступа) synchronized вполне себе быстрая операция.

Но поскольку в synchronized блоке можно сделать значительно больше, чем Atomic, то он даже местами выгоден.

Например: если мы хотим выбрать одной операцией все данные накопленные в ConcurrentLinkedQueue - обломись, только по одной записи, с дерганием соответствующих Atomic'ов, при synchronized - мы наложив всего одну блокировку, можем забрать все данные и обработать их одним пакетом
...
Рейтинг: 0 / 0
А кто нибудь реально Java NIO для HTTP использует?
    #39300586
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ларчик просто открывался:

На многопроцессорной машине Oracle создает служебных потоков по кол-ву ядер. На машине с 40 ядрами, их кол-во просто зашкаливает. При выставлении ключа, что использовать 2 потока для JIT компилятора и 2 потока для GC - все анормальное потребление CPU при NIO исчезло.

Если раньше код с Nio проигрывал Old socket'ам раза в 2-3, то теперь соответственно стал выигрывать в 2-3 раза.

Похоже на какие-то "глюки" CFS scheduler'а в Linux, когда потоков GC и JIT'а много больше, чем собственно рабочих потоков приложения.

p.s. Особенно понравился срачь в Java конференции, где у человека на T1 сервере для "уборки" 100 Mb heap'а в тулзе мониторинга запускалось 256 потоков )))
...
Рейтинг: 0 / 0
5 сообщений из 30, страница 2 из 2
Форумы / Java [игнор отключен] [закрыт для гостей] / А кто нибудь реально Java NIO для HTTP использует?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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