后摩爾時代,如何給你的CPU減負?

導(dǎo)讀:通用處理器(CPU)的摩爾定律已入暮年,而機器學(xué)習(xí)和Web服務(wù)的規(guī)模卻在指數(shù)級增長。如何用硬件加速來提升性能、降低成本?下面我們一起來看看。

?一、背景介紹

通用處理器(CPU)的摩爾定律已入暮年,而機器學(xué)習(xí)和Web服務(wù)的規(guī)模卻在指數(shù)級增長。伴隨著當今硬件技術(shù)的成熟發(fā)展,普通CPU無論是在計算能力,還是資源成本上相對于一些專用硬件已經(jīng)沒有絕對優(yōu)勢,這也促使硬件加速技術(shù)得到各大公司的青睞,譬如三大互聯(lián)網(wǎng)巨頭百度、阿里、騰訊內(nèi)部的接入層采用類似KeyLess方案來加速HTTPS的卸載,不僅提高了用戶體驗,還節(jié)省了機器成本。根據(jù)當前調(diào)研結(jié)果發(fā)現(xiàn):目前業(yè)內(nèi)各大公司接入層針對于Gzip采用硬件加速還是一片空白,阿里接入層首次結(jié)合硬件加速技術(shù)卸載Gzip不僅帶來了性能提升,而且對業(yè)界在此領(lǐng)域的發(fā)展也有重大影響意義。?

接入層Tengine當前性能瓶頸是CPU,譬如Gzip模塊在Tengine中CPU占比高達15%-20%左右,相比于其它模塊CPU消耗高、占比呈增長趨勢(后端應(yīng)用壓縮邏輯后續(xù)統(tǒng)一前置接入層)、且集中,所以Gzip模塊使用硬件卸載對于性能提升、成本優(yōu)化是不可或缺。

二、分析與調(diào)研

分析前先簡單介紹下什么是硬件加速: 硬件加速(HardwareAcceleration)就是利用硬件模塊來替代軟件算法以充分利用硬件所固有的快速特性(硬件加速通常比軟件算法的效率要高),從而達到性能提升、成本優(yōu)化目的,當前主要是如下兩大加速方式:

◆ FPGA 現(xiàn)場可編程門陣列,可針對某個具體的軟件算法進行定制化編程,譬如業(yè)內(nèi)的智能網(wǎng)卡;

◆?ASIC 專用集成電路,它是面向?qū)iT用途的電路、專門為一個用戶設(shè)計和制造的,譬如Intel的QAT卡僅支持特定加減密、壓縮算法;

FPGA與ASIC的對比如下表格所示:

?2.1、接入層Tengine CPU消耗分析

主站接入層承載集團90%以上的入口流量,看似只是作為一個七層流量轉(zhuǎn)發(fā)網(wǎng)關(guān),但是卻做了非常之多的事情,譬如https卸載及加速、單元化、智能流量轉(zhuǎn)發(fā)策略、灰度分流、限流、安全防攻擊、流量鏡像、鏈路追蹤、頁面打點等等,這一系列功能的背后是Tengine眾多模塊的支持。由于功能點比較多,所以這就導(dǎo)致Tengine的CPU消耗比較分散,其主流程處理如下圖所示:

?各模塊CPU消耗占比Top 5如下表格所示:

?就當前接入層流量模型分析來看,Gzip單個模塊CPU消耗占比達到15%-20%左右(注:主要是壓縮消耗)且占比呈上升趨勢,所以對Gzip使用硬件卸載迫在眉睫。

2.2、加速方案調(diào)研

2.2.1、Intel QAT卡

QAT(Quick Assist Technology)是Intel公司推出的一種專用硬件加速卡,不僅對SSL非對稱加解密算法(RSA、ECDH、ECDSA、DH、DSA等)具有加速,而且對數(shù)據(jù)的壓縮與解壓也具有加速效果;

QAT加速卡提供zlib壓縮算法、且zlib shim對其原生zlib與QAT之間做了適配,調(diào)用方式和zlib庫方式基本一致,需在上層業(yè)務(wù)中開啟zlib QAT模式、相對來說對上層業(yè)務(wù)改造較少。

2.2.2、智能網(wǎng)卡

INIC(Intelligent Network Interface Card)是網(wǎng)絡(luò)研發(fā)事業(yè)部自研產(chǎn)品,以網(wǎng)絡(luò)處理器為核心的高性能網(wǎng)絡(luò)接入卡,對于網(wǎng)絡(luò)報文數(shù)據(jù)的處理非常合適,針對Tengine的gzip卸載有如下兩種方案:

◆?a. 提供壓縮API給host,把壓縮數(shù)據(jù)返回host,由host封包發(fā)送;

◆?b. host和網(wǎng)卡約定壓縮flag,host發(fā)送未壓縮報文,智能網(wǎng)卡收到后進行壓縮,并且重新封包發(fā)送;

2.2.3、FPGA卡

