2011-12-09 21 views
16

Tôi muốn một máy khách TCP cực kỳ hiệu quả để gửi các thông báo đệm giao thức của Google. Tôi đã sử dụng thư viện Netty để phát triển một máy chủ/máy khách.Cách viết một Máy khách Netty hiệu năng cao

Trong các thử nghiệm, máy chủ có khả năng xử lý tới 500 nghìn giao dịch mỗi giây, mà không gặp nhiều vấn đề, nhưng khách hàng có xu hướng đạt đỉnh khoảng 180 nghìn giao dịch mỗi giây.

Tôi đã dựa trên khách hàng của mình trên các ví dụ được cung cấp trong tài liệu Netty, nhưng sự khác biệt là tôi chỉ muốn gửi tin nhắn và quên, tôi không muốn một phản hồi (mà hầu hết các ví dụ nhận được). Có cách nào để tối ưu hóa khách hàng của tôi, để tôi có thể đạt được TPS cao hơn không?

Khách hàng của tôi có nên duy trì nhiều kênh hay tôi có thể đạt được thông lượng cao hơn so với kênh này không?

+2

thời gian thực sự * âm thanh * như khách hàng đang chờ phản hồi ... chỉ là một ý nghĩ - vì nó nghe giống như một dịch vụ khá đơn giản, bạn đã thử sử dụng ổ cắm thô chưa? –

+1

nếu có bất kỳ sự cố nào được giải quyết cho loại ứng dụng khách này, bạn có thể vui lòng chia sẻ mã máy khách cho ví dụ mà phiên bản netty nào sử dụng không? hiện tại tôi đang bị kẹt với các thay đổi phiên bản –

Trả lời

17

1) Nếu khách hàng chỉ quan tâm đến việc gửi, không trong việc tiếp nhận, bạn luôn có thể vô hiệu hóa đọc từ kênh như dưới đây

channel.setReadable(false); 

2) Bạn có thể tăng thông lượng rất dễ dàng bởi có nhiều kênh khách hàng mỗi khách hàng, và nó cũng có thể quy mô quá.

3) và bạn có thể làm tinh chỉnh sau đây để cải thiện hiệu suất nói chung (cho đọc/ghi)

  • của nó tốt hơn để có một SEDA như pipline bằng cách thêm một EXecutionHandler với OrderdMemoryAwareThreadPoolExecutor, (với min, max bộ nhớ kênh với giá trị tối ưu)

    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()); 
        } 
    }); 
    
  • thiết lập writeBufferHighWaterMark của kênh giá trị tối ưu (Hãy chắc chắn rằng thiết lập một giá trị lớn sẽ không tạo ra sự tắc nghẽn)

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

  • Thiết lập SO_READ, SO_WRITE kích thước bộ đệm

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

  • Bật TCP Không chậm trễ

    bootstrap.setOption("tcpNoDelay", true);

+0

Cảm ơn, Một câu hỏi ở điểm 2). Cách tốt nhất để làm điều này là gì, tôi có nên tạo nhiều kênh và đặt các trình xử lý cho chúng trong một số loại hàng đợi công nhân nào đó, để xử lý các yêu cầu không? – Dave

+0

@Dave hãy xem câu trả lời này để xem cách khách hàng có thể sử dụng nhiều kết nối http://stackoverflow.com/a/7905761/596720 – Abe

+0

Tôi đã thấy rằng 'setReadable (false)' có lẽ không phải là một ý tưởng hay trừ khi bạn có một cách để biết rằng kết thúc từ xa bị ngắt kết nối mà không cố gắng đọc kênh.'read()' trả về '-1' khi kết thúc từ xa bị treo. –

3

Tôi không chắc chắn nếu "tcpNoDelay "giúp cải thiện thông lượng. Chậm trễ là có để cải thiện hiệu suất. Không ít hơn, tôi đã thử nó và thấy rằng thông lượng thực sự giảm hơn 90%.

Các vấn đề liên quan