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 ...
随机推荐
- 旧的 .NET Core 项目重新打包出现提示版本不对问题
错误提示 当电脑更新 VS2017 版本后,如果同时有新的 .NET Core SDK 更新,打开旧的项目重新打包,可能会报这样的错误 NETSDK1061: 项目是使用 Microsoft.NETC ...
- 教你如何编写、保存与运行 Python 程序
第一步 接下来我们将看见如何在 Python 中运行一个传统的“Hello World”程序.Python教程本章将会教你如何编写.保存与运行 Python 程序. 通过 Python 来运行的你的程 ...
- Java 浅拷贝 深拷贝
两者区别主要在于引用数据类型的属性,对于基本数据类型采用的是值传递,所以两者一样: 对于浅拷贝,引用数据类型只会进行引用传递,即复制一份引用值(内存地址)给新对象,一个对象的变化会影响到另一个的引用属 ...
- mysql删除表中的记录
大家都知道,在MySQL中删除一个表中的记录有两种方法,一种是DELETE FROM TABLENAME WHERE... , 还有一种是TRUNCATE TABLE TABLENAME. DELET ...
- Echarts服务端生成图片
Echarts是百度发布的一套优秀的浏览器端图表控件,Echarts是基于html5的cavens绘图实现.而使用server端生成图片无法借用浏览器端渲染.通用的做法有两种: 是用headless浏 ...
- Netty源码分析第4章(pipeline)---->第3节: handler的删除
Netty源码分析第四章: pipeline 第三节: handler的删除 上一小节我们学习了添加handler的逻辑操作, 这一小节我们学习删除handler的相关逻辑 如果用户在业务逻辑中进行c ...
- plsql 不修改tnsnames.ora文件
PLSQL 不修改tnsname直接连数据库的方式在PLSQL的Database中直接输入192.168.1.6:1521/VP.其中192.168.1.6为数据库的IP:1521为数据库端口:VP为 ...
- spring study
Dependency Injection The Inversion of Control(IoC) is a general concept, and it can be expressed in ...
- 微信小程序——音阶练耳 宣传页面
音阶练耳是什么? 音阶练耳小程序是一款听音练习音阶,拥有简介界面的交互式小程序,以虚拟钢琴为辅助乐器,应用于日常练习,涵盖了五个八度内26种调式.以及下行中的所有调式与和声小调式的衍生,提高辨认音阶的 ...
- Daily Srum 10.30
Android那一组打算用SQL Server这个关系型数据库,而王鹿鸣他们一组却是依赖于Hbase,这是一件很麻烦的事,所以我打算在这两方面都建立一个数据库.虽然挺麻烦,但是还是为了扩展性所做的必要 ...