Linux NUMA:非統一內存訪問架構

1 關於NUMA


NUMA,即Non-Uniform Memory Access Architecture,非統一內存訪問架構。NUMA模式是一種分佈式存儲器訪問方式,處理器可以同時訪問不同的存儲器地址,大幅度提高並行性。NUMA模式下,處理器被劃分成多個"節點"(node),每個節點被分配有的本地存儲器空間。所有節點中的處理器都可以訪問全部的系統物理存儲器,但是訪問本節點內的存儲器所需要的時間,比訪問某些遠程節點內的存儲器所花的時間要少得多。

NUMA具有多個節點(Node),每個節點可以擁有多個CPU(每個CPU可以具有多個核或線程),節點內使用共有的內存控制器,因此節點的所有內存對於本節點的所有CPU都是等同的,而對於其它節點中的所有CPU都是不同的。節點可分爲本地節點(Local Node)、鄰居節點(Neighbour Node)和遠端節點(Remote Node)三種類型:

本地節點:對於某個節點中的所有CPU,此節點稱爲本地節點;

鄰居節點:與本地節點相鄰的節點稱爲鄰居節點;

遠端節點:非本地節點或鄰居節點的節點,稱爲遠端節點。

鄰居節點和遠端節點,稱作非本地節點(Off Node)。

CPU訪問不同類型節點內存的速度是不相同的:本地節點>鄰居節點>遠端節點。訪問本地節點的速度最快,訪問遠端節點的速度最慢,即訪問速度與節點的距離有關,距離越遠訪問速度越慢,此距離稱作Node Distance。常用的NUMA系統中:硬件設計已保證系統中所有的Cache是一致的(Cache Coherent,ccNUMA);不同類型節點間的Cache同步時間不一樣,會導致資源競爭不公平,對於某些特殊的應用,可以考慮使用FIFO Spinlock保證公平性。


2 NUMA對MySQL性能的影響


NUMA的內存分配策略有四種:

1.缺省(default):總是在本地節點分配(分配在當前進程運行的節點上)

2.綁定(bind):強制分配到指定節點上

3.交叉(interleave):在所有節點或者指定的節點上交織分配

4.優先(preferred):在指定節點上分配,失敗則在其他節點上分配


因爲NUMA默認的內存分配策略是優先在進程所在CPU的本地內存中分配,會導致CPU節點之間內存分配不均衡,當某個CPU節點的內存不足時,會導致swap產生,而不是從遠程節點分配內存。這就是所謂的swap insanity現象。


MySQL採用了線程模式,對於NUMA特性的支持並不好,如果單機只運行一個MySQL實例,我們可以選擇關閉NUMA,關閉的方法有三種:

1.硬件層,在BIOS中設置關閉;

2.OS內核,啓動時設置numa=off;

3.可以用numactl命令將內存分配策略修改爲interleave(交叉),有些硬件可以在BIOS中設置。


如果單機運行多個MySQL實例,我們可以將MySQL綁定在不同的CPU節點上,並且採用綁定的內存分配策略,強制在本節點內分配內存,這樣既可以充分利用硬件的NUMA特性,又避免了單實例MySQL對多核CPU利用率不高的問題。


資源隔離方案

1.CPU,Memory

numactl –-cpunodebind=0 –-localalloc,此命令將MySQL綁定在不同的CPU節點上,cpubind是指NUMA概念中的CPU節點,可以用numactl –-hardware查看,localalloc參數指定內存爲本地分配策略。


2.IO

我們在機器中內置了fusionio卡(320G),配合flashcache技術,單機的IO不再成爲瓶頸,所以IO我們採用了多實例共享的方式,並沒有對IO做資源限制。多個MySQL實例使用相同的物理設備,不同的目錄的來進行區分。


3.Network

因爲單機運行多個實例,必須對網絡進行優化,我們通過多個的IP的方式,將多個MySQL實例綁定在不同的網卡上,從而提高整體的網絡能力。還有一種更高級的做法是,將不同網卡的中斷與CPU綁定,這樣可以大幅度提升網卡的效率。


4.爲什麼不採用虛擬機

虛擬機會耗費額外的資源,而且MySQL屬於IO類型的應用,採用虛擬機會大幅度降低IO的性能,而且虛擬機的管理成本比較高。所以,我們的數據庫都不採用虛擬機的方式。

                                                                                                                               ——遊響雲停



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章