摘要:有競爭,就會有性能損失。內核之間互相競爭共享資源,比如系統請求隊列和內存管理器等。至于原因,下文將會給出。原因在于還是在相互競爭。事實上在系統中這的確是起作用了雖然對于的競爭還是存在的。而且還引來了兩個問題,這兩個問題會嚴重影響的性能。。
本文參考了以下這篇論文:
A Case for NUMA-aware Contention Management on Multicore Systems 直接點擊鏈接就可以下載
回顧一下上篇文章上一篇文章 簡單地介紹了一下多 CPU 下的 NUMA 架構。NUMA 架構中將內存劃分為多個不同的區域,將CPU 和臨近的內存組成一個 node 節點,OS 調度的時候會優先使用臨近的內存,從而解決了之前 UMA 架構下 BUS 帶來的性能問題(因為多個 CPU 會對這一條總線產生競爭)。同時也講到了在MySQL在 NUMA 架構下遇到的 “swap insanity”問題,也就是當MySQL 占用的內存超過 (100 / node 總數) % 時,由于『優先使用臨近內存』這個調度模式的存在,造成了內存分配不均,導致系統整體內存充足的情況下,依然出現大量『不正常』的的 swap 現象。如下圖所示:
本文內容概括本文將從『資源競爭管理』的角度切入,將會看到UMA 時代的競爭管理算法將不再適用于 NUMA,并給出具體的原因分析和解決方案。看完之后相信你一定會對 NUMA有更加深刻的理解,并對多CPU 時代的編程有個感性的認識。
UMA 競爭管理算法對 NUMA 不適用有共享資源的地方,就會有競爭。有競爭,就會有性能損失。
一直以來,多核系統的共享資源競爭都是一個大問題。內核之間互相競爭共享資源,比如 last-level cache(LLC)、系統請求隊列和內存管理器等。目前比較流行的解決方案叫做 contention-aware scheduler(競爭感知調度程序,下面簡稱為 CAS),也就是說它能夠區分在互相競爭共享資源的 threads,然后把他們分開到不同的 domain。有數據顯示,這種調度方法可以提高最壞情況下80%、平均10%的性能。
這種算法在 UMA 中是有效的。但是需要考慮到的是, NUMA 相比 UMA 有一點很大的不同,那就是 UMA 只有一個 memory node,配備一個 memory controller;而 NUMA中 每個 node 里面都有一個 memory node,各自配備了一個 memory controller,如下圖所示:16個核被分為了4個 node,每個 node 有一個獨立的 memory(當然每個核都可以訪問任意位置的內存)。
那么這種調度方式到底起不起作用呢?如果只是簡單的想一下的話,也許會覺得為什么不行呢?如果同一個 node 里面的 threads 競爭特別激烈,那我就把其中一個移到另一個 node 上,雖然說這會帶來一定的延遲,但是競爭就解決了啊。
然后,事情沒那么簡單,一切真理都來自于實踐,實踐發現,在 NUMA 上面實施這種調度算法的時候,非但沒能很好地解決競爭,反而性能下降了30%。至于原因,下文將會給出。
為什么不適用?在 NUMA 架構下,CAS 會感知有哪些相互競爭的 threads,然后把其中一個移到不同的 domain 中。這會導致一種情況:thread的內存沒有分配在該thread 運行的那個 node 里面,比如說上圖中,一個 thread 本來運行在 c1上,之后由于競爭被移到 c5上了,但是它的 memory 還在 M1。我們把這種由于移動 thread,導致 thread 和它的內存分家的行為稱作『NUMA-agnostic migrations』(agnostic 中文意思是不可知,自已意會一下~)。
NUMA-agnostic migrations導致了一些問題,比較明顯一點的是thread 獲取內存的延遲提高了,不過這還不是關鍵。更重要的是,NUMA-agnostic migrations無法緩解一些關鍵資源(memory controller)的競爭問題,甚至還引起對更多資源(interconnect connection)的競爭。
下面這張圖很重要,請仔細看:
解釋一下:T 和 C 分別表示兩個程序(thread)
圖0:兩個程序相安無事,沒有競爭關系。
圖1:CT 的內存在一個 node,對 memory controller(MC) 產生了競爭關系。(應該還有訪問延遲,圖中可能忘記標注了)
圖2: 兩個程序都需要試用進行CPU 之間的快速通道,產生了interconnect connection(IC)競爭。同時還有訪問遠程 memory 帶來的訪問延遲(RL)。
圖3:memory controller (MC)競爭,加上遠程訪問延時(RL)。
圖4:TC 位于一個 CPU 里面,對 last-level cache(CA) 產生競爭關系。
圖5:CA + RL
圖6:CA + MC
圖7:最壞的情況,CA + MC + IC + MC
實驗發現,圖3的性能下降了110%。原因在于 threads 還是在相互競爭 memory controller。NUMA-agnostic migrations在遷移 thread 的時候,很有可能最后會導致這種情況出現。
假如現在有兩個threads,A 和 B,A 運行在圖一中的 c1上,B 運行在 c2上,他們之間存在競爭關系(競爭last-level cache)。現在有一個 contention-aware 調度器檢測到了 A 和 B 的競爭關系,于是把 B 移動到 c5上去了,現在A 和 B 不再競爭 last-level cache 了。事實上在 UMA 系統中這的確是起作用了(雖然對于 memory controller 的競爭還是存在的)。
但是對于 NUMA,A 和 B 的 memory 還在一個地方,對于 最關鍵資源memory controller 的競爭沒有得到解決。而且還引來了兩個問題,這兩個問題會嚴重影響 B 的性能。
interconnect connection。(這點影響會很嚴重)
remote access。
總結一下NUMA-agnostic migrations無法提高 甚至還會降低NUMA競爭管理的性能,按照對性能的影響程度排序有:
沒能夠解決對 memory controller 的競爭關系(memory 還在原來那個地方)。
引起了額外的 interconnect connection。
引起了額外的 remote access。
原論文中還提到了作者自己研究出的一種解決方案,有興趣的同學可以去啃一下原文。
相信你看完了,應該對 NUAM 架構有了一個比較感性的認識了吧。覺得寫的不錯(看在gakki 的情面上)不點個贊鼓勵一下?
廣告時間,歡迎大家關注我的微信公眾號。同時本文同步于 github: https://github.com/liaochangjiang/TechDaily
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/25517.html
閱讀 1805·2023-04-26 02:14
閱讀 3727·2021-11-23 09:51
閱讀 1385·2021-10-13 09:39
閱讀 3971·2021-09-24 10:36
閱讀 3012·2021-09-22 15:55
閱讀 3518·2019-08-30 12:57
閱讀 2039·2019-08-29 15:30
閱讀 1986·2019-08-29 13:19