Tôi đang xây dựng một ứng dụng nhắn tin sử dụng Netty 4.1 Beta3 để thiết kế máy chủ của tôi và máy chủ hiểu giao thức MQTT.Điều chỉnh hiệu suất cho Netty 4.1 trên máy linux
Đây là lớp MqttServer.java của tôi thiết lập máy chủ Netty và liên kết nó với một cổng cụ thể.
EventLoopGroup bossPool=new NioEventLoopGroup();
EventLoopGroup workerPool=new NioEventLoopGroup();
try {
ServerBootstrap boot=new ServerBootstrap();
boot.group(bossPool,workerPool);
boot.channel(NioServerSocketChannel.class);
boot.childHandler(new MqttProxyChannel());
boot.bind(port).sync().channel().closeFuture().sync();
} catch (Exception e) {
e.printStackTrace();
}finally {
workerPool.shutdownGracefully();
bossPool.shutdownGracefully();
}
}
Bây giờ tôi đã làm một thử tải về ứng dụng của tôi trên máy Mac của tôi có cấu hình như sau
Việc thực hiện Netty was exceptional. Tôi đã có một cái nhìn tại jstack trong khi thực hiện mã của tôi và thấy rằng NIO Netty sinh ra khoảng 19 chủ đề và không ai trong số họ dường như bị mắc kẹt chờ đợi cho các kênh hoặc cái gì khác.
Sau đó, tôi thực hiện mã của tôi trên một máy linux
Đây là một máy 15GB 2 lõi. Vấn đề là các gói dữ liệu được gửi bởi client MQTT của tôi dường như mất nhiều thời gian để đi qua các đường ống dẫn Netty và cũng trên tham jstack tôi thấy rằng đã có 5 đề Netty và tất cả đã bị mắc kẹt lên như thế này
."nioEventLoopGroup-3-4" #112 prio=10 os_prio=0 tid=0x00007fb774008800 nid=0x2a0e runnable [0x00007fb768fec000]
java.lang.Thread.State: RUNNABLE
at sun.nio.ch.EPollArrayWrapper.epollWait(Native Method)
at sun.nio.ch.EPollArrayWrapper.poll(EPollArrayWrapper.java:269)
at sun.nio.ch.EPollSelectorImpl.doSelect(EPollSelectorImpl.java:79)
at sun.nio.ch.SelectorImpl.lockAndDoSelect(SelectorImpl.java:86)
- locked <0x00000006d0fdc898> (a
io.netty.channel.nio.SelectedSelectionKeySet)
- locked <0x00000006d100ae90> (a java.util.Collections$UnmodifiableSet)
- locked <0x00000006d0fdc7f0> (a sun.nio.ch.EPollSelectorImpl)
at sun.nio.ch.SelectorImpl.select(SelectorImpl.java:97)
at io.netty.channel.nio.NioEventLoop.select(NioEventLoop.java:621)
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:309)
at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:834)
at io.netty.util.concurrent.DefaultThreadFactory$DefaultRunnableDecorator.run(DefaultThreadFactory.java:137)
at java.lang.Thread.run(Thread.java:745)
Đây có phải là một số vấn đề hiệu suất liên quan đến epoll trên máy linux. Nếu có thì những thay đổi sẽ được thực hiện cho cấu hình netty để xử lý điều này hoặc để cải thiện hiệu suất.
Sửa
Version Java trên hệ thống địa phương là: -
phiên bản java "1.8.0_40" Java (TM) SE Runtime Environment (xây dựng 1.8.0_40-B27) Java HotSpot (TM) 64-Bit server VM (xây dựng 25,40-B25, chế độ hỗn hợp)
phiên bản Java trên AWS là: -
phiên bản openjdk "1.8.0_40-nội" OpenJDK Runtime Environment (xây dựng 1.8.0_40-nội-b09) OpenJDK 64-Bit Server VM (xây dựng 25,40-b13, chế độ hỗn hợp)
Bạn có chắc chắn bạn có cùng phiên bản java trên cả hai máy không? sames JVM? –
thử phiên bản mới nhất 4.1.0.Beta5. tôi đọc về một số bản sửa lỗi cho epoll. –
@ArnaudPotier. Các phiên bản JVM khác nhau. –