请教大家一个问题,我最近写了一个基于netty的socket 服务器,现在发一个问题如果直接是socket不加ssl跑的很快,负载能力也很强。但是加了SSL就慢得如蜗牛,而且会有JVM崩溃,内存释放不了问题。请有此开发经验的同学指导一下。
系统环境:JAVA
java version "1.8.0_74"
Java(TM) SE Runtime Environment (build 1.8.0_74-b02)
Java HotSpot(TM) 64-Bit Server VM (build 25.74-b02, mixed mode)
netty-4.1.0.CR3
运行参数:
-Xmx30720M -Xms30720M -Xss1M -XX:HeapDumpPath=/root/netty_srv_dir/dumps/ -XX:+HeapDumpOnOutOfMemoryError
----------------------------代码片段--------------------------------------------------
SelfSignedCertificate ssc = new SelfSignedCertificate();
SslContext sslCtx = SslContextBuilder.forServer(ssc.certificate(), ssc.privateKey()) .build();
private class DevChildChannelHandler extends ChannelInitializer<SocketChannel> {
private final SslContext sslCtx;
public DevChildChannelHandler(SslContext sslCtx) {
this.sslCtx = sslCtx;
}
@Override
protected void initChannel(SocketChannel arg0) throws Exception {
ChannelPipeline pipeline = arg0.pipeline();
// pipeline.addLast(sslCtx.newHandler(arg0.alloc())); 注释一行,就非常快
ByteBuf delimiter = Unpooled.copiedBuffer("\r\n\r\n".getBytes());
pipeline.addLast(new DelimiterBasedFrameDecoder(2048, delimiter));
pipeline.addLast(new StringDecoder());
pipeline.addLast(new DeviceHandler(dc));
}
}
Java
Netty
楼主这个问题解决了吗?我最近在做netty项目也是这种情况...是什么原因导致的呢?
ssl很慢的问题,这是正常额,ssl本身就耗费性能,并且java的ssl加密性能很差.
内存不释放的问题, 目前从我使用的情况来讲,去netty的对象池禁用了,会解决你这个问题.
public void initChannel(SocketChannel ch) throws Exception {
ChannelPipeline pip = ch.pipeline();
if (null != sslCtx) {
UnpooledByteBufAllocator heap = new UnpooledByteBufAllocator(false);
pip.addLast(sslCtx.newHandler(heap));
ch.config().setAllocator(heap);
}
netty版本:4.1.19
SslContext sslContext = SslContextBuilder.forServer(ssc.certificate(), ssc.privateKey()).sslProvider( SslProvider. OPENSSL).build();
如果不要开GCM,那把ReferenceCountedOpenSslContext里面的DEFAULT_CIPHERS抄出来,删掉两个GCM的。
List<String> ciphers = Lists.newArrayList(“ECDHE-RSA-AES128-SHA”, “ECDHE-RSA-AES256-SHA”, “AES128-SHA”, “AES256-SHA”, “DES-CBC3-SHA”);
SslContext sslContext = SslContextBuilder.forServer(ssc.certificate(), ssc.privateKey()).sslProvider( SslProvider.OPENSSL).ciphers(ciphers).build();