加入星計劃,您可以享受以下權(quán)益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴散
  • 作品版權(quán)保護
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長期合作伙伴
立即加入
  • 正文
    • 體系結(jié)構(gòu)相關(guān)
    •  
    • 文件系統(tǒng)和BlockLayer
    • 虛擬化和容器
  • 相關(guān)推薦
申請入駐 產(chǎn)業(yè)圖譜

Linux閱碼場 - Linux內(nèi)核月報(2020年12月)

2021/01/25
429
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

體系結(jié)構(gòu)相關(guān)

5.10版本中RISC-V架構(gòu)合入了UEFI這個大特性,這個特性由西數(shù)的兩位工程師AnupPatel和AtishPatra貢獻,共7個補丁,支持了earlyioremap,用于UEFI啟動內(nèi)核所需的PE/COFFheader,theRISC-VEFIstub和EFIruntimeservices。

此外,5.10版本中有不少和ARM架構(gòu)相關(guān)的特性,例如之前提到的MTE補丁,該功能借助ARMv8架構(gòu)中不使用的幾個高地址bit位(參見ARMv8programmingguide描述的TBI:TopByteIgnore)作為tag,可以檢測下面錯誤:boundsviolations,,use-after-free,use-after-return,use-out-of-scope,usebeforeinitialization。用戶空間MTE的支持和內(nèi)核MTE的selftest測試用例該版本都合入了。內(nèi)核空間MTE的支持則在5.11mergewindow合入。

這個版本還增強了pointerauthentication,Pointerauthentication可以降低ROP(Return-orientedprogramming)攻擊風險。和MTE類似,PAC使用了系統(tǒng)不使用的地址高位作為簽名(PAC),5.10的版本中,增強了PAC的生成算法,并且當authenticate指令失敗,會產(chǎn)生fault。值得注意的是,如果fault發(fā)給用戶空間,這里的行為和之前的實現(xiàn)有變化,之前會給用戶空間發(fā)SIGSEGV(Invalidmemoryreference),而目前會發(fā)送SIGILL(IllegalInstruction)。另外一個需要注意的是,MTE和pointerauthentication都使用了地址都高位,如果同時打開,PAC可用比特會減少。

 

Thearm64architecturecannowdoperformance-eventsmonitoringoverArm’sCMN-600interconnect

調(diào)測是系統(tǒng)軟件很重要的一部分能力,有純軟件的方式,也有軟硬結(jié)合的方式。例如想分析cache性能,可以通過硬件PMU(PerformanceMonitorUnit)得到cachemissrate等數(shù)據(jù)。PMU可以在CPU,總線等模塊中。這個補丁提到的PMU是系統(tǒng)總線中的PMU。

CMN-600是ARM公司與2016年推出的系統(tǒng)總線IP,最大支持128個處理器和8T內(nèi)存。CMN代表CoherentMeshNetwork,顧名思義,是個網(wǎng)絡(luò)結(jié)構(gòu),它的基本結(jié)構(gòu)是XP(crosspoint)。CMN最大支持8x8=64個XP節(jié)點,每個節(jié)點可以支持兩個Device,例如處理器,IO設(shè)備等,也包括調(diào)測設(shè)備,例如DTC。DTC是DebugTraceController的縮寫,負責整體的PMU管理和中斷(XP節(jié)點中有l(wèi)ocalmonitor)。下圖來自CMN-600TRM,是一個3x5的mesh網(wǎng)絡(luò)例子。

Linux系統(tǒng)的PMU是事件(event),通常的做法是通過perf_pmu_register注冊。在armcmn實現(xiàn)中,arm_cmn_probe調(diào)用了該函數(shù)注冊pmu的attributegroup和pmu的event,也就是注冊該PMU支持的調(diào)測能力。例如armcmn驅(qū)動中注冊了400多種事件,其中PMU_HN_CACHE_MISS_EVENT和PMU_HNSLC_SF_CACHE_ACCESS_EVENT,可以用于計算cachemissrate(Cachemissrate(%)=Totalcachemisses/Totalcacheaccessesx100)。注冊后,調(diào)用者(例如perf_event_open)初始化并注冊event到perf_event_groups中,該event的相關(guān)處理函數(shù)是前述arm_cmn_probe注冊的。這是Linuxpmuevent通常的管理方式。cmn驅(qū)動稍微多做了一些事情:cmn網(wǎng)絡(luò)需要通過discovery發(fā)現(xiàn),而不是固定寫死的網(wǎng)絡(luò);發(fā)現(xiàn)之后,需要初始化前述的DTC,并為DTC注冊中斷。

這個補丁分為兩部分,其中文檔簡述了CMN-600以及PMU驅(qū)動的一些實現(xiàn)考慮,具體實現(xiàn)在“drivers/perf/arm-cmn.c“,感興趣的童鞋可以根據(jù)前面內(nèi)容讀讀代碼(參見上圖,圖片節(jié)選自閱碼場張健老師的ARMLinux課程)。

