Tengine,轻量级Web服务器
阿里妹导读: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在功能和性能方面都能做到极致发挥。
Tengine,轻量级Web服务器的更多相关文章
- 轻量级web服务器lighttpd的编译及配置(for x86-linux)
转自:http://blog.163.com/ljf_gzhu/blog/static/131553440201211522317367/ 备注: PC Linux:Ubuntu-10.10 Linu ...
- 一篇文章带你了解轻量级Web服务器——Nginx简单入门
一篇文章带你了解轻量级Web服务器--Nginx简单入门 Nginx是一款轻量级的Web服务器/反向代理服务器及电子邮件代理服务器 在本篇中我们会简单介绍Nginx的特点,安装,相关指令使用以及配置信 ...
- Tomcat轻量级web服务器
1.三种web服务器 apache: 动态网站 nginx: 静态网站 tomcat:java开发的程序 2.tomcat安装 官网下载安装包(tomcat 9) 解压并放在/usr/local下 c ...
- lighttpd 轻量级WEB服务器
Lighttpd 是一款开源 Web 服务器软件.Lighttpd 安全快速,符合行业标准,适配性强并且针对高配置环境进行了优化.相对于其它的 Web 服务器而言,Lighttpd 占用内存更少:因其 ...
- HttpServer:一款Windows平台下基于IOCP模型的高并发轻量级web服务器
HttpServer的特点1.完全采用IOCP模型,实现真正的异步IO,高并发.高可靠: 2.支持4G以上文件下载: 3.支持断点续传: 4.轻量级,体积小,服务器文件仅200多K,无任何依赖库: 5 ...
- http-server 超轻量级web服务器
有的时候做前端,想要运行一些代码,但是又没有必要使用tomcat或者Apache http server,这个时候一个轻量级的简单的http server就可以搞定了. Http-server是基于n ...
- Python——轻量级web服务器flask的学习
前言: 根据工程需要,开始上手另一个python服务器---flask,flask是一个轻量级的python服务器,简单易用.将我的学习过程记录下来,有新的知识会及时补充. 记录只为更好的分享~ 正文 ...
- 轻量级Web服务器http-server
http-server是一个简单的零配置命令行http服务器.可用于h5页面手机端测试 Vue .Angualr.React项目打包后真机测试 github地址:https://github.com/ ...
- HttpServer: 基于IOCP模型且集成Openssl的轻量级高性能web服务器
2021年4月写过一个轻量级的web服务器HttpServer,见文章: <HttpServer:一款Windows平台下基于IOCP模型的高并发轻量级web服务器>,但一直没有时间添加O ...
随机推荐
- git pull fatal: refusing to merge unrelated histories
1.首先我github有个远程仓库,然后我本地有个仓库 本地仓库我新添加了一个文件,然后我去关联(git remote add origin git@github.com:qshilary/gitte ...
- 微服务构建: Spring Boot
在展开 Spring Cloud 的微服务架构部署之前, 我们先了解一下用于构建微服务的基础框架-Spring Boot. 由于 Spring Cloud 的构建基于 Spring Boot 实现, ...
- mail邮件详解
基础命令学习目录首页 1.配置 vim /etc/mail.rc文件尾增加以下内容 set from=1968089885@qq.com smtp="smtp.qq.com"s ...
- kafka handler
1.配置kafka 参数文件 在ogg主目录下有示例文件: [root@WH0PRDBRP00AP0013 ogg]# cd AdapterExamples/big-data/kafka/ [root ...
- 前端_JQuery
使用参考:http://jquery.cuishifeng.cn/ 目录 jQuery是什么 jQuery对象 寻找元素(选择器和筛选器) 选择器 表单属性选择器 筛选器 操作元素(属性.css.文档 ...
- Class-dump 安装和使用记录(导出应用的头文件)
class-dump算是逆向工程中一个入门级的工具,可以很方便的导出程序头文件,可以轻松的了解程序结构方便逆向.安装包下载地址:http://stevenygard.com/projects/clas ...
- DataRow对象的RowState和DataRowVersion属性特点
DataRow对象有两个比较重要的属性,分别是行状态(RowState)和行版本(DataRowVersion),通过这两个属性能够有效的管理表中的行.下面简要的介绍一下行状态和行版本的特点和关系. ...
- TFS任务预览
不太熟悉TFS任务项的建立. 初步建立及按老师要求分配到个人的任务设置与时间安排如下: (长时间任务可由多人合作完成,具体根据情况迅速调整任务分配) 加上每人需要进行阅读前一小组的代码需要时间2*8= ...
- react+webpack+wepack-dev-server的环境中ant design图标离线的方法
1.首先说说我老姜对官方提供的demo的理解, 在理解的过程也学到了不少知识. 上图(图0)展示的官网demo的目录结构,node_modules是自己用node下载的, iconfont中是自己的离 ...
- bata3
目录 组员情况 组员1(组长):胡绪佩 组员2:胡青元 组员3:庄卉 组员4:家灿 组员5:凯琳 组员6:翟丹丹 组员7:何家伟 组员8:政演 组员9:黄鸿杰 组员10:刘一好 组员11:何宇恒 展示 ...