FPGA(Field-Programmable Gate Array)現(xiàn)場可編程門陣列,需要對接入層使用的zlib算法使用硬件語言重新開發(fā)、進行電路燒寫,且上層交互驅(qū)動也需要從零開發(fā);

方案對比

智能網(wǎng)卡的方案1相比于QAT對zlib處理沒有性能上的優(yōu)勢,智能網(wǎng)卡只是對zlib進行軟件卸載、相對于QAT并不具有加速作用;其方案2需要把Tengine一部分業(yè)務(wù)邏輯抽取到網(wǎng)卡中做:如spdy、http2、chunked、ssl對稱加密、響應(yīng)body限速等邏輯,其成本及風(fēng)險高,方案3的FPGA方式相對來說開發(fā)成本較高、且相關(guān)資源匱乏。

綜上所述最終采用QAT加速卡對接入層Tengine的Gzip進行卸載、加速。

三、方案實施

QAT驅(qū)動采用UIO(UserspaceI/O)技術(shù),其大部分處于用戶態(tài)、只有少部分處理硬件中斷應(yīng)答等邏輯處于內(nèi)核態(tài),這樣不僅方便用戶調(diào)試,而且還解決了內(nèi)核不支持浮點數(shù)運算的問題。當然QAT加速卡也順應(yīng)了Docker虛擬化的潮流,其采用SRIOV技術(shù),可以在虛擬機之間高效共享PCIe(Peripheral Component Interconnect Express)設(shè)備,當前DH895XCC系列芯片最高可支持32個虛擬機共享QAT,從而達到充分利用硬件資源。其次QAT屬于ASIC模式相比于FPGA具有更好的加速效果,主要原因是由于FPGA為了可重構(gòu),導(dǎo)致其邏輯查找表、觸發(fā)器眾多以及相同邏輯電路在布線上延時變大。

接入層Tengine目前采用的是下圖左邊的實線加速鏈路,其中Zlib Shim、QAT User Space Api、QAT Driver作為Tengine Gzip與底層硬件QAT的通信適配層,此方式對上層業(yè)務(wù)入侵較小、其軟件架構(gòu)如下圖所示:

?雖然該方案看起來比較簡單,但是真正線上實施的時候還是遇到了非常多的問題(功能、性能方面),譬如:

3.1、架構(gòu)不合理

◆?a. 使用的第一版驅(qū)動Intel-Qat2.6.0-60,當QPS為1k左右時CPU很快打滿(注:正常情況下QPS為1k時,CPU消耗6%左右),且CPU消耗中90%以上都是消耗在內(nèi)核態(tài),如下圖所示:

?使用strace進行相關(guān)系統(tǒng)熱點函數(shù)統(tǒng)計發(fā)現(xiàn),其CPU主要消耗在ioctl系統(tǒng)函數(shù)上,如下所示:

?通過perf查看ioctl主要是執(zhí)行內(nèi)存分配命令,由于Zlib Shim需要開辟連續(xù)的物理內(nèi)存、所以出現(xiàn)頻繁調(diào)用 compact_zone進行內(nèi)碎片整理,其調(diào)用熱的高達88.096%,如下圖所示(注:熱度表示該函數(shù)該函數(shù)自身的熱度、調(diào)出: 表示被調(diào)用函數(shù)的熱度總和、總體: 熱度 + 調(diào)出):

?同Intel研發(fā)聯(lián)調(diào)討論后發(fā)現(xiàn)是由于當前Intel QAT的Zlib Shim的模型不合理所導(dǎo)致,通過推動其改造采用OOT的內(nèi)存管理模塊USDM(內(nèi)部維護一個HugePage內(nèi)存池)方案解決。

◆?b. 使用上述問題解決后的驅(qū)動intel-qatOOT31092,測試后發(fā)現(xiàn)CPU節(jié)省效果不佳(用戶態(tài)CPU減少、但是增加了內(nèi)核態(tài)的CPU),經(jīng)分析、發(fā)現(xiàn)使用QAT加速后,部分系統(tǒng)函數(shù)CPU占比變高,如 open、ioctl、futex,如下圖所示(注:左邊的是使用QAT后各系統(tǒng)熱點函數(shù)),使用QAT后open、ioctl、futex執(zhí)行時間占比高達8.95(注:3.91 + 2.68 + 2.36),而未使用版本對應(yīng)占比時間才0.44(注:0.24 + 0.14 + 0.06);

?分析其Tengine的worker進程堆棧信息發(fā)現(xiàn)open、ioctl都是成對出現(xiàn)(即一次http請求出現(xiàn)4次該系統(tǒng)調(diào)用),該現(xiàn)象反饋給Intel的研發(fā)同學(xué)后得知是由于新驅(qū)動的Zlib Shim導(dǎo)致,通過優(yōu)化改造后open、ioctl調(diào)用頻率明顯減少。但是其futex系統(tǒng)調(diào)用頻度卻沒有減少,還是導(dǎo)致內(nèi)核態(tài)的CPU占比較高,通過strace跟蹤發(fā)現(xiàn)一個http壓縮請求后會多次調(diào)用futex、如下圖所示,同Intel研發(fā)同學(xué)了解到Zlib Shim采用多線程方式,其futex操作來自zlib shim等待QAT壓縮或解壓縮數(shù)據(jù)返回的邏輯。

