我是CPU一號車間的阿Q,前一陣子咱們廠裏發生了一件大喜事,老闆拉到了一筆投資,準備擴大生產規模。mysql
不過老闆挺摳門的,拉到了投資也不給咱們漲點工資,就知道讓咱們拼命幹活,壓榨咱們的勞動力。sql
老闆說了,投資的錢要用來添置設備,招聘新員工,我們原來就有八個車間了,這一下直接double,變成了十六個!咱們的工資要是也能double就行了···編程
如今咱們變成了一個16核的CPU啦!跨域
原覺得咱們生產效率也能double,沒想到卻遇到了新的問題。緩存
咱們CPU裏面各個車間訪問內存都要經過內存控制器和總線系統,有時候碰到幾個車間都要訪問內存,就得要競爭。架構
之前咱們八個車間的時候競爭狀況還不是很激烈,你們互相謙讓一下也就罷了。如今變成了十六個車間都要過獨木橋,這競爭一下就激烈了,尤爲是咱們這幫老員工基本不會讓着新來的,爲了此事常常發生不愉快。編程語言
內存訪問出現了瓶頸,這性能天然是折損嚴重。性能
老闆把這一切都看在眼裏,私下裏找了我、二號車間的虎子還有總線主任開了個小會。優化
「大家幾個都是廠裏的核心員工,對廠裏目前的問題大家怎麼看?」,老闆問咱們幾個。操作系統
我和虎子互相瞅了瞅,都沒說話。
這時總線主任開口了:「老闆,如今的問題是訪問內存的路只有一條,你們都要來擠,不免會發生摩擦,影響工做性能。要想從根本解決問題,最好再建一條路」
「再建一條路,什麼意思?」
「我建議把新擴建的那8個車間獨立出去,建一個分廠。而後再把內存分一下,讓兩個廠各管理一部分。一來能夠減小新老員工之間的矛盾,二來能夠減小你們訪問內存擁擠形成的資源浪費。再說了,萬一之後繼續擴大規模還能夠繼續用這個辦法」,總線主任繼續說到。
領導正低頭思索,我卻是想到了一個問題:「主任,要是咱們一號核執行的線程要訪問的內存頁面不在咱們廠管理的內存上,在他們分廠怎麼辦呢?」
「嗯,這樣的話,兩個廠之間須要通訊,若是訪問的內存不在本身管轄的範圍,就要互相幫忙傳遞一下」
老闆拍了下桌子:「好主意!就這麼辦!」
次日,老闆召集16個車間的表明,總線主任,還有操做系統那邊負責內存管理的負責人小李,一塊兒開了一個大會,會上正式經過了新的技術方案。
還給這項技術取了一個名字:NUMA(Non Uniform Memory Access),非一致性內存訪問。
現有的16個車間拆分紅兩個CPU工廠,叫作兩個NUMA節點(Node),每一個節點直接鏈接一部份內存,兩個節點之間有專門的的inter-connect
通道。各節點直接訪問本身管理的內存叫Local Access
,經過inter-connect
通道訪問其餘分廠管理的內存叫作Remote Access
。很顯然,前者的訪問速度要比後者快得多,因此這也是這項技術名字的由來:非一致性內存訪問。
新的組織架構調整事後,廠裏的工做效率提高很多,矛盾摩擦也少了不少,又能夠愉快的幹活了。
咱們的組織架構調整了,操做系統那邊可忙壞了。爲了支持咱們新的架構,操做系統不得不配合着作一些調整。
首先是緩存的問題,操做系統的進程&線程調度管理部門須要注意儘可能不要跨NUMA節點進行調度線程,不能讓一個線程一下子在隔壁分廠運行,一下子又在咱們廠運行,這樣創建的緩存就失效了。
還有就是內存親和性的問題了,爲了能獲得更快的內存訪問速度,操做系統的內存管理部門制定了一個內存分配策略,線程在哪一個NUMA節點內執行,那就把內存分配到那個節點直接鏈接的內存中,避免跨節點的內存訪問。
還別說,操做系統這麼一優化調整,工做效率真是提高了很多呢。
然而好景不長,就由於這個調整,新的問題又雙叒叕出現了~~~
最近一段時間,發生了一件怪事,不知道怎麼回事,咱們分廠管轄的內存很快耗光了,但隔壁分廠管理的內存還有不少空間。
操做系統不去分配那邊的內存頁面,卻讓咱們一個勁的把內存頁面swap到硬盤上去,騰挪空間。咱們花了大量時間在這上邊,搞得咱們業績下滑,還比不上隔壁分廠那幫新人。
終於有一天,忍不了了,我夥同廠裏幾個老傢伙,把操做系統內存管理部門的小李又叫來了。
「大家怎麼回事,就不能分配隔壁二號節點分廠管轄的內存嗎,明明還有那麼多空間,卻讓咱們忙個不停」,我有點生氣。
小李滿臉無辜的說到:「不瞞大家各位,前幾天有人來咱們Linux帝國開設了一家新公司,叫MySQL,這傢伙是個吃內存大戶啊,一上來就要吃掉幾十G,大家廠管轄的內存大半都被它給吃掉了」
虎子問到:「這跟咱們有什麼關係,你別推卸責任啊」
「上次我來開會,大家不是搞了個什麼NUMA架構嗎,訪問本地鏈接的內存要比訪問遠程內存快一些嘛,因此咱們制定了內存親和性策略嘛,線程在哪一個NUMA節點執行,就把內存分配到哪一個節點直接鏈接的內存,想着這樣能提高性能嘛」,小李繼續委屈的說到。
「那也不能死腦筋啊,訪問遠程內存雖然比不上訪問本地內存快,那也比一個勁的把頁面從內存和硬盤上換來換去的強啊,你真是好心辦壞事!」
被咱們這樣一說,小李也意識到了這樣作的問題,「我回去反饋一下你們的意見,調整一下咱們的策略」
過了幾天,操做系統那邊上了新的內存分配策略,將內存均勻的分配到各個NUMA節點,咱們不再用坑次坑次的把數據從內存和硬盤之間搬來搬去了。
NUMA雖好,可要是用得很差,只會徒增煩惱啊~
Linux帝國最近又來了一家公司,發佈了一項工程招標。
「據說了嗎,咱們廠竟然沒中標」
「怎麼可能,除了咱們還有誰幹這活」
「據說是一家叫GPU的工廠」
預知後事如何,請關注後續精彩······