文件系統(tǒng)和BlockLayer

ext4:兩個提升性能的改進點

補丁1:https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=9faac62d40131521973192e46a82d5066bb42c09

補丁2:https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=f5b8b297b04208e101c1f92fe804cd4e66df30e8

在ext4的iomap中,如果是復(fù)寫,在已經(jīng)映射了塊的情況下,直接使用已有的映射信息,而不是重新映射。一個非常簡單的改動,在DAX&DIO模式下,能大幅提升文件隨機復(fù)寫的速度。在使能了模擬pmem(DAX)的PPC64VM設(shè)備上測試,約有10倍的隨機復(fù)寫性能提升。但在常規(guī)的IO操作(非iomap)中,其實并不會有影響。

另外一個fastcommit的新功能實用性更強。在ext4的data=ordered的日志模式中,會在日志中記錄下完整的元數(shù)據(jù)。一個完整的元數(shù)據(jù)有時候也是有冗余的,大多時候改動可能只有一點點。能不能只記錄涉及的最少改動?這就是fastcommit新功能要做的事情。fast_commit的功能需要在mkfs時使能,已有的舊的ext4fs并不能生效。

overlayfs:新增volatile的掛載參數(shù)

補?。篽ttps://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=c86243b090bc25f81abe33ddfa9fe833e02c4d64

我們通過sync來保證數(shù)據(jù)刷入,但如果太頻繁的sync卻會嚴重拖慢了性能。有使用者抱怨,dnf/yum安裝包時總會觸發(fā)大量的sync,嚴重拖慢了image的創(chuàng)建速度。

有些使用場景下,使用者并不希望頻繁響應(yīng)sync,只需要在umount時回刷overlayfs的upperlayer文件系統(tǒng)足夠了。甚至根本不在意upperlayer文件系統(tǒng)是否同步,如果數(shù)據(jù)不完整,丟棄并重新創(chuàng)建即可。

為了滿足這樣的需求,新支持了volatile掛載參數(shù)。在使能了這樣的掛載參數(shù)后,對upperlayer文件系統(tǒng)的任何形式的sync都會被忽略。

這個新的掛載參數(shù)并不常用,使用者應(yīng)根據(jù)自己的場景來確定是否使能。

null_blk:一個測試不同塊層實現(xiàn)的性能的模擬塊設(shè)備

補?。篽ttps://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=dc4d137ee3b79a7474b747b4b326d472ccc2cb79

5.10合入了一個關(guān)于null_blk的優(yōu)化補丁,添加支持最大打開和活躍的zones的限制。相信大多數(shù)人也是第一次聽說nullblock設(shè)備。/dev/null的字符設(shè)備用多了,nullblock是干嘛的呢?

nullblock的資料非常少,只因其使用場景也非常局限。在Linux的文檔中是少有的介紹nullblock設(shè)備的資料。nullblock模擬了一個塊設(shè)備,這個塊設(shè)備不響應(yīng)任何的讀寫操作,實際上,也僅僅是在request隊列中直接標識request完成就返回了。可以發(fā)現(xiàn),nullblock雖然不對應(yīng)任何具體的塊設(shè)備,但經(jīng)歷過完整的塊層,因此nullblock常用于測試不同塊層實現(xiàn)模型的性能,例如multi-queue塊層、single-queue塊層、bio-based。

虛擬化和容器

在5.10Release中我們在前幾個月介紹過的幾個補丁集已經(jīng)被合并:

1. AddsupportforNitroEnclaves。

NitroEnclaves(NE)是Amazon彈性計算云(EC2)的一種新功能。它允許客戶在EC2實例[1]內(nèi)部再分割出一塊隔離的計算環(huán)境。

例如,一個在虛擬機中運行的用于處理敏感數(shù)據(jù)的應(yīng)用程序,可以和運行在同一個虛擬機中的其它應(yīng)用程序分離開。我們稱呼這個運行EC2實例的虛擬機為主虛擬機。分離后,這個應(yīng)用程序運行在和主虛擬機不同的另外一個單獨虛擬機里,也可以叫做enclave。

2. Supportvirtiocross-deviceresources。

這個補丁實現(xiàn)了VIRTIO跨設(shè)備的資源共享。他可以支持將VIRTIO資源導(dǎo)入到VIRTIO-VIDEO驅(qū)動中。

3. virtiofs:AddsDAXsupport。

該特性允許客戶機在使用virtiofs文件系統(tǒng)時繞過客戶機的頁面緩存,同時允許客戶機將主機上的頁面緩存直接映射到客戶機地址空間。這在很多數(shù)情況下,都可以大大提高訪問速度。因為文件數(shù)據(jù)不必在客戶機中復(fù)制,而是直接從主機頁面緩存中訪問,這可以節(jié)省大量內(nèi)存。

還有一些補丁集我們之前沒有介紹過,其中有一個關(guān)于vDPA的

vDPA:APIforreportingIOVArange:

這個補丁集導(dǎo)出了一個API,可以向用戶態(tài)程序報告IOVA范圍。這是這個API的功能,可以讓用戶太進程根據(jù)返回的IOVA做出正確的決策:

1. 對于直接使用vhost-vDPA的用戶太進程,IOVA必須在API返回的這個范圍內(nèi)分配。

2. 對于虛擬機(qemu),當vIOMMU未啟用時,如果GPA超出范圍,則在前期就會失敗。

3. 對于虛擬機(qemu),當vIOMMU被啟用時,確定一個有效的虛擬機地址的范圍大小

后,虛擬機的IOVA分配器就可以正常工作了。

這個補丁比較簡單,但我們正好借此機會簡單介紹下

vDPA(Virtualdatapathacceleration):

vDPA本質(zhì)上是一種標準化的方法用來設(shè)計SRIOV的網(wǎng)卡。讓SRIOV網(wǎng)卡在數(shù)據(jù)面使用VIRTIORing的設(shè)計布局,這樣在虛擬機中就只需要單一的VIRTIO網(wǎng)卡驅(qū)動,而不需要部屬各種廠商SRIOV網(wǎng)卡VF的驅(qū)動。這樣相當于將虛擬機和具體的網(wǎng)卡硬件廠商解耦。這不僅僅便于虛擬機的遷移,也方便于虛擬機鏡像的安全認證,不再需要因為更換了網(wǎng)卡的硬件添加了新的VF驅(qū)動再去認證虛擬機鏡像。除了數(shù)據(jù)面之外,它還定義了一個通用的控制面和軟件的底層基礎(chǔ)架構(gòu)來支持它。因此vDPA也可以被看作是SRIOV的一個上層抽象。

那么有的朋友可能會問,這個和VIRTIOfulloffload到硬件的方案有什么區(qū)別?這個從虛擬機里面的最終使用者來看,其實沒有太大的區(qū)別,在虛擬機內(nèi)部都是使用一個VIRTIO網(wǎng)卡驅(qū)動。vDPA帶來的是降低VIRTIO硬件網(wǎng)卡的設(shè)計難度,然后提供更好的設(shè)計靈活性。我們都知道一個VIRTIO設(shè)備包括數(shù)據(jù)面(通過vring中存儲數(shù)據(jù))和控制面(vring的初始化等)。我們在上面的vDPA中提到了控制面,但那個并不是VIRTIO控制面。

VIRTIOfulloffload方案中需要硬件廠商在網(wǎng)卡硬件層面實現(xiàn)VIRTIO的數(shù)據(jù)面和控制面,數(shù)據(jù)面的難度比較低,但是控制面會復(fù)雜很多,因為這個涉及和內(nèi)存管理單元(IOMMU)的交互。而且VIRTIOfulloffload也會帶來產(chǎn)品的同質(zhì)化,不利于廠商做差異化功能,這樣才有了vDPA。

vDPA的控制面可以簡單看作是一個轉(zhuǎn)換層。虛擬機通過vDPA看到的仍然是VIRTIO的控制面接口,不是各個廠商定義的控制面接口。但是vDPA的控制面可以將虛擬機的VIRTIO控制命令,通過vDPA定義的通用控制面接口轉(zhuǎn)換為各個廠商自定義的接口。這只需要在主機端添加vDPA設(shè)備廠商提供的vDPAaddon驅(qū)動即可。廠商的vDPA-addon驅(qū)動可以包含它自己的接口和DMA訪問模型支持等復(fù)雜功能。

簡而言之,vDPA是一種比VIRTIOfulloffload更加靈活的設(shè)計方法,讓網(wǎng)卡設(shè)計廠商可以用更小的代價支持VIRTIO硬件Ring,并仍然在數(shù)據(jù)平面上實現(xiàn)線速性能。

因此當我們討論一個“vDPA設(shè)備”時,就意味著這個設(shè)備的數(shù)據(jù)面是符合VIRTIO標準的,但它的控制面是廠商自己定義的。

相關(guān)推薦

登錄即可解鎖
  • 海量技術(shù)文章
  • 設(shè)計資源下載
  • 產(chǎn)業(yè)鏈客戶資源
  • 寫文章/發(fā)需求
立即登錄

專業(yè)的Linux技術(shù)社區(qū)和Linux操作系統(tǒng)學(xué)習平臺,內(nèi)容涉及Linux內(nèi)核,Linux內(nèi)存管理,Linux進程管理,Linux文件系統(tǒng)和IO,Linux性能調(diào)優(yōu),Linux設(shè)備驅(qū)動以及Linux虛擬化和云計算等各方各面.