+
 新版

基于 netty SSL socket服务器,很慢,而且内存不释放

osc_221449 发布于 2016/03/09 17:13
阅读 2K+
收藏 0

请教大家一个问题,我最近写了一个基于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));
        }
    }

加载中
0
w
wannaback

楼主这个问题解决了吗?我最近在做netty项目也是这种情况...是什么原因导致的呢?

0
lkclkc888
lkclkc888

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

0
demoeg
demoeg

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

OSCHINA
登录后可查看更多优质内容
返回顶部
顶部