我正在testingHTTPS到我的小网站的增加,因为我有configuration,允许访问我的网站通过HTTP或通过HTTPS在某些时候,我决定使用ab基准(例如ab -n 1000 -c 5 http://{mywebsite}/{resource} vs ab -n 1000 -c 5 https://{mywebsite}/{resource} )。 令我惊讶的是,我发现每个百分点的请求花费的时间大约是HTTPS的两倍。
我正在使用非常便宜的盒子(AWS t2.micro是具体的),我托pipe我的web应用程序(java / jetty)和gzip和SSL的nginx,所以,我的第一个想法是,这不应该是真的大网站我没有足够的CPU能力。 此外,networking性能对于这些盒子来说是小的。
然后出于好奇,我试图运行一些网站上有一些HTTP和HTTPS的内容(如https://www.aol.com/robots.txt vs http://www.aol。 com / robots.txt和https://www.fedex.com/robots.txt与http://www.fedex.com/robots.txt等等)。 你猜怎么着? 我也看到了相同的模式 – HTTPS的每个百分点大约是通过HTTP服务的相同资源的相应百分比的两倍或三倍。
我认为我的提供者是应该指责的,但是我试图从一个AWS框中运行这些基准testing,并且我看到了更好的延迟,但仍然是相同的模式:对于我的和大名字的网站,HTTP请求至less是HTTPS的两倍以上。
我想知道可能是什么原因呢? 我试图运行AB本地主机(显然与HTTPS禁用证书检查),差异不是那么大(我说〜10-15%)。
如果别人看到这个,我很乐意多了解一下这个开销的性质。 我不是networking工程师,所以对于TLS握手是否是延迟增加的唯一原因,我几乎没有任何理解。
还有什么可能导致这些结果?
更新:
正如多人指出,TLS握手可能是根本原因。 而对于上面的例子来说,执行请求的时间可以忽略不计(比如服务静态内容)。
而我刚刚遇到了ab选项,清楚地显示了这一点,它是-k选项,使连接重用。 启用此选项后,HTTPS的总体成本要小于连接不重复使用时的总体成本。
由于encryption会有一定程度的开销,这取决于:
拥有大量dynamic内容的服务器往往受到HTTPS影响较小,因为与内容生成时间相比,encryption所花的时间(SSL开销)是微不足道的。 服务于相当小的一组静态页面的服务器,可以很容易地caching在内存中,因为吞吐量的降低,会导致更高的开销。 SSL握手是HTTPS的主要成本。 这就是“会话长度”和“caching”很重要的原因。 较长的会话将意味着在会议开始时将产生握手成本,但随后的请求将具有相对较低的开销。
caching可以在几个步骤完成,从大型代理服务器到单个浏览器caching。 通常,HTTPS内容不会被caching在共享caching中。 许多浏览器caching当前会话的HTTPS内容,并经常在会话中caching。 不caching或减lesscaching的影响意味着客户端将更频繁地检索相同的内容。 这导致更多的请求和带宽服务相同数量的用户。
通过HTTPS进行大量短的请求将比HTTP慢一些,但是如果您在一个请求中传输大量的数据,差异将是微不足道的。 但是,keepalive是HTTP / 1.1中的默认行为,它将执行一次握手,然后可以处理同一连接上的大量请求。 这对HTTPS有很大的影响。