Tengine在軟件層面已經有瞭深度的調試和優化經驗,但是在硬件層面,通用處理器(CPU)已經進入瞭摩爾定律,有瞭瓶頸。而在業務量突飛猛進的當下,如何利用硬件來提升性能,承載雙11等大型活動的洪峰流量,保障活動平穩度過呢?本文作者:王發康,花名毅松,負責集團主站統一接入層Tengine的開發與維護。今天分享的主題是《阿裡七層流量入口Tengine硬件加速探索之路》。接入層系統介紹接入層是2015年阿裡巴巴全站HTTPS誕生的一個產品。作為一個電商網站,為瞭保護用戶信息安全、賬戶、交易的安全,全站HTTPS是勢在必行,如果淘寶、天貓、聚劃算等各業務方在後端各自做接入層,機器成本高,而且證書管理復雜。為瞭解決問題,我們做瞭統一接入層,來做HTTPS卸載和流量分發等通用功能。所有的阿裡集團流量通過四層LVS,到達統一接入層,統一接入層根據不同的維度域名轉發到對應的後端APP,並且提供智能的流量分發策略。因為抽象出一層,通用的安全防攻擊、鏈路追蹤等高級功能,都可以在這一層統一實現。接入層是集團所有流量的入口,它的穩定性是非常重要的。同時,接入層提供瞭這麼多高級功能,所以對其性能的挑戰也非常大。業務驅動瞭技術創新,2017年接入層在硬件加速領域邁出瞭第一步。性能瓶頸分析及解決我們要對自己的系統做性能優化,首先我們要找到系統的瓶頸點,並且進行分析與調研。主站接入層承載集團90%以上的入口流量,同時支持著很多高級功能,比如HTTPS卸載及加速、單元化、智能流量轉發策略、灰度分流、限流、安全防攻擊、流量鏡像、鏈路追蹤、頁面打點等等,這一系列功能的背後是Tengine眾多模塊的支持。由於功能點比較多,所以這就導致Tengine的CPU消耗比較分散,消耗CPU比較大的來自兩個處HTTPS和Gzip,這就是性能瓶頸之所在。一、HTTPS卸載篇雖然全站HTTPS已經是一個老生常談的話題,但是國內為何能做到的網站卻還是屈指可數?原因簡單總結來說有兩點,首先使用HTTPS後使得網站訪問速度變“慢”,其次導致服務器CPU消耗變高、從而機器成本變“貴”。軟件優化方案:如Session復用、OCSP Stapling、False Start、dynamic record size、TLS1.3、HSTS等。 但軟件層面如何優化也無法滿足流量日益增長的速度,加上CPU摩爾定律已入暮年,使得專用硬件卸載CPU密集型運算成為業界一個通用解決方案。Tengine基於Intel QAT的異步加速方案總體架構由三部分組成Tengine的ssl_async指令、OpenSSL + QAT Engine及QAT Driver。其中Tengine通過適配OpenSSL-1.1.0的異步接口,將私鑰操作卸載至Intel提供的引擎(QAT engine)中,引擎通過 QAT驅動調用硬件完成非對稱算法取回結果。該方案在Tengine2.2.2中已經開源。Tengine啟用ssl_async QAT加速後的效果如何?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卸載篇當前接入層Gzip模塊的CPU占比達到15-20%,如果我們能卸載掉Gzip的CPU消耗,讓出來的CPU就可以用於處理更多請求和提升性能。然而目前業內各大公司接入層針對於Gzip采用硬件加速還是一片空白,阿裡在接入層結合硬件加速技術卸載Gzip調研瞭幾套方案:方案一是和Intel合作的QAT卡的加速方案,直接把相關軟件算法固化到硬件中去,鏈路會更精簡。方案二智能網卡方案,需要把Tengine一部分業務邏輯抽取到網卡中做,其成本及風險高,而且隻是對zlib進行軟件卸載,相對於QAT並不具有加速作用。方案三是FPGA卡方案,相對來說開發成本較高,且相關資源匱乏。綜上評估,選擇方案一對Gzip進行卸載及加速。Tengine 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在功能、性能、架構方面等眾多問題得以快速解決。運維與監控問題解決後,接下來我們進行上線前的準備。一、壓測和演練,這裡主要關註高流量、壓縮與解壓縮流量混跑等情況下的性能提升情況,同時關註數據完整性校驗。二、容災保護,在運行過程中,當硬件資源缺乏導致Gzip執行失敗,會自動切換軟件版本,硬件資源恢復後自動切回。三、監控,對硬件加速相關的資源指標進行實時監控和報警,防患於未然。四、部署與發佈,因為存在硬件和軟件兩個版本,所以采用單rpm軟件包、雙二進制模式,從而降低軟件版與硬件加速版之間的耦合度,自動識別部署機器是否開啟QAT,並選擇正確的二進制執行。硬件加速效果上線後我們獲得瞭一些加速效果的數據。當QPS為10k左右時,Tengine Gzip使用QAT加速後,CPU節省在15%左右,且Gzip基本上完全卸載,隨著其占比變高,優化效果將越來越好。在2017年雙11零點流量峰值附近,Tengine加速機器相比普通機器性能提升 21%。展望及總結Tengine首次采用硬件加速技術卸載Gzip,不僅帶來性能上的提升,而且使得接入層在硬件加速領域再次打下瞭堅實的基礎,對業界在此領域的發展也有重大影響意義。在未來,Tengine會在軟件和硬件層面繼續探索,為集團和用戶提供更加高可用、高性能、低成本、安全、運維自動化的系統。
本文出自快速备案,转载时请注明出处及相应链接。