Избегайте потери ресурсов при пробуждении Нетти

#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? У вас есть пример или какое-то описание этой реализации?