?由于Tengine是多進程單線程、采用epoll異步IO事件模式,聯(lián)調(diào)Intel的研發(fā)同學(xué)對Zlib Shim進行改造(去線程),最終futex系統(tǒng)調(diào)用也明顯減少。

通過分析并推動IntelQAT進行多次架構(gòu)上的改造,才使得QAT的加速特性更好的發(fā)揮。

3.2、功能不完善

◆?a. 使用QAT后執(zhí)行reload,可能導(dǎo)致請求響應(yīng)異常,如下所示:

?由于每個worker進程都需要分配一個QAT Instance用于數(shù)據(jù)解壓縮,Tengine在reload的瞬間worker進程數(shù)可能會翻倍、而QAT Instance初始版本只有64個、所以新啟動的worker進程可能分配不到Instance、導(dǎo)致請求失敗。

針對此問題Intel提供的新版本QAT,其Instance數(shù)量從64提高到256個避免此問題的發(fā)生,同時我們提出容災(zāi)保護方案:當Instance無法分配了需要自動降級為軟件壓縮,提高其可用性。

◆?b. Zlib Shim huge page內(nèi)存泄漏,導(dǎo)致QAT驅(qū)動core dump:

Tengine使用內(nèi)存池模式進行內(nèi)存的管理,即調(diào)用(In)DeflateInit分配的空間無需調(diào)用(In)DeflateEnd處理、在請求結(jié)束的時候會調(diào)用請求r相關(guān)的釋放操作,進行內(nèi)存的歸還,但是由于Zlib Shim使用的huge page必須調(diào)用(In)DeflateEnd才釋放給USDM,通過改造Tengine Gzip相關(guān)代碼后,該問題得以解決,而QAT驅(qū)動的core dump也是由于hugepage的泄漏導(dǎo)致無法成功分配導(dǎo)致。

◆?c. Zlib Shim狀態(tài)機不完善導(dǎo)致特定場景下的壓縮、解壓縮請求異常,等眾多問題就不一一介紹。

一路走來,通過無數(shù)次的性能優(yōu)化、功能測試,多次同Intel研發(fā)同學(xué)一起探討之后,才使得QAT在功能、性能、架構(gòu)方面等眾多問題得以快速解決,下面就準備上線前期準備工作。

3.3、運維梳理

部署發(fā)布

采用單rpm軟件包、雙二進制模式,從而降低軟件版與硬件加速版之間的耦合度,自動識別部署機器是否開啟QAT,并選擇正確的二進制執(zhí)行;

容災(zāi)保護

運行過程中由于某種資源的缺乏導(dǎo)致硬件加速版本Gzip執(zhí)行失敗,將會自動切換為軟件版本、待資源可用時自動切換到硬件加速版本;

可維護與監(jiān)控

雖然上線前做過一系列壓測、穩(wěn)定性并未出現(xiàn)異常,但對硬件加速的相關(guān)資源指標進行實時監(jiān)控還是必不可少;

四、加速效果

測試機器

cpu型號:Intel(R) Xeon(R) CPU E5-2650 v2 @ 2.60GHz? 32核??? 內(nèi)核:2.6.32 Zlib版本:zlib-1.2.8?? QAT驅(qū)動版本:intel-qatOOT40052 ?

數(shù)據(jù)對比

同等條件下,開啟QAT加速后CPU平均值為41%左右,未開啟QAT加速的CPU平均值為48%左右,如下圖所示:

?相同條件下,開啟QAT加速后系統(tǒng)load平均值為12.09,關(guān)閉QAT加速時系統(tǒng)load平均值為14.22,如下圖所示:

?相同條件下,開啟與關(guān)閉QAT加速后,響應(yīng)RT波動不相上下,如下所示:

?同等條件下,各模塊熱點函數(shù)圖對比如下所示,其中紅色圈中的是Gzip相關(guān)函數(shù)

(注:左側(cè)是開啟QAT加速):

?同比條件下Tengine Gzip使用QAT加速卡后,CPU消耗從48%下降到41%,系統(tǒng)負載load下降2個,且根據(jù)模塊熱點函數(shù)圖對比發(fā)現(xiàn)Gzip基本上已經(jīng)完全卸載。

?結(jié)論

綜上數(shù)據(jù)對比,當qps為10k左右時Tengine Gzip使用QAT加速后CPU節(jié)省15%左右,且Gzip基本上完全卸載、隨著其占比變高,優(yōu)化效果將越好。

五、總結(jié)

關(guān)注「技術(shù)邊城」把握前沿技術(shù)脈搏


?

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容