阿里妹导读:Tengine,轻量级Web服务器,基于Nginx进行开发,针对大访问量网站的需求,新增了很多高级功能和特性。比如,Tengine兼容Nginx的所有配置,并且增加了独立进程框架、页面优化、集成了Lua语言进行扩展等很多实用的功能,并在性能方面做了较大的提升。阿里全站HTTPS项目诞生的七层流量入口网关“接入层”也是基于Tengine,目前90%以上的流量都是HTTPS,它是如何支撑双11零点流量高峰如丝般顺滑?
背景介绍
虽然全站HTTPS已经是一个老生常谈的话题,但是国内为何能做到的网站却还是屈指可数?原因简单总结来说有两点,首先使用HTTPS后使得网站访问速度变“慢” ,其次导致服务器CPU消耗变高、使得机器成本变“贵”。虽然HTTPS软件优化方案也各式其样,如Session复用、OCSP Stapling、False Start、dynamic record size、TLS1.3、HSTS等等,但是软件层面如何优化也无法满足流量日益增长的速度,加上CPU摩尔定律已入暮年,使得专用硬件卸载CPU密集型运算成为业界一个通用解决方案,Tengine首次开源使用Intel QAT加速卡卸载HTTPS,轻松使得网站HTTPS处理能力翻倍。
加速方案
Tengine-2.2.2本次开源的新特性包括:ssl_async支持异步OpenSSL模块、支持TLS1.3具备TLS握手0-RTT、upstream配置块支持include指令方便配置管理,其中ssl_async支持异步OpenSSL模式,可结合硬件如Intel QAT加速卡卸载SSL密集型运算,可使得Tengine对HTTPS的处理能力翻倍。
Tengine基于Intel QAT的异步加速方案,其总体框架如图一所示,由三部分组成Tengine的ssl_async指令、OpenSSL + QAT Engine以及QAT Driver,其中Tengine-2.2.2通过适配OpenSSL-1.1.0的异步接口,将私钥操作卸载至Intel提供的引擎(QAT engine)中,引擎通过QAT驱动完成对硬件的操作。
640?wx_fmt=png
原理介绍
Tengine在原有socket接口异步读/写事件的基础上扩展出针对异步硬件引擎的异步事件(图二所示),并在原有的连接结构体中增加新的异步来源即async_fd用来接收异步引擎的通知,当执行OpenSSL相关操作时,把返回的事件fd加载到Tengine的异步事件框架中,当检测到硬件执行完相关操作后就会唤醒相关事件进行后续操作的执行。
640?wx_fmt=png
当Tengine启用异步ssl_asyncQAT加速模式,在接受到客户端的SSL/TLS请求后,将私钥操作通过OpenSSL API卸载至QAT硬件,并迅速或者返回值-1以及相应的错误码SSLERRORWANT_ASYNC。Tengine依据该错误码通过OpenSSL相关API获取引擎提供的eventfd并添加到Tengine epoll的监视列表中,同时释放CPU资源用于后续其他连接业务的处理。目前QAT engine默认提供了内部线程用于轮询QAT硬件资源,当QAT硬件完成相应的操作后,QAT engine通过上述eventfd发送通知至Tengine,Tengine利用类似socket事件的处理机制,对该异步事件进行后续处理,即再次调用之前返回异步错误码的API进入引擎,回收相应的结果完成该次卸载操作。这种处理方式最大化的利用了硬件资源,大大提高了服务器端的并发处理能力。
640?wx_fmt=png
其工作流程如图三所示,Tengine通过OpenSSL API (SSLdohandshake)发起SSL/TLS握手操作,在OpenSSL库内部,当有私钥操作请求需要被卸载时,产生相应的异步任务(async job),并直接进入相应的处理引擎(QAT engine),当处理引擎接受了该请求后,通过OpenSSL异步库对当前任务进行暂停并调度当前的调用栈返回相应的异步错误码给调用者Tengine。Tengine将该任务对应的异步eventfd挂起然后处理其他操作。当该eventfd被唤起时,再次重入SSLdohandshake API,OpenSSL通过函数内部的状态机,再次调度之前被暂停的任务,并继续完成当前的调用栈直到返回给调用者相应的返回值标记当前操作成功。
性能数据
cpu型号:Intel(R) Xeon(R) CPU E5-2650 v2 @ 2.60GHz 32核
内核:3.10
网卡:万兆
OpenSSL版本:1.1.0-f
QAT engine版本:v0.5.30
QAT驱动版本:qatmux.l.2.6.0-60
测试场景:不同证书类型下,本地返回10字节数据
同等条件下Tengine启用ssl_async异步模式结合QAT硬件加速后对HTTPS的处理能力对比如下所示。
当使用RSA-RSA-AES128-GCM-SHA256加密套件时,Tengine启用ssl_asyncQAT加速只需8核QPS就可以达到17.6k,关闭QAT时32核QPS可到达29k,如下图所示:
640?wx_www.mhylpt.com fmt=png
当使用ECDHE-RSA-AES128-GCM-SHA256加密套件时,Tengine启用ssl_asyncQAT加速只需16核QPS就可以达到15k、而关闭QAT场景下32核CPU全部打满时QPS才达到9.4k,如下图所示:
640?wx_fmt=png
当使用ECDHE-ECDSA-AES128-GCM-SHA256加密套件(secp384r1),Tengine启用ssl_asyncQAT加速只需8核QPS就可以达到13k、而关闭QAT场景下需要32核CPU全部打满时QPS才达到11k,如下图所示:
640?wx_fmt=www.078881.cn/ png
当使用ECDHE-ECDSA-AES128-GCM-SHA256加密套件(prime256v1)时,Tengine启用ssl_asyncQAT加速时8核就可以到达硬件处理峰值16k,关闭QAT时32核QPS可到达29k,如下图所示:
640?wx_fmt=png
总结
当Tengine启用ssl_asyncQAT加速时,加密套件使用RSA-RSA算法时HTTPS处理能力是非加速版Tengine的3.8倍(8核时),使用ECDHE-RSA算法的HTTPS处理能力是非加速版Tengine的2.65倍(8核时),使用ECDHE-ECDSA(www.fengshen157.com P-384)算法的HTTPS处理能力是非加速版Tengine的2倍(16核)。当然QAT也不是万能的,当使用ECDHE-ECDSA(P-256)加密套件8核的时候就达到了QAT硬件处理峰值16k左右,此时相比于非加速版Tengine只有23%的性能提升。
由于篇幅有限,有相关疑问也可以点击文末“阅读原文”,了解github开源Tengine-2.2.2新特性介绍,并和我们讨论。
致谢
感谢Intel? QuickAssist Technology (QAT) 团队本次对Tengine QAT的异步加速方案的技术支持与帮助,感谢Tengine开源社区对Tengine的贡献与信任,相信开源版Tengine在未来会赋予更多的新特性,一起努力把Tengine在功能和性能方面都能做到极致发挥。
原文地址:https://www.cnblogs.com/qwangxiao/p/8439423.html