медленные соединения влияют на производительность нетто? - PullRequest
1 голос
/ 09 января 2012

CODE-1

new NioServerSocketChannelFactory(Executors.newCachedThreadPool(), Executors.newCachedThreadPool(),WORKER_SIZE)

CODE-2

OrderedMemoryAwareThreadPoolExecutor executor = new OrderedMemoryAwareThreadPoolExecutor(48, 0, 0, 1, TimeUnit.SECONDS);
pipeline.addLast("executor", new ExecutionHandler(executor));

Если размер пула рабочих потоков ввода-вывода (по умолчанию 2 * число процессоров) можно задать из CODE-1,Какова цель добавления исполнителя (пул потоков) в конвейер в CODE-2?

Операции ввода-вывода выполняются из рабочих потоков.Означает ли это, что клиент с медленным подключением или плохой сетью поддерживает рабочий поток ввода-вывода до полной отправки данных?Если это так, увеличение WORKER_SIZE поможет мне предотвратить задержки?

Ответы [ 2 ]

1 голос
/ 09 января 2012

Медленные соединения обычно не влияют на потоки Netty в NIO (см. Примечание об обновлении).

Некоторые замечания о внутренних потоках сервера Netty

  • по умолчанию будет только один поток Босса на порт сервера, и это примет соединение и передаст соединение работнику нить.

  • , если быть точным: WORKER_SIZE - это максимальное количество NioWorker runnables сервер может иметь. например, если сервер имеет только одно соединение, тогда будет 1 рабочий поток. Если число соединений увеличивается, и оно не может быть назначено следующему работнику (активные соединения> WORKER_SIZE), тогда соединения будут назначаться работнику в циклическом порядке.

Если размер пула рабочих потоков ввода-вывода (по умолчанию 2 * число процессоров) можно задать из CODE-1, для чего нужно добавить исполнитель (пул потоков) в конвейер в CODE-2?

Если ваши исходные задачи блокируются, вам следует выполнять их в отдельном пуле потоков с помощью обработчика выполнения. В противном случае чтение / запись Nio не будет работать вовремя (задержка?). Я думаю, что наличие обработчика выполнения поможет уменьшить задержку, чем установка большого значения в WORKER_SIZE.

Операции ввода-вывода выполняются из рабочих потоков. Означает ли это, что клиент с медленным подключением или плохой сетью поддерживает рабочий поток ввода-вывода до полной отправки данных? Если это так, увеличение WORKER_SIZE поможет мне предотвратить задержки?

Вообще говоря, увеличение WORKER_SIZE> = число процессоров * 2 не помогает, потому что, NIO не является блокирующим, и, если я не ошибаюсь, его ЦП интенсивен. Для ЦП с интенсивной нагрузкой ЦП * 2 выбирается в основном количество потоков.

Update

NioWorker запускает цикл с selector.select (500 мс) для получения OP_READ, selector.select с таймаутом на блокирующий вызов, и, если большинство соединений медленные, производительность может снизиться? Вы можете уменьшить время ожидания в org.jboss.netty.channel.socket.nio.SelectorUtil.java и протестировать.

0 голосов
/ 09 января 2012

Пул потоков, которые вы добавляете в CODE-1, предназначен для потоков боссов и рабочих потоков.Потоки босса принимают соединения и передают их в рабочий поток для обработки.

Исполнитель, который вы добавляете в CODE-2, предназначен для обработки сообщений, прочитанных рабочими потоками.

Медленные соединения не будутвлияет на производительность, так как вы используете неблокирующую архитектуру (NIO), которая установлена ​​в Netty как не блокирующая (она могла бы, если бы захотела)

...