經(jīng)典 | 圖解 Linux 內(nèi)存性能優(yōu)化核心思想
[導(dǎo)讀]↓推薦關(guān)注↓今天分享一篇內(nèi)存性能優(yōu)化的文章,文章用了大量精美的圖深入淺出地分析了Linux內(nèi)核slab性能優(yōu)化的核心思想,slab是Linux內(nèi)核小對(duì)象內(nèi)存分配最重要的算法,文章分析了內(nèi)存分配的各種性能問題(在不同的場(chǎng)景下面),并給出了這些問題的優(yōu)化方案,這個(gè)對(duì)我們實(shí)現(xiàn)高性能內(nèi)存...
今天分享一篇內(nèi)存性能優(yōu)化的文章,文章用了大量精美的圖深入淺出地分析了Linux內(nèi)核slab性能優(yōu)化的核心思想,slab是Linux內(nèi)核小對(duì)象內(nèi)存分配最重要的算法,文章分析了內(nèi)存分配的各種性能問題(在不同的場(chǎng)景下面),并給出了這些問題的優(yōu)化方案,這個(gè)對(duì)我們實(shí)現(xiàn)高性能內(nèi)存池算法,或以后遇到內(nèi)存性能問題的時(shí)候,有一定的啟發(fā),值得我們學(xué)習(xí)。
單CPU上單純的slab
下圖給出了單CPU上slab在分配和釋放對(duì)象時(shí)的情景序列:
擴(kuò)展到多核心CPU?????????????????????????
現(xiàn)在我們簡(jiǎn)單的將上面的模型擴(kuò)展到多核心CPU,同樣差不多的分配序列如下圖所示:
問題
首先,我們來看一個(gè)簡(jiǎn)單的問題,如果單獨(dú)的某個(gè)CPU的slab緩存沒有對(duì)象可分配了,但是其它CPU的slab緩存仍有大量空閑對(duì)象的情況,如下圖所示:
問題的解決-分層slab cache
無級(jí)變速總是讓人向往。如果一個(gè)CPU的slab緩存滿了,直接去搶同級(jí)別的別的CPU的slab緩存被認(rèn)為是一種魯莽且不道義的做法。那么為何不設(shè)置另外一個(gè)slab緩存,獲取它里面的對(duì)象不像直接獲取CPU的slab緩存那么簡(jiǎn)單且直接,但是難度卻又不大,只是稍微增加一點(diǎn)消耗,這不是很好嗎?
- Linux kernel slab cache:一個(gè)分為3層的對(duì)象cache模型。
- Level 1 slab cache:一個(gè)空閑對(duì)象鏈表,每個(gè)CPU一個(gè)的獨(dú)享cache,分配釋放對(duì)象無需加鎖。
- Level 2 slab cache:一個(gè)空閑對(duì)象鏈表,每個(gè)CPU一個(gè)的共享page(s) cache,分配釋放對(duì)象時(shí)僅需要鎖住該page(s),與Level 1 slab cache互斥,不互相包容。
- Level 3 slab cache:一個(gè)page(s)鏈表,每個(gè)NUMA NODE的所有CPU共享的cache,單位為page(s),獲取后被提升到對(duì)應(yīng)CPU的Level 1 slab cache,同時(shí)該page(s)作為L(zhǎng)evel 2的共享page(s)存在。
- 共享page(s):該page(s)被一個(gè)或者多個(gè)CPU占有,每一個(gè)CPU在該page(s)上都可以擁有互相不充圖的空閑對(duì)象鏈表,該page(s)擁有一個(gè)唯一的Level 2 slab cache空閑鏈表,該鏈表與上述一個(gè)或多個(gè)Level 1 slab cache空閑鏈表亦不沖突,多個(gè)CPU獲取該Level 2 slab cache時(shí)必須爭(zhēng)搶,獲取后可以將該鏈表提升成自己的Level 1 slab cache。
2個(gè)場(chǎng)景?????????????????????????
對(duì)于常規(guī)的對(duì)象分配過程,下圖展示了其細(xì)節(jié):事實(shí)上,對(duì)于多個(gè)CPU共享一個(gè)page(s)的情況,還可以有另一種玩法,如下圖所示:
伙伴系統(tǒng)
前面我們簡(jiǎn)短的體會(huì)了Linux內(nèi)核的slab設(shè)計(jì),不宜過長(zhǎng),太長(zhǎng)了不易理解.但是最后,如果Level 3也沒有獲取page(s),那么最終會(huì)落到終極的伙伴系統(tǒng),伙伴系統(tǒng)是為了防內(nèi)存分配碎片化的,所以它盡可能地做兩件事:
- 盡量分配盡可能大的內(nèi)存
- 盡量合并連續(xù)的小塊內(nèi)存成一塊大內(nèi)存
小結(jié)?????????????????????????????????????????????????
多CPU操作系統(tǒng)內(nèi)核中,關(guān)鍵的開銷就是鎖的開銷。我認(rèn)為這是一開始的設(shè)計(jì)導(dǎo)致的,因?yàn)橐婚_始,多核CPU并沒有出現(xiàn),單核CPU上的共享保護(hù)幾乎都是可以用“禁中斷”,“禁搶占”來簡(jiǎn)單實(shí)現(xiàn)的,到了多核時(shí)代,操作系統(tǒng)同樣簡(jiǎn)單平移到了新的平臺(tái),因此同步操作是在單核的基礎(chǔ)上后來添加的。
轉(zhuǎn)自:極客重生- EOF -