Tengine開源新特性:如何讓HTTPS處理能力輕鬆翻倍?
摘要: Tengine,輕量級Web伺服器,基於Nginx進行開發,針對大訪問量網站的需求,新增了很多高級功能和特性。比如,Tengine兼容Nginx的所有配置,並且增加了獨立進程框架、頁面優化、集成了Lua語言進行擴展等很多實用的功能,並在性能方面做了較大的提升。
作者:毅松
原文
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驅動完成對硬體的操作。
原理介紹
Tengine在原有socket介面非同步讀/寫事件的基礎上擴展出針對非同步硬體引擎的非同步事件(圖二所示),並在原有的連接結構體中增加新的非同步來源即async_fd用來接收非同步引擎的通知,當執行OpenSSL相關操作時,把返回的事件fd載入到Tengine的非同步事件框架中,當檢測到硬體執行完相關操作後就會喚醒相關事件進行後續操作的執行。
當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進入引擎,回收相應的結果完成該次卸載操作。這種處理方式最大化的利用了硬體資源,大大提高了伺服器端的並發處理能力。
其工作流程如圖三所示,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,如下圖所示:
當使用ECDHE-RSA-AES128-GCM-SHA256加密套件時,Tengine啟用ssl_asyncQAT加速只需16核QPS就可以達到15k、而關閉QAT場景下32核CPU全部打滿時QPS才達到9.4k,如下圖所示:
當使用ECDHE-ECDSA-AES128-GCM-SHA256加密套件(secp384r1),Tengine啟用ssl_asyncQAT加速只需8核QPS就可以達到13k、而關閉QAT場景下需要32核CPU全部打滿時QPS才達到11k,如下圖所示:
當使用ECDHE-ECDSA-AES128-GCM-SHA256加密套件(prime256v1)時,Tengine啟用ssl_asyncQAT加速時8核就可以到達硬體處理峰值16k,關閉QAT時32核QPS可到達29k,如下圖所示:
總結
當Tengine啟用ssl_asyncQAT加速時,加密套件使用RSA-RSA演算法時HTTPS處理能力是非加速版Tengine的3.8倍(8核時),使用ECDHE-RSA演算法的HTTPS處理能力是非加速版Tengine的2.65倍(8核時),使用ECDHE-ECDSA(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在功能和性能方面都能做到極致發揮。
本文來自雲棲社區合作夥伴「阿里技術」
更多技術乾貨敬請關注云棲社區知乎機構號:阿里云云棲社區 - 知乎
推薦閱讀:
※Python中,將字元串寫到文件可以通過一下兩種方式實現: 1、print >> log_file, "Hello world!
" 2、log_file.write("Hello world!
") 這兩種方式在性能上有差別么?那個更快?
※自習周報:Dropbox性能之路
※【瓦罐態度】<WagonAttitue>性能之餘的姿態?Green RS4
※JIT 為什麼能大幅度提升性能?
※加速你的MATLAB開發(4): 自動生成C/C++代碼