[英]Erlang YAWS https tax
由于一切都应该是https,我启用了它,并注意到与http相比有多慢的https。
我在达拉斯有一个Ubuntu / YAWS服务器。 我使用“yaws --daemon --nodebug”启动YAWS
如果我做
和
从服务器本身来看,https需要大约100毫秒和http 20毫秒,即差异是80毫秒。
当我们尝试从瑞典,欧洲,https是1400毫秒,http是350毫秒。 由于大西洋上的延迟,这些数字可能是合乎逻辑的。
但是,现在到了奇怪的事情。
我在达拉斯也有一个Windows / IIS服务器。
如果我在两台服务器上比较简单的http-get请求,则YAWS服务器的差异https-penalty比IIS大得多。 (我也测试了Tomcat,它的行为类似于IIS)。
它似乎也与延迟相关,即从服务器越长,IIS和YAWS之间的差异就越大。
当我使用来自瑞典的达拉斯的IIS服务器进行类似测试时,https为1000毫秒,而http与YAWS相同,即IIS的速度比雅虎快得多(400毫秒)。 几乎就像YAWS进行额外的网络呼叫一样。
我也一直在试验
并且只提取了他们报告的SSL时间。 请注意,YAWS的SSL时间增加得更快
| YAWS | IIS
Dallas | 79ms | 75ms
New York | 212ms | 87ms
Amsterdam | 503ms | 315ms
好的,我该怎么办?
更新2015-08-20
我更新了雅马比2.0,是的,性能差异仍然存在。
通过使用
curl -v --trace-time --trace-ascii echo.log https://share.spreadsheetconverter.com/echo/
并与之比较
curl -v --trace-time --trace-ascii server1.log https://www.spreadsheetserver.com/server1/
我比较了所有行,我看到我们在一行中松动了300ms。
这就是我们与Yaws 2.0交谈时的样子
17:37:54.606668 == Info: TLSv1.2, TLS handshake, Finished (20):
17:37:54.606692 => Send SSL data, 16 bytes (0x10)
0000: ......Jb.9...#.^
17:37:54.758726 == Info: TLSv1.2, TLS change cipher, Client hello (1):
17:37:54.758761 <= Recv SSL data, 1 bytes (0x1)
0000: .
17:37:55.107695 == Info: TLSv1.2, TLS handshake, Finished (20):
17:37:55.107726 <= Recv SSL data, 16 bytes (0x10)
0000: ..........Y.xV.!
17:37:55.107784 == Info: SSL connection using TLSv1.2 / ECDHE-RSA-AES256-GCM-SHA
当我与IIS交谈时
17:40:25.247308 == Info: TLSv1.0, TLS handshake, Finished (20):
17:40:25.247329 => Send SSL data, 16 bytes (0x10)
0000: ........f4..qh:(
17:40:25.376893 == Info: TLSv1.0, TLS change cipher, Client hello (1):
17:40:25.376925 <= Recv SSL data, 1 bytes (0x1)
0000: .
17:40:25.377081 == Info: TLSv1.0, TLS handshake, Finished (20):
17:40:25.377103 <= Recv SSL data, 16 bytes (0x10)
0000: ....C..'.A,..'R.
17:40:25.377142 == Info: SSL connection using TLSv1.0 / AES128-SHA
对于Yaws和IIS,第一个“发送SSL数据”需要150毫秒
对于IIS,两个立即“Recv SSL数据”没有延迟。
但是,在Yaws的情况下,我们必须等待350ms才能获得第一个“Recv SSL数据”,然后下一个是立即
这就像IIS中的异步,但在雅司中同步。 在IIS中,要接收的数据与Send的ack组合,但在Yaws中,它是两个单独的请求。
所有这些要求都必须通过大西洋。 如果我改为使用相同的数据中心,差异要小得多。
Nginx或HAproxy可以解决这个问题。 您应该终止代理节点上的HTTPS流量。 之后,您应该在erlang节点上传递HTTP流量。 此外,保持erlang节点在互联网上没有代理不是一个好习惯。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.