Как написать высокопроизводительный Netty Client - PullRequest
16 голосов
/ 09 декабря 2011

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

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

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

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

Ответы [ 2 ]

17 голосов
/ 10 декабря 2011

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

channel.setReadable(false);

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

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

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

    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);

3 голосов
/ 05 ноября 2012

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

...