#java #multithreading #performance #netty #wakeup
#Ява #многопоточность #Производительность #нетти #пробуждение
Вопрос:
Я хочу избежать траты большого количества ресурсов процессора на пробуждение потока Нетти. Каждый раз, когда пакет сбрасывается, нетти просыпается. Когда я отправляю много пакетов, у меня много таких пробуждений, которые действительно трудно обработать процессору. Как заставить его тратить меньше времени на пробуждение, я нашел что-то вроде SelectStrategy.BUSY_WAIT, но как только я выбираю этот вариант, мой процессор все время работает на 20%. Есть ли способ сделать что-то вроде отложенного сна/ожидания пробуждения?
Я также попытался объединить циклы событий каналов, но, похоже, у каждого канала есть свой собственный цикл событий.
Ответ №1:
Существует несколько EventLoop
s, и они разделяются между Channel
s. Сколько из них используется, зависит от того, как настроена netty и как Channel
загружаются s.
Что касается пробуждений, вы можете сократить накладные расходы, выполнив одно из следующих действий:
- Только
flush
изнутриEventLoop
. - Позвоните
write
несколько раз, прежде чем звонитьflush
, если вам нужно сделать это извнеEventLoop
. - Упакуйте несколько сообщений в один «объект», передайте его
writeAndFlush(...)
и создайте свой собственныйChannelOutboundHandler
, который «разложит» этот объект на сообщения.
Комментарии:
1. Запись за пределами EventLoop, похоже, тоже использует много ресурсов, у вас есть что-то на уме, кроме упаковки пакетов в 1 объект? Я, конечно, рассмотрю и этот вариант.
2. нет… писать извне намного дороже
3. Я бы не сказал «много», в профилировщиках это довольно похоже, я проверю, дешевле ли звонить за пределы eventloop.
4. Но вы говорите упаковывать сообщения, но клиент будет получать упакованные сообщения или каждый пакет 1 на 1? У вас есть пример или какое-то описание этой реализации?