摘要: Tengine在軟件層面已經有了深度的調試和優化經驗,可是在硬件層面,通用處理器(CPU)已經進入了摩爾定律,有了瓶頸。而在業務量日新月異的當下,如何利用硬件來提高性能,承載雙11等大型活動的洪峯流量,保障活動平穩度過呢?本文做者:王發康,花名毅鬆,負責集團主站統一接入層Tengine的開發與維護。算法
Tengine在軟件層面已經有了深度的調試和優化經驗,可是在硬件層面,通用處理器(CPU)已經進入了摩爾定律,有了瓶頸。而在業務量日新月異的當下,如何利用硬件來提高性能,承載雙11等大型活動的洪峯流量,保障活動平穩度過呢?後端
本文做者:王發康,花名毅鬆,負責集團主站統一接入層Tengine的開發與維護。今天分享的主題是《阿里七層流量入口Tengine硬件加速探索之路》。安全
接入層是2015年阿里巴巴全站HTTPS誕生的一個產品。做爲一個電商網站,爲了保護用戶信息安全、帳戶、交易的安全,全站HTTPS是勢在必行,若是淘寶、天貓、聚划算等各業務方在後端各自作接入層,機器成本高,並且證書管理複雜。爲了解決問題,咱們作了統一接入層,來作HTTPS卸載和流量分發等通用功能。性能優化
全部的阿里集團流量經過四層LVS,到達統一接入層,統一接入層根據不一樣的維度域名轉發到對應的後端APP,而且提供智能的流量分發策略。由於抽象出一層,通用的安全防攻擊、鏈路追蹤等高級功能,均可以在這一層統一實現。服務器
接入層是集團全部流量的入口,它的穩定性是很是重要的。同時,接入層提供了這麼多高級功能,因此對其性能的挑戰也很是大。業務驅動了技術創新,2017年接入層在硬件加速領域邁出了第一步。多線程
咱們要對本身的系統作性能優化,首先咱們要找到系統的瓶頸點,而且進行分析與調研。架構
主站接入層承載集團90%以上的入口流量,同時支持着不少高級功能,好比HTTPS卸載及加速、單元化、智能流量轉發策略、灰度分流、限流、安全防攻擊、流量鏡像、鏈路追蹤、頁面打點等等,這一系列功能的背後是Tengine衆多模塊的支持。因爲功能點比較多,因此這就致使Tengine的CPU消耗比較分散,消耗CPU比較大的來自兩個處HTTPS和Gzip,這就是性能瓶頸之所在。運維
雖然全站HTTPS已是一個老生常談的話題,可是國內爲什麼能作到的網站卻仍是屈指可數?緣由簡單總結來講有兩點,首先使用HTTPS後使得網站訪問速度變「慢」,其次致使服務器CPU消耗變高、從而機器成本變「貴」。異步
軟件優化方案:如Session複用、OCSP Stapling、False Start、dynamic record size、TLS1.三、HSTS等。 但軟件層面如何優化也沒法知足流量日益增加的速度,加上CPU摩爾定律已入暮年,使得專用硬件卸載CPU密集型運算成爲業界一個通用解決方案。async
由三部分組成Tengine的ssl_async指令、OpenSSL + QAT Engine及QAT Driver。其中Tengine經過適配OpenSSL-1.1.0的異步接口,將私鑰操做卸載至Intel提供的引擎(QAT engine)中,引擎經過 QAT驅動調用硬件完成非對稱算法取回結果。
該方案在Tengine2.2.2中已經開源。
RSA套件提高3.8倍(8核時)
ECDHE-RSA提高2.65倍(8核時)
ECDHE-ECDSA(P-384) 提高2倍(16核時)
ECDHE-ECDSA(P-256) 8核達到QAT硬件處理峯值16k左右, 只有23%的性能提高。
HTTPS卸載方案能夠減小物理機數量,節省CPU資源,爲公司帶來價值。
當前接入層Gzip模塊的CPU佔比達到15-20%,若是咱們能卸載掉Gzip的CPU消耗,讓出來的CPU就能夠用於處理更多請求和提高性能。
然而目前業內各大公司接入層針對於Gzip採用硬件加速仍是一片空白,阿里在接入層結合硬件加速技術卸載Gzip調研了幾套方案:
方案一是和Intel合做的QAT卡的加速方案,直接把相關軟件算法固化到硬件中去,鏈路會更精簡。
方案二智能網卡方案,須要把Tengine一部分業務邏輯抽取到網卡中作,其成本及風險高,並且只是對zlib進行軟件卸載,相對於QAT並不具備加速做用。
方案三是FPGA卡方案,相對來講開發成本較高,且相關資源匱乏。
綜上評估,選擇方案一對Gzip進行卸載及加速。
左邊的圖是軟件方案,請求進來後,在軟件層面作一些壓縮,所有是用CPU在作。右邊是經過QAT卡來加速,把紅色那部分所有卸載到QAT卡里,經過改造Tengine中的Gzip這個模塊,讓它去調用QAT的驅動,經過硬件作壓縮,最終送回Tengine傳輸給用戶。
使用的初版驅動Intel-Qat 2.6.0-60,當QPS爲1k左右時,從上圖能夠看出,橫座標是時間,縱座標是CPU消耗百分比,跑到第五秒左右,CPU很快打滿,這至關於根本跑不起來。
針對這個問題,咱們使用strace進行相關係統熱點函數統計發現,其CPU主要消耗在ioctl系統函數上,以下所示:
ioctl主要是作上層應用程序和底層通信的,而且CPU消耗中90%以上都是消耗在內核態。由於最初的每一個壓縮請求都要送到硬件中去,buffer須要開闢連續的物理內存,系統跑久了,一旦遇到連續內存分配不成功的狀況,就會須要ioctl去分配內存,出現頻繁調用 compact_zone進行內碎片整理,其調用熱的高達88.096%,若是分配失敗了,就會觸發內存去作碎片整理,因此就會出現sys態CPU持續上升的狀況。
這個問題解決後,也並無那麼順利,咱們遇到了下面的問題。
在平常壓測時,咱們發現CPU用了Gzip卸載方案後,節省效果上並無明顯的提高。user態CPU下降了10%左右,可是sys態CPU相對於軟件版的CPU提高了10%。因此,節省效果不明顯。
經分析,咱們發現使用QAT後,部分系統函數CPU佔比變高,以下圖所示(注:左邊的是使用QAT後各系統熱點函數,右邊是軟件版原生tengine的各系統熱點函數)open、ioctl、futex執行 時間佔比高達8.95(注:3.91 + 2.68 + 2.36),而未使用版本對應占比時間才0.44(注:0.24 + 0.14 + 0.06)。
open和ioctl是因爲Zlib Shim適配層處理邏輯有一些問題,經過優化改造後open、ioctl調用頻率明顯減小。可是其futex系統調用頻度卻沒有減小,仍是致使內核態的CPU佔比較高,經過strace跟蹤發現一個http壓縮請求後會屢次調用futex,Zlib Shim採用多線程方式,其futex操做來自zlib shim等待QAT壓縮或解壓縮數據返回的邏輯,因爲Tengine是多進程單線程、採用epoll異步IO事件模式,聯調Intel的研發同窗對Zlib Shim進行改造(去線程),最終futex系統調用也明顯減小。
一路走來,經過無數次的性能優化、功能測試,咱們與Intel研發同窗一塊兒探討以後,才使得QAT在功能、性能、架構方面等衆多問題得以快速解決。
問題解決後,接下來咱們進行上線前的準備。
1、壓測和演練,這裏主要關注高流量、壓縮與解壓縮流量混跑等狀況下的性能提高狀況,同時關注數據完整性校驗。
2、容災保護,在運行過程當中,當硬件資源缺少致使Gzip執行失敗,會自動切換軟件版本,硬件資源恢復後自動切回。
3、監控,對硬件加速相關的資源指標進行實時監控和報警,防患於未然。
4、部署與發佈,由於存在硬件和軟件兩個版本,因此採用單rpm軟件包、雙二進制模式,從而下降軟件版與硬件加速版之間的耦合度,自動識別部署機器是否開啓QAT,並選擇正確的二進制執行。
上線後咱們得到了一些加速效果的數據。當QPS爲10k左右時,Tengine Gzip使用QAT加速後,CPU節省在15%左右,且Gzip基本上徹底卸載,隨着其佔比變高,優化效果將愈來愈好。在2017年雙11零點流量峯值附近,Tengine加速機器相比普通機器性能提高 21%。
Tengine首次採用硬件加速技術卸載Gzip,不只帶來性能上的提高,並且使得接入層在硬件加速領域再次打下了堅實的基礎,對業界在此領域的發展也有重大影響意義。在將來,Tengine會在軟件和硬件層面繼續探索,爲集團和用戶提供更加高可用、高性能、低成本、安全、運維自動化的系統。