阿里妹导读: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服务器的更多相关文章

  1. 轻量级web服务器lighttpd的编译及配置(for x86-linux)

    转自:http://blog.163.com/ljf_gzhu/blog/static/131553440201211522317367/ 备注: PC Linux:Ubuntu-10.10 Linu ...

  2. 一篇文章带你了解轻量级Web服务器——Nginx简单入门

    一篇文章带你了解轻量级Web服务器--Nginx简单入门 Nginx是一款轻量级的Web服务器/反向代理服务器及电子邮件代理服务器 在本篇中我们会简单介绍Nginx的特点,安装,相关指令使用以及配置信 ...

  3. Tomcat轻量级web服务器

    1.三种web服务器 apache: 动态网站 nginx: 静态网站 tomcat:java开发的程序 2.tomcat安装 官网下载安装包(tomcat 9) 解压并放在/usr/local下 c ...

  4. lighttpd 轻量级WEB服务器

    Lighttpd 是一款开源 Web 服务器软件.Lighttpd 安全快速,符合行业标准,适配性强并且针对高配置环境进行了优化.相对于其它的 Web 服务器而言,Lighttpd 占用内存更少:因其 ...

  5. HttpServer:一款Windows平台下基于IOCP模型的高并发轻量级web服务器

    HttpServer的特点1.完全采用IOCP模型,实现真正的异步IO,高并发.高可靠: 2.支持4G以上文件下载: 3.支持断点续传: 4.轻量级,体积小,服务器文件仅200多K,无任何依赖库: 5 ...

  6. http-server 超轻量级web服务器

    有的时候做前端,想要运行一些代码,但是又没有必要使用tomcat或者Apache http server,这个时候一个轻量级的简单的http server就可以搞定了. Http-server是基于n ...

  7. Python——轻量级web服务器flask的学习

    前言: 根据工程需要,开始上手另一个python服务器---flask,flask是一个轻量级的python服务器,简单易用.将我的学习过程记录下来,有新的知识会及时补充. 记录只为更好的分享~ 正文 ...

  8. 轻量级Web服务器http-server

    http-server是一个简单的零配置命令行http服务器.可用于h5页面手机端测试 Vue .Angualr.React项目打包后真机测试 github地址:https://github.com/ ...

  9. HttpServer: 基于IOCP模型且集成Openssl的轻量级高性能web服务器

    2021年4月写过一个轻量级的web服务器HttpServer,见文章: <HttpServer:一款Windows平台下基于IOCP模型的高并发轻量级web服务器>,但一直没有时间添加O ...

随机推荐

  1. 理解粒子滤波(particle filter)

    1)初始化阶段-提取跟踪目标特征 该阶段要人工指定跟踪目标,程序计算跟踪目标的特征,比如可以采用目标的颜色特征.具体到Rob Hess的代码,开始时需要人工用鼠标拖动出一个跟踪区域,然后程序自动计算该 ...

  2. 第十次ScrumMeeting博客

    第十次ScrumMeeting博客 本次会议于11月5日(日)22时整在新主楼G座2楼召开,持续20分钟. 与会人员:刘畅.辛德泰.窦鑫泽.张安澜.赵奕.方科栋. 特邀嘉宾:陈彦吉学长. 1. 每个人 ...

  3. React Native iOS 离线包

    平时使用React Native 时候, js代码和图片资源运行在一个Debug Server上(需要cd 到RN目录,然后终端执行 npm start 命令开启本地服务 ).每次更新代码之后只需要使 ...

  4. C++ 函数 函数的重载 有默认参数的函数

    函数的重载 C++允许用同一函数名定义多个函数,这些函数的参数个数和参数类型不同.这就是函数的重载(function overloading). int max1(int a,int b, int c ...

  5. LeetCode 461. Hamming Distance (C++)

    题目: The Hamming distance between two integers is the number of positions at which the corresponding ...

  6. 三维空间中xoy平面上特定抛物线的正等测投影解析解的一种求法

    背景 背景:为锻炼代同学,老师给了她一个反向工程微信"跳一跳"小游戏的任务,希望做一个一样的出来.跳一跳中,有方块,有小人,小人站在方块上. 这个游戏的玩法是,用手指按住手机屏幕, ...

  7. 面向对象OO第5-7次作业总结

    面向对象OO第5-7次作业总结 学习OO七周了,深切的感受到了这门课程的不友好.前三次作业能够算是勉强地通过了,但是从第五次作业开始就完全GG了.这三次作业,从多线程电梯开始,然后文件监控,然后到出租 ...

  8. Javascript实现大整数加法

    记得之前面试还被问到过用两个字符串实现两个大整数相加,当时还特别好奇好好的整数相加,为什么要用字符串去执行.哈哈,感觉当时自己还是很无知的,面试官肯定特别的无奈.今天在刷算法的时候,无意中看到了为什么 ...

  9. 软工1816 · Beta冲刺(4/7)

    团队信息 队名:爸爸饿了 组长博客:here 作业博客:here 组员情况 组员1(组长):王彬 过去两天完成了哪些任务 推进安卓端各个接口的开发,安卓端各个接口已经基本完成 完成食堂各个平面图的绘制 ...

  10. dazhewang数据库初设计

    mysql> use dazhe; Database changed mysql> create table shops(id int primary key auto_increment ...