新浪博客

解决Java8HTTPS上传下载文件速度慢的问题

2019-07-09 12:32阅读:
前几天遇到一个诡异的问题:java服务中上传/下载文件的速度只有2.5MBps,但是同样的机器下用wget、curl速度可以达到十倍甚至更多,java HTTPS速度慢了一个数量级。 开始各种排查、搜索,包括使用抓包、profiler(发现99%的耗时都在SSLSocket的数据解密上)。在排查中偶然发现用java7运行测试代码速度很快,于是这个成为了一个突破口。
Java8和Java7在这块会有什么区别呢:https://blogs.oracle.com/java-platform-group/jdk-8-will-use-tls-12-as-default 。 找到了这篇,JAVA8会默认使用TLS1.2。TLS1.2也不应该慢这么多吧,继续往下排查:https://stack【我不知道为啥拦截】overflow.com/questions/29577804/java-server-tlsv1-1-fast-tlsv1-2-extremely-slow-90mbyte-sec-versus-4mbyte-sec 。原来java8的加密算法实现得有问题,性能极差。
解决办法可以看:https://stack【我不知道为啥拦截】overflow.com/questions/25992131/slow-aes-gcm-encryption-and-decryption-with-java-8u20 。
简单说有几个做法:1)升级java8 sdk到8u60+ (速度快不少,但还不是很快); 2)JVM启动参数里指定使用TLS1.1,-Djdk.tls.client.protocols=TLSv1.1 ;3)禁用GSM加密算法,jdk.tls.disabledAlgorithms=SSLv3,GCM。
Netty也建议使用openssl替代jdk的ssl,https://netty.io/wiki/requirements-for-4.x.html#benefits-of-usin
g-openssl 。
最后想说这个例子说明了升级Java SDK的重要性,还是尽量把SDK升级到最新稳定版本吧,可以少遇到一些坑。

我的更多文章

下载客户端阅读体验更佳

APP专享