解决Java8HTTPS上传下载文件速度慢的问题
(2019-07-09 12:32:15)
前几天遇到一个诡异的问题: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-using-openssl
。
最后想说这个例子说明了升级Java
SDK的重要性,还是尽量把SDK升级到最新稳定版本吧,可以少遇到一些坑。
喜欢
0
赠金笔
加载中,请稍候......