2011-12-09 19 views
16

我想要一個非常高效的TCP客戶端發送google協議緩衝區消息。我一直在使用Netty庫來開發服務器/客戶端。如何編寫高性能的Netty客戶端

在測試中,服務器似乎每秒能夠處理高達500k次的事務,但沒有出現很多問題,但客戶端往往每秒鐘處理大約180k次事務。

我的客戶端基於Netty文檔中提供的示例,但不同之處在於我只想發送消息並忘記,我不希望得到響應(大多數示例都可以)。無論如何要優化我的客戶,這樣我可以實現更高的TPS?

我的客戶端應該維護多個通道,還是應該能夠比單通道獲得更高的吞吐量?

+2

確實時間確實*聲音*像客戶端正在等待響應...只是一個想法 - 因爲它聽起來像一個相當簡單的服務,你有沒有嘗試過使用原始套接字? –

+1

如果有任何一個解決了這類客戶端的問題,你能分享客戶端代碼,例如netty版本使用嗎?目前我堅持版本更改 –

回答

17

1)如果客戶端僅在接收發送,不感興趣,可以隨時通過具有每多個客戶機通道禁用從信道讀象下面

channel.setReadable(false); 

2)可以增加吞吐量很容易客戶端,也可以擴展。

3),你可以做以下調整,以提高總體性能(讀/寫)

  • 它通過添加具有OrderdMemoryAwareThreadPoolExecutor一個EXecutionHandler,最好有一個SEDA像pipline(含分鐘,與最優值最大通道內存)

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

+0

謝謝,關於第2點的一個問題)。我應該創建多個渠道,並將處理程序放在某種工作隊列中處理請求,最好的方法是什麼? – Dave

+0

@Dave看看這個答案,看看客戶端如何使用多個連接http://stackoverflow.com/a/7905761/596720 – Abe

+0

我發現'setReadable(false)'可能不是一個好主意,除非你有一種知道遠端沒有嘗試讀通道而斷開連接的方式。當遠端掛斷時,read()返回'-1'。 –

3

我不知道,如果「tcpNoDelay 「有助於改善吞吐量。延遲是爲了改善性能。無論如何,我嘗試過,看到吞吐量實際上下降了90%以上。