2017雙11技術揭秘—千億級流量來襲,如何用硬體加速技術為CPU減負?
作者:王發康(毅松)
主站接入層是阿里2015年全站HTTPS項目誕生的產品,目前已經承載集團90%以上的入口流量。2016年主站接入層不僅在運維自動化、高可用領域取得重大突破,而且軟體層面上也做過很多性能優化,促使2016年雙11平穩度過。秉著軟硬體結合的性能優化思想,2017年主站接入層在硬體加速領域邁出了第一步。在剛過去的2017年雙11零點流量高峰的考驗下,主站接入層Tengine Gzip硬體加速機器運行平穩、同等條件下相比於未開啟QAT加速的機器性能提升21%左右。
背景介紹
眾所周知,通用處理器(CPU)的摩爾定律已入暮年,而機器學習和Web服務需要的運算能力卻指數級增長。隨著如今硬體技術的成熟發展,普通CPU無論是在計算能力,還是資源成本上相對於一些專用加速硬體已經沒有絕對優勢,這也促使硬體加速技術得到各大公司的青睞,譬如三大互聯網巨頭百度、阿里、騰訊內部的接入層採用類似KeyLess方案來加速HTTPS的卸載,不僅提高了用戶體驗,還節省了機器成本。根據當前調研結果發現:目前業內各大公司接入層針對於Gzip採用硬體加速還是一片空白,阿里接入層首次結合硬體加速技術卸載Gzip不僅帶來了性能提升,而且對業界在此領域的發展也有重大影響意義。
接入層Tengine當前性能瓶頸是CPU,譬如Gzip模塊在Tengine中CPU佔比高達15%-20%左右,相比於其它模塊CPU消耗高、佔比呈增長趨勢(後端應用壓縮邏輯後續統一前置接入層)、且集中,所以Gzip模塊使用硬體卸載對於性能提升、成本優化是不可或缺。
分析與調研
分析前先簡單介紹下什麼是硬體加速: 硬體加速(Hardware Acceleration)就是利用硬體模塊來替代軟體演算法以充分利用硬體所固有的快速特性(硬體加速通常比軟體演算法的效率要高),從而達到性能提升、成本優化目的,當前主要是如下兩大加速方式:
- FPGA 現場可編程門陣列,可針對某個具體的軟體演算法進行定製化編程,譬如業內的智能網卡;
- ASIC 專用集成電路,它是面向專門用途的電路、專門為一個用戶設計和製造的,譬如Intel的QAT卡僅支持特定加減密、壓縮演算法;FPGA與ASIC的對比如下表格所示:
模式上市速度性能一次性成本量產成本可配置FPGA周期較短較差(1x)較低高(100x)靈活ASIC周期較長好(4x)較高低(1x)有限
接入層Tengine CPU消耗分析
主站接入層承載集團90%以上的入口流量,看似只是作為一個七層流量轉髮網關,但是卻做了非常之多的事情,譬如https卸載及加速、單元化、智能流量轉發策略、灰度分流、限流、安全防攻擊、流量鏡像、鏈路追蹤、頁面打點等等,這一系列功能的背後是Tengine眾多模塊的支持。由於功能點比較多,所以這就導致Tengine的CPU消耗比較分散,其主流程處理如下圖所示:
各模塊CPU消耗佔比Top 5如下表格所示:
模塊名稱功能介紹CPU佔比Gzip解壓縮15%-20%Sinfo流量鏡像10%TMD限流8%Lualua相關業務8%WAF防火牆6%
其它眾多模塊 ... ...
就當前接入層流量模型分析來看,Gzip單個模塊CPU消耗佔比達到15%-20%左右(註:主要是壓縮消耗)且佔比呈上升趨勢,所以對Gzip使用硬體卸載迫在眉睫。
加速方案調研
Intel QAT卡
QAT(Quick Assist Technology )是Intel公司推出的一種專用硬體加速卡,不僅對SSL非對稱加解密演算法(RSA、ECDH、ECDSA、DH、DSA等)具有加速,而且對數據的壓縮與解壓也具有加速效果;QAT加速卡提供zlib壓縮演算法、且zlib shim對其原生zlib與QAT之間做了適配,調用方式和zlib庫方式基本一致,需在上層業務中開啟zlib QAT模式、相對來說對上層業務改造較少.
智能網卡
INIC(Intelligent Network Interface Card)是網路研發事業部自研產品,以網路處理器為核心的高性能網路接入卡,對於網路報文數據的處理非常合適,針對Tengine的gzip卸載有如下兩種方案:
- 提供壓縮API給host,把壓縮數據返回host,由host封包發送;
- host和網卡約定壓縮flag,host發送未壓縮報文,智能網卡收到後進行壓縮,並且重新封包發送;
FPGA卡
FPGA(Field-Programmable Gate Array)現場可編程門陣列,需要對接入層使用的zlib演算法使用硬體語言重新開發、進行電路燒寫,且上層交互驅動也需要從零開發;
方案對比
智能網卡的方案1相比於QAT對zlib處理沒有性能上的優勢,智能網卡只是對zlib進行軟體卸載、相對於QAT並不具有加速作用;其方案2需要把Tengine一部分業務邏輯抽取到網卡中做:如spdy、http2、chunked、ssl對稱加密、響應body限速等邏輯,其成本及風險高,方案3的FPGA方式相對來說開發成本較高、且相關資源匱乏。
綜上所述最終採用QAT加速卡對接入層Tengine的Gzip進行卸載、加速。
方案實施
QAT驅動採用UIO(Userspace I/O)技術,其大部分處於用戶態、只有少部分處理硬體中斷應答等邏輯處於內核態,這樣不僅方便用戶調試,而且還解決了內核不支持浮點數運算的問題。當然QAT加速卡也順應了Docker虛擬化的潮流,其採用SRIOV技術,可以在虛擬機之間高效共享PCIe(Peripheral Component Interconnect Express)設備,當前DH895XCC系列晶元最高可支持32個虛擬機共享QAT,從而達到充分利用硬體資源。其次QAT屬於ASIC模式相比於FPGA具有更好的加速效果,主要原因是由於FPGA為了可重構,導致其邏輯查找表、觸發器眾多以及相同邏輯電路在布線上延時變大。
接入層Tengine目前採用的是下圖左邊的實線加速鏈路,其中Zlib Shim、QAT User Space Api、QAT Driver作為Tengine Gzip與底層硬體QAT的通信適配層,此方式對上層業務入侵較小、其軟體架構如下圖所示:
雖然該方案看起來比較簡單,但是真正線上實施的時候還是遇到了非常多的問題(功能、性能方面),譬如:
架構不合理
- 使用的第一版驅動Intel-Qat2.6.0-60,當QPS為1k左右時CPU很快打滿(註:正常情況下QPS為1k時,CPU消耗6%左右),且CPU消耗中90%以上都是消耗在內核態,如下圖所示:
使用strace進行相關係統熱點函數統計發現,其CPU主要消耗在ioctl系統函數上,如下所示:
通過perf查看ioctl主要是執行內存分配命令,由於Zlib Shim需要開闢連續的物理內存、所以出現頻繁調用 compact_zone進行內碎片整理,其調用熱的高達88.096%,如下圖所示(註:熱度表示該函數該函數自身的熱度、調出: 表示被調用函數的熱度總和、總體: 熱度 + 調出):
同Intel研發聯調討論後發現是由於當前Intel QAT的Zlib Shim的模型不合理所導致,通過推動其改造採用OOT的內存管理模塊USDM(內部維護一個HugePage內存池)方案解決。
- 使用上述問題解決後的驅動intel-qatOOT31092,測試後發現CPU節省效果不佳(用戶態CPU減少、但是增加了內核態的CPU),經分析、發現使用QAT加速後,部分系統函數CPU佔比變高,如 open、ioctl、futex,如下圖所示(註:左邊的是使用QAT後各系統熱點函數),使用QAT後open、ioctl、futex執行時間佔比高達8.95(註:3.91 + 2.68 + 2.36),而未使用版本對應佔比時間才0.44(註:0.24 + 0.14 + 0.06);
分析其Tengine的worker進程堆棧信息發現open、ioctl都是成對出現(即一次http請求出現4次該系統調用),該現象反饋給Intel的研發同學後得知是由於新驅動的Zlib Shim導致,通過優化改造後open、ioctl調用頻率明顯減少。但是其futex系統調用頻度卻沒有減少,還是導致內核態的CPU佔比較高,通過strace跟蹤發現一個http壓縮請求後會多次調用futex、如下圖所示,同Intel研發同學了解到Zlib Shim採用多線程方式,其futex操作來自zlib shim等待QAT壓縮或解壓縮數據返回的邏輯。
由於Tengine是多進程單線程、採用epoll非同步IO事件模式,聯調Intel的研發同學對Zlib Shim進行改造(去線程),最終futex系統調用也明顯減少。
通過分析並推動Intel對QAT進行多次架構上的改造,才使得QAT的加速特性更好的發揮。
功能不完善
- 使用QAT後執行reload,可能導致請求響應異常,如下所示:
由於每個worker進程都需要分配一個QAT Instance用於數據解壓縮,Tengine在reload的瞬間worker進程數可能會翻倍、而QAT Instance初始版本只有64個、所以新啟動的worker進程可能分配不到Instance、導致請求失敗。
針對此問題Intel提供的新版本QAT,其Instance數量從64提高到256個避免此問題的發生,同時我們提出容災保護方案:當Instance無法分配了需要自動降級為軟體壓縮,提高其可用性。
- Zlib Shim huge page內存泄漏,導致QAT驅動core dump:Tengine使用內存池模式進行內存的管理,即調用(In)DeflateInit分配的空間無需調用(In)DeflateEnd處理、在請求結束的時候會調用請求r相關的釋放操作,進行內存的歸還,但是由於Zlib Shim使用的huge page必須調用(In)DeflateEnd才釋放給USDM,通過改造Tengine Gzip相關代碼後,該問題得以解決,而QAT驅動的core dump也是由於hugepage的泄漏導致無法成功分配導致。
- Zlib Shim狀態機不完善導致特定場景下的壓縮、解壓縮請求異常,等眾多問題就不一一介紹。一路走來,通過無數次的性能優化、功能測試,多次同Intel研發同學一起探討之後,才使得QAT在功能、性能、架構方面等眾多問題得以快速解決,下面就準備上線前期準備工作。
運維梳理
部署發布
採用單rpm軟體包、雙二進位模式,從而降低軟體版與硬體加速版之間的耦合度,自動識別部署機器是否開啟QAT,並選擇正確的二進位執行;容災保護
運行過程中由於某種資源的缺乏導致硬體加速版本Gzip執行失敗,將會自動切換為軟體版本、待資源可用時自動切換到硬體加速版本;可維護與監控
雖然上線前做過一系列壓測、穩定性並未出現異常,但對硬體加速的相關資源指標進行實時監控還是必不可少;加速效果
測試機器
cpu型號:Intel(R) Xeon(R) CPU E5-2650 v2 @ 2.60GHz 32核 內核:2.6.32 Zlib版本:zlib-1.2.8 QAT驅動版本:intel-qatOOT40052
數據對比同等條件下,開啟QAT加速後CPU平均值為41%左右,未開啟QAT加速的CPU平均值為48%左右,如下圖所示:相同條件下,開啟QAT加速後系統load平均值為12.09,關閉QAT加速時系統load平均值為14.22,如下圖所示:
相同條件下,開啟與關閉QAT加速後,響應RT波動不相上下,如下所示:
同等條件下,各模塊熱點函數圖對比如下所示,其中紅色圈中的是Gzip相關函數(註:左側是開啟QAT加速):
同比條件下Tengine Gzip使用QAT加速卡後,CPU消耗從48%下降到41%,系統負載load下降2個,且根據模塊熱點函數圖對比發現Gzip基本上已經完全卸載。
場景CPU消耗系統負載load響應時間RT(ms)開啟QAT加速41%12.0958.88關閉QAT加速48%14.2259.47
結論
綜上數據對比,當qps為10k左右時Tengine Gzip使用QAT加速後CPU節省15%左右,且Gzip基本上完全卸載、隨著其佔比變高,優化效果將越好。在雙11零點高峰的考驗下,接入層Tengine Gzip硬體加速機器運行平穩、同等條件下相比於未開啟QAT加速的機器性能提升21%左右;
總結
接入層Tengine Gzip硬體加速項目是阿里存儲技術Tair&Tengine團隊及伺服器研發計算團隊與英特爾數據中心網路平台團隊齊心協力下的產物,不僅帶來了性能提升,而且使得接入層在硬體加速領域再次打下了堅實的基礎、為明年SSL+Gzip架構上整合做好了沉澱,同時也填充了業內接入層對Gzip採用硬體加速的空白,對此領域的發展具有一定的影響意義。
推薦閱讀:
※《遊戲行業DDoS攻擊解決方案》重磅發布
※2017雙11技術揭秘—TDDL/DRDS 的類 KV 查詢優化實踐
※鄭葉來:為什麼華為雲的「三不」很重要
※深入淺出雲計算經濟學
※雲資料庫SQL Server 2008 R2版推出OSS版本數據上雲
TAG:雲計算 |