內(nèi)存瘋狂換頁!CPU怒批OS
本文轉(zhuǎn)載自微信公眾號「 編程技術(shù)宇宙 」,作者軒轅之風 。轉(zhuǎn)載本文請聯(lián)系編程技術(shù)宇宙公眾號。
內(nèi)存訪問
瓶頸我是CPU一號車間的阿Q,前一陣子我們廠里發(fā)生了一件大喜事,老板拉到了一筆投資,準備擴大生產(chǎn)規(guī)模。
不過老板挺摳門的,拉到了投資也不給我們漲點工資,就知道讓我們拼命干活,壓榨我們的勞動力。
老板說了,投資的錢要用來添置設(shè)備,招聘新員工,咱們原來就有八個車間了,這一下直接double,變成了十六個!我們的工資要是也能double就好了···
現(xiàn)在我們變成了一個16核的CPU啦!
原以為我們生產(chǎn)效率也能double,沒想到卻遇到了新的問題。
我們CPU里面各個車間訪問內(nèi)存都要通過內(nèi)存控制器和總線系統(tǒng),有時候碰到幾個車間都要訪問內(nèi)存,就得要競爭。
以前我們八個車間的時候競爭情況還不是很激烈,大家互相謙讓一下也就罷了?,F(xiàn)在變成了十六個車間都要過獨木橋,這競爭一下就激烈了,尤其是我們這幫老員工基本不會讓著新來的,為了此事經(jīng)常發(fā)生不愉快。
內(nèi)存訪問出現(xiàn)了瓶頸,這性能自然是折損嚴重。
NUMA架構(gòu)
老板把這一切都看在眼里,私下里找了我、二號車間的虎子還有總線主任開了個小會。
“你們幾個都是廠里的核心員工,對廠里目前的問題你們怎么看?”,老板問我們幾個。
我和虎子互相瞅了瞅,都沒說話。
這時總線主任開口了:“老板,現(xiàn)在的問題是訪問內(nèi)存的路只有一條,大家都要來擠,難免會發(fā)生摩擦,影響工作性能。要想從根本解決問題,最好再建一條路”
“再建一條路,什么意思?”
“我建議把新擴建的那8個車間獨立出去,建一個分廠。然后再把內(nèi)存分一下,讓兩個廠各管理一部分。一來可以減少新老員工之間的矛盾,二來可以減少大家訪問內(nèi)存擁擠造成的資源浪費。再說了,萬一以后繼續(xù)擴大規(guī)模還可以繼續(xù)用這個辦法”,總線主任繼續(xù)說到。
領(lǐng)導(dǎo)正低頭思索,我倒是想到了一個問題:“主任,要是我們一號核執(zhí)行的線程要訪問的內(nèi)存頁面不在我們廠管理的內(nèi)存上,在他們分廠怎么辦呢?”
“嗯,這樣的話,兩個廠之間需要通信,如果訪問的內(nèi)存不在自己管轄的范圍,就要互相幫忙傳遞一下”
老板拍了下桌子:“好主意!就這么辦!”
第二天,老板召集16個車間的代表,總線主任,還有操作系統(tǒng)那邊負責內(nèi)存管理的代表小李,一起開了一個大會,會上正式通過了新的技術(shù)方案。
還給這項技術(shù)取了一個名字:NUMA(Non Uniform Memory Access),非一致性內(nèi)存訪問。
現(xiàn)有的16個車間拆分成兩個CPU工廠,叫做兩個NUMA節(jié)點(Node),每個節(jié)點直接連接一部分內(nèi)存,兩個節(jié)點之間有專門的的inter-connect通道。各節(jié)點直接訪問自己管理的內(nèi)存叫Local Access,通過inter-connect通道訪問其他分廠管理的內(nèi)存叫做Remote Access。很顯然,前者的訪問速度要比后者快得多,所以這也是這項技術(shù)名字的由來:非一致性內(nèi)存訪問。
新的組織架構(gòu)調(diào)整過后,廠里的工作效率提升不少,矛盾摩擦也少了很多,又可以愉快的干活了。
操作系統(tǒng)支持
我們的組織架構(gòu)調(diào)整了,操作系統(tǒng)那邊可忙壞了。為了支持我們新的架構(gòu),操作系統(tǒng)不得不配合著做一些調(diào)整。
首先是緩存的問題,操作系統(tǒng)的進程&線程調(diào)度管理部門需要注意盡量不要跨NUMA節(jié)點進行調(diào)度線程,不能讓一個線程一會兒在隔壁分廠運行,一會兒又在我們廠運行,這樣建立的緩存就失效了。
還有就是內(nèi)存親和性的問題了,為了能得到更快的內(nèi)存訪問速度,操作系統(tǒng)的內(nèi)存管理部門制定了一個內(nèi)存分配策略,線程在哪個NUMA節(jié)點內(nèi)執(zhí)行,那就把內(nèi)存分配到那個節(jié)點直接連接的內(nèi)存中,避免跨節(jié)點的內(nèi)存訪問。
還別說,操作系統(tǒng)這么一優(yōu)化調(diào)整,工作效率真是提升了不少呢。
然而好景不長,就因為這個調(diào)整,新的問題又雙叒叕出現(xiàn)了~~~
MySQL的問題
最近一段時間,發(fā)生了一件怪事,不知道怎么回事,我們分廠管轄的內(nèi)存很快耗光了,但隔壁分廠管理的內(nèi)存還有很多空間。
操作系統(tǒng)不去分配那邊的內(nèi)存頁面,卻讓我們一個勁的把內(nèi)存頁面swap到硬盤上去,騰挪空間。我們花了大量時間在這上邊,搞得我們業(yè)績下滑,還比不上隔壁分廠那幫新人。
終于有一天,忍不了了,我伙同廠里幾個老家伙,把操作系統(tǒng)內(nèi)存管理部門的小李又叫來了。
“你們怎么回事,就不能分配隔壁二號節(jié)點分廠管轄的內(nèi)存嗎,明明還有那么多空間,卻讓我們忙個不停”,我有點生氣。
小李滿臉無辜的說到:“不瞞你們各位,前幾天有人來我們Linux帝國開設(shè)了一家新公司,叫MySQL,這家伙是個吃內(nèi)存大戶啊,一上來就要吃掉幾十G,你們廠管轄的內(nèi)存大半都被它給吃掉了”
虎子問到:“這跟我們有什么關(guān)系,你別推卸責任啊”
“上次我來開會,你們不是搞了個什么NUMA架構(gòu)嗎,訪問本地連接的內(nèi)存要比訪問遠程內(nèi)存快一些嘛,所以我們制定了內(nèi)存親和性策略嘛,線程在哪個NUMA節(jié)點執(zhí)行,就把內(nèi)存分配到哪個節(jié)點直接連接的內(nèi)存,想著這樣能提升性能嘛”,小李繼續(xù)委屈的說到。
“那也不能死腦筋啊,訪問遠程內(nèi)存雖然比不上訪問本地內(nèi)存快,那也比一個勁的把頁面從內(nèi)存和硬盤上換來換去的強啊,你真是好心辦壞事!”
被我們這樣一說,小李也意識到了這樣做的問題,“我回去反饋一下大家的意見,調(diào)整一下我們的策略”
過了幾天,操作系統(tǒng)那邊上了新的內(nèi)存分配策略,將內(nèi)存均勻的分配到各個NUMA節(jié)點,我們再也不用坑次坑次的把數(shù)據(jù)從內(nèi)存和硬盤之間搬來搬去了。
NUMA雖好,可要是用得不好,只會徒增煩惱啊~