2011-12-09 21 views
16

Google protokol arabelleği iletileri göndermek için son derece verimli bir TCP istemcisi istiyorum. Bir sunucu/istemci geliştirmek için Netty kütüphanesini kullanıyorum.Yüksek performanslı bir Netty Client nasıl yazılır

Testlerde sunucu, pek çok sorun olmadan saniyede 500 bin işlem yapabiliyor gibi görünüyor, ancak istemci saniyede 180 bin işlem yapmaya eğilimli.

İstemcimi Netty belgelerinde sağlanan örneklere dayandırdım, ancak fark sadece iletiyi göndermek ve unutmak istiyorum, bir yanıt istemiyorum (bu örneklerin çoğunda). İstemcimi optimize etmek için zaten var mı, böylece daha yüksek bir TPS elde edebilir miyim?

İstemcim birden çok kanalı korumalı mı, yoksa tek bir kanalla bundan daha yüksek bir verim elde edebilecek mi? istemci aldıktan değil, gönderme yalnızca ilgileniyorsa

+2

zamanlama gerçekten de * ses * istemcinin bir yanıt beklemesi gibi ... sadece bir düşünce - oldukça basit bir hizmet gibi göründüğü için, sadece ham bir soket kullanmayı denediniz mi? –

+1

Bu tür bir müşteri için çözüme kavuşturulmuş herhangi bir sorun varsa, lütfen müşteri kodunu, örneğin netty versiyonu ile birlikte kullanabilir misiniz? Şu anda sürüm değişiklikleri –

cevap

17

1), her zaman başına birden fazla istemci kanallarını alarak çok kolay

channel.setReadable(false); 

2) Sen verimi arttırmak aşağıda gibi kanaldan okuma devre dışı bırakabilir müşteri ve ayrıca ölçeklenebilir.

3) ve siz) Okuma/yazma için (genel performansını artırmak için ince ayarları aşağıdaki yapabilirim

  • Onun OrderdMemoryAwareThreadPoolExecutor ile EXecutionHandler ekleyerek pipline gibi Seda olması daha iyi (min , Optimal değere (kanalın writeBufferHighWaterMark ayar optimum değere sahip max kanal bellek)

    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()); 
        } 
    }); 
    
  • ) büyük bir değer ayarlayarak tıkanıklık yaratmak olmayacağından emin olun SO_READ, SO_WRITE tampon boyutunu TCP yok gecikme etkinleştirilmesi

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

  • Ayar

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

  • bootstrap.setOption("tcpNoDelay", true);

+0

ile şaşırdım, Teşekkürler Bir noktada 2). Bunu yapmanın en iyi yolu nedir? Birden çok kanal oluşturmalıyım ve istekleri işlemek için işçilerden bir çeşit iş kuyruğuna koymalı mıyım? – Dave

+0

@Bu istemcinin birden çok bağlantıyı nasıl kullanabileceğini görmek için bu yanıtı gözden geçirin http://stackoverflow.com/a/7905761/596720 – Abe

+0

"SetReadable (false)" seçeneğinin, büyük olasılıkla iyi bir fikir olmadığını, kanalı okumayı denemeden uzak uçun kesildiğini bilmenin bir yolu.Uzak uç kapandığında, read() ', -1 değerini döndürür. –

3

ben "TcpNoDelay emin değilim "geliştirmeye yardımcı olur çıktı. Gecikme performansı artırmak için var. Hiçbiri daha az, denedim ve çıktıların aslında% 90'dan fazla düştüğünü gördüm.

İlgili konular