Подтвердить что ты не робот

Как написать высокопроизводительный Netty Client

Я хочу, чтобы чрезвычайно эффективный клиент TCP отправлял сообщения буфера протокола Google. Я использую библиотеку Netty для разработки сервера/клиента.

В тестах сервер, похоже, способен обрабатывать до 500 тыс. транзакций в секунду без каких-либо проблем, но клиент имеет тенденцию достигать 180 тыс. транзакций в секунду.

Я основал мой клиент на примерах, представленных в документации Netty, но разница в том, что я просто хочу отправить сообщение и забыть, я не хочу ответа (который в большинстве примеров получается). Есть ли способ оптимизировать мой клиент, чтобы я мог достичь более высокого TPS?

Должен ли мой клиент поддерживать несколько каналов или мне нужно достичь более высокой пропускной способности, чем это при использовании одного канала?

4b9b3361

Ответ 1

1) Если клиент заинтересован только в отправке, а не в получении, вы всегда можете отключить чтение с канала, как показано ниже.

channel.setReadable(false);

2) Вы можете увеличить пропускную способность очень легко, имея несколько клиентских каналов на клиента, а также может масштабироваться.

3), и вы можете сделать следующие настройки для улучшения производительности в целом (для чтения/записи)

  • Лучше иметь пипетку SEDA, добавив EXecutionHandler с OrderdMemoryAwareThreadPoolExecutor (с минимальной памятью канала max с оптимальным значением)

    bootstrap.setPipelineFactory(new ChannelPipelineFactory() {
        @Override
        public ChannelPipeline getPipeline() throws Exception {
            return Channels.pipeline(
                    executionHandler1,//sharable
                    new MessageDecoderHandler(),
                    new MessageEncoderHandler(),
                    executionHandler2,//sharable
                    new BusinessLogicHandler1(),
                    new BusinessLogicHandler2());
        }
    });
    
  • Настройка для параметра writeBufferHighWaterMark канала оптимального значения (убедитесь, что установка большого значения не приведет к перегрузке)

    bootstrap.setOption("writeBufferHighWaterMark", 10 * 64 * 1024);

  • Настройка размера буфера SO_READ, SO_WRITE

    bootstrap.setOption("sendBufferSize", 1048576); bootstrap.setOption("receiveBufferSize", 1048576);

  • Включение задержки TCP

    bootstrap.setOption("tcpNoDelay", true);

Ответ 2

Я не уверен, что "tcpNoDelay" помогает повысить пропускную способность. Задержка заключается в повышении производительности. Тем не менее, я попробовал это и увидел, что пропускная способность фактически упала более чем на 90%.