oracle 老白,老白学编程 - Netdata学习 - numa
Numa 介紹
NUMA,即Non-Uniform Memory Access Architecture,非統一內存訪問架構。
背景
傳統的SMP中, 所有處理器共享系統總線,當cpu數目增大時, 系統總現競爭就相應增加,會成為系統的瓶頸,所以SMP系統的CPU數目一般只有數十個。
Numa物理內存管理
有兩種類型計算機,分別以不同方式管理內存。
UMA(一致內存訪問,unifurm memory access)將內存以連續方式組織起來(可能會有小缺口)。SMP系統中的每個cpu訪問的內存區都有一樣的。
NUMA(非一致內存訪問,non-uniform memory access)是多處理器計算機,各個cpu都有本地的內存,支持快速的訪問;各個處理器通過總線連接,用以支持其他cpu本地內存的訪問,相比本地內存訪問較慢。
節點
pg_data_t 用于表示節點的基本元素。
zone
每個節點的內存被分為多個塊,稱做zone。
ZONE_DMA, DMA內存域
ZONE_NORMAL , 可以直接映射到內核的普通內存域。
ZONE_HIGDMEM , 超出內核段的物理地址。
調度
在每個任務創建時都會賦予一個HOME結點(所謂HOME結點,就是該任務獲得最初內存分配的結點),它是當時創建該任務時全系統負載最輕的結點,由于目前Linux中不支持任務的內存從一個結點遷移到另一個結點,因此在該任務的生命期內HOME結點保持不變。
一個任務最初的負載平衡工作(也就是選該任務的HOME結點)缺省情況下是由exec()系統調用完成的,也可以由fork()系統調用完成。在任務結構中的node_policy域決定了最初的負載平衡選擇方式。
linux kernel 3.8支持page在numa node上遷移。3.8前,調度器對進程page 分配是無感知的,遷移進程是基于對進程cache hotness來預估的,因此在3.8前,若想獲得盡可能好的性能,應使用taskset, cpuset等工具將進程pin到特定的核上(c++框架seastar正是這種策略避免遷移的同時也實現了share-nothing);
policy
memory policy指的是在NUMA系統下的內存分配到哪個node上的問題。一種memory policy由一個mode, 可選的mode flags,和可選的nodes組成。分配針對的對象可以是整個系統,可以是某個進程,可以是進程的某段內存區域
系統默認級別
將使用local allocations
任務/進程級別
如果沒有被設置,回退到默認;如果被設置,可由fork, exec, clone繼承。對于進程設定memory policy之前分配的任何pages在設定之后保持原樣
VMA級別 未設定時,默認取基于進程的policy; 主要作用于annoymous mapping(stack,heap) 可在共享虛擬頁面的任務上共享,比如線程 exec調用時不繼承它,因為exec會丟棄父進程頁面,重新創建 如果任務試圖在此VMA的子塊內再次安裝VMA policy,內核會將它分裂成多個VMA 默認情況下,在安裝此policy之前的page保持原樣,除非mbind調用導致遷移
shared策略
作用于memory objects,與VMA策略類似,也有不同之處
分配模式
NODE LOCAL (系統默認)
在當前代碼執行的地方分配內存
Interleave
第一頁分配在node 0,下一頁在node 1,再下一頁node 0,如此輪換。適合被多個線程訪問的數據
進程的Numa分配可通過/proc//numa_maps查看,單個node分配查看/sys/devices/system/node/node/meminfo。
進程會從父進程那繼承分配策略,即默認的node local,且Linux 調度器會盡可能地在負載均衡的同時保持進程的cache不失效,也即盡可能讓進程在靠近分配內存的node的CPU上運行。但,萬一負載非常不均,調度器是會將進程遷移到其它numa node上的,這時的內存訪問就變成了remote acess,性能會下降。kernel 3.8+支持將數據遷移到running node上。
參考
總結
以上是生活随笔為你收集整理的oracle 老白,老白学编程 - Netdata学习 - numa的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: csgo语音按键是哪个
- 下一篇: oracle 更改启动内存,Oracle