NUMA的取捨與優化設置

来源:https://www.cnblogs.com/DataArt/archive/2018/10/28/9866733.html
-Advertisement-
Play Games

在os層numa關閉時,打開bios層的numa會影響性能,QPS會下降15-30%; 在bios層面numa關閉時,無論os層面的numa是否打開,都不會影響性能。 安裝numactl: #yum install numactl -y #numastat 等同於 cat /sys/devices/ ...


 

  在os層numa關閉時,打開bios層的numa會影響性能,QPS會下降15-30%;

  在bios層面numa關閉時,無論os層面的numa是否打開,都不會影響性能。 

      安裝numactl:  
      #yum install numactl -y
      #numastat      等同於 cat /sys/devices/system/node/node0/numastat ,/sys/devices/system/node/文件夾中記錄系統中的所有記憶體節點的相關詳細信息。        #numactl --hardware  列舉系統上的NUMA節點

      #numactl  --show   查看綁定信息

 

 

 

      Redhat或者Centos系統中可以通過命令判斷bios層是否開啟numa
      # grep -i numa /var/log/dmesg
      如果輸出結果為: No NUMA configuration found 
      說明numa為disable,如果不是上面內容說明numa為enable,例如顯示:NUMA: Using 30 for the hash shift.
      可以通過lscpu命令查看機器的NUMA拓撲結構。

當發現numa_miss數值比較高時,說明需要對分配策略進行調整。例如將指定進程關聯綁定到指定的CPU上,從而提高記憶體命中率。


---------------------------------------------

     現在的機器上都是有多個CPU和多個記憶體塊的。以前我們都是將記憶體塊看成是一大塊記憶體,所有CPU到這個共用記憶體的訪問消息是一樣的。這就是之前普遍使用的SMP模型。但是隨著處理器的增加,共用記憶體可能會導致記憶體訪問衝突越來越厲害,且如果記憶體訪問達到瓶頸的時候,性能就不能隨之增加。NUMA(Non-Uniform Memory Access)就是這樣的環境下引入的一個模型。比如一臺機器是有2個處理器,有4個記憶體塊。我們將1個處理器和兩個記憶體塊合起來,稱為一個NUMA node,這樣這個機器就會有兩個NUMA node。在物理分佈上,NUMA node的處理器和記憶體塊的物理距離更小,因此訪問也更快。比如這台機器會分左右兩個處理器(cpu1, cpu2),在每個處理器兩邊放兩個記憶體塊(memory1.1, memory1.2, memory2.1,memory2.2),這樣NUMA node1的cpu1訪問memory1.1和memory1.2就比訪問memory2.1和memory2.2更快。所以使用NUMA的模式如果能儘量保證本node內的CPU只訪問本node內的記憶體塊,那這樣的效率就是最高的。

在運行程式的時候使用numactl -m和-physcpubind就能制定將這個程式運行在哪個cpu和哪個memory中。玩轉cpu-topology 給了一個表格,當程式只使用一個node資源和使用多個node資源的比較表(差不多是38s與28s的差距)。所以限定程式在numa node中運行是有實際意義的。

但是呢,話又說回來了,制定numa就一定好嗎?--numa的陷阱。SWAP的罪與罰文章就說到了一個numa的陷阱的問題。現象是當你的伺服器還有記憶體的時候,發現它已經在開始使用swap了,甚至已經導致機器出現停滯的現象。這個就有可能是由於numa的限制,如果一個進程限制它只能使用自己的numa節點的記憶體,那麼當自身numa node記憶體使用光之後,就不會去使用其他numa node的記憶體了,會開始使用swap,甚至更糟的情況,機器沒有設置swap的時候,可能會直接死機!所以你可以使用numactl --interleave=all來取消numa node的限制。

 

綜上所述得出的結論就是,根據具體業務決定NUMA的使用。

如果你的程式是會占用大規模記憶體的,你大多應該選擇關閉numa node的限制(或從硬體關閉numa)。因為這個時候你的程式很有幾率會碰到numa陷阱。

另外,如果你的程式並不占用大記憶體,而是要求更快的程式運行時間。你大多應該選擇限制只訪問本numa node的方法來進行處理。

---------------------------------------------------------------------

內核參數overcommit_memory :

它是 記憶體分配策略

可選值:0、1、2。

0:表示內核將檢查是否有足夠的可用記憶體供應用進程使用;如果有足夠的可用記憶體,記憶體申請允許;否則,記憶體申請失敗,並把錯誤返回給應用進程。

1:表示內核允許分配所有的物理記憶體,而不管當前的記憶體狀態如何。

2:表示內核允許分配超過所有物理記憶體和交換空間總和的記憶體

內核參數zone_reclaim_mode:

可選值0、1

a、當某個節點可用記憶體不足時:

1、如果為0的話,那麼系統會傾向於從其他節點分配記憶體

2、如果為1的話,那麼系統會傾向於從本地節點回收Cache記憶體多數時候

b、Cache對性能很重要,所以0是一個更好的選擇

----------------------------------------------------------------------

mongodb的NUMA問題

mongodb日誌顯示如下:

WARNING: You are running on a NUMA machine.

We suggest launching mongod like this to avoid performance problems:

numactl –interleave=all mongod [other options]

解決方案,臨時修改numa記憶體分配策略為 interleave=all (在所有node節點進行交織分配的策略):

1.在原啟動命令前面加numactl –interleave=all

如# numactl --interleave=all ${MONGODB_HOME}/bin/mongod --config conf/mongodb.conf

2.修改內核參數

echo 0 > /proc/sys/vm/zone_reclaim_mode ; echo "vm.zone_reclaim_mode = 0" >> /etc/sysctl.conf

----------------------------------------------------------------------

一、NUMA和SMP

NUMA和SMP是兩種CPU相關的硬體架構。在SMP架構裡面,所有的CPU爭用一個匯流排來訪問所有記憶體,優點是資源共用,而缺點是匯流排爭用激烈。隨著PC伺服器上的CPU數量變多(不僅僅是CPU核數),匯流排爭用的弊端慢慢越來越明顯,於是Intel在Nehalem CPU上推出了NUMA架構,而AMD也推出了基於相同架構的Opteron CPU。

NUMA最大的特點是引入了node和distance的概念。對於CPU和記憶體這兩種最寶貴的硬體資源,NUMA用近乎嚴格的方式劃分了所屬的資源組(node),而每個資源組內的CPU和記憶體是幾乎相等。資源組的數量取決於物理CPU的個數(現有的PC server大多數有兩個物理CPU,每個CPU有4個核);distance這個概念是用來定義各個node之間調用資源的開銷,為資源調度優化演算法提供數據支持。

二、NUMA相關的策略

1、每個進程(或線程)都會從父進程繼承NUMA策略,並分配有一個優先node。如果NUMA策略允許的話,進程可以調用其他node上的資源。

2、NUMA的CPU分配策略有cpunodebind、physcpubind。cpunodebind規定進程運行在某幾個node之上,而physcpubind可以更加精細地規定運行在哪些核上。

3、NUMA的記憶體分配策略有localalloc、preferred、membind、interleave。

localalloc規定進程從當前node上請求分配記憶體;

而preferred比較寬鬆地指定了一個推薦的node來獲取記憶體,如果被推薦的node上沒有足夠記憶體,進程可以嘗試別的node。

membind可以指定若幹個node,進程只能從這些指定的node上請求分配記憶體。

interleave規定進程從指定的若幹個node上以RR(Round Robin 輪詢調度)演算法交織地請求分配記憶體。

 

 

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

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

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

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

3.可以用numactl命令將記憶體分配策略修改為interleave(交叉)。

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

三、NUMA和swap的關係

可能大家已經發現了,NUMA的記憶體分配策略對於進程(或線程)之間來說,並不是公平的。在現有的Redhat Linux中,localalloc是預設的NUMA記憶體分配策略,這個配置選項導致資源獨占程式很容易將某個node的記憶體用盡。而當某個node的記憶體耗盡時,Linux又剛好將這個node分配給了某個需要消耗大量記憶體的進程(或線程),swap就妥妥地產生了。儘管此時還有很多page cache可以釋放,甚至還有很多的free記憶體。

四、解決swap問題

雖然NUMA的原理相對複雜,實際上解決swap卻很簡單:只要在啟動MySQL之前使用numactl –interleave來修改NUMA策略即可。

值得註意的是,numactl這個命令不僅僅可以調整NUMA策略,也可以用來查看當前各個node的資源使用情況,是一個很值得研究的命令。

 

 

一、CPU
  首先從CPU說起。
  你仔細檢查的話,有些伺服器上會有的一個有趣的現象:你cat /proc/cpuinfo時,會發現CPU的頻率竟然跟它標稱的頻率不一樣:
  #cat /proc/cpuinfo
  processor : 5
  model name : Intel(R) Xeon(R) CPU E5-2620 0 @2.00GHz
  cpu MHz : 1200.000
  這個是Intel E5-2620的CPU,他是2.00G * 24的CPU,但是,我們發現第5顆CPU的頻率為1.2G。
  這是什麼原因呢?
  這些其實都源於CPU最新的技術:節能模式。操作系統和CPU硬體配合,系統不繁忙的時候,為了節約電能和降低溫度,它會將CPU降頻。這對環保人士和抵制地球變暖來說是一個福音,但是對MySQL來說,可能是一個災難。
  為了保證MySQL能夠充分利用CPU的資源,建議設置CPU為最大性能模式。這個設置可以在BIOS和操作系統中設置,當然,在BIOS中設置該選項更好,更徹底。由於各種BIOS類型的區別,設置為CPU為最大性能模式千差萬別,我們這裡就不具體展示怎麼設置了。
  然後我們看看記憶體方面,我們有哪些可以優化的。
  i) 我們先看看numa
  非一致存儲訪問結構 (NUMA : Non-Uniform Memory Access) 也是最新的記憶體管理技術。它和對稱多處理器結構 (SMP : Symmetric Multi-Processor) 是對應的。簡單的隊別如下:
  如圖所示,詳細的NUMA信息我們這裡不介紹了。但是我們可以直觀的看到:SMP訪問記憶體的都是代價都是一樣的;但是在NUMA架構下,本地記憶體的訪問和非 本地記憶體的訪問代價是不一樣的。對應的根據這個特性,操作系統上,我們可以設置進程的記憶體分配方式。目前支持的方式包括:
  --interleave=nodes
  --membind=nodes
  --cpunodebind=nodes
  --physcpubind=cpus
  --localalloc
  --preferred=node
  簡而言之,就是說,你可以指定記憶體在本地分配,在某幾個CPU節點分配或者輪詢分配。除非 是設置為--interleave=nodes輪詢分配方式,即記憶體可以在任意NUMA節點上分配這種方式以外。其他的方式就算其他NUMA節點上還有內 存剩餘,Linux也不會把剩餘的記憶體分配給這個進程,而是採用SWAP的方式來獲得記憶體。有經驗的系統管理員或者DBA都知道SWAP導致的資料庫性能 下降有多麼坑爹。
  所以最簡單的方法,還是關閉掉這個特性。
  關閉特性的方法,分別有:可以從BIOS,操作系統,啟動進程時臨時關閉這個特性。
  a) 由於各種BIOS類型的區別,如何關閉NUMA千差萬別,我們這裡就不具體展示怎麼設置了。
  b) 在操作系統中關閉,可以直接在/etc/grub.conf的kernel行最後添加numa=off,如下所示:
  kernel /vmlinuz-2.6.32-220.el6.x86_64 ro root=/dev/mapper/VolGroup-root rd_NO_LUKS LANG=en_US.UTF-8 rd_LVM_LV=VolGroup/root rd_NO_MD quiet SYSFONT=latarcyrheb-sun16 rhgb crashkernel=auto rd_LVM_LV=VolGroup/swap rhgb crashkernel=auto quiet KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM  numa=off
  另外可以設置 vm.zone_reclaim_mode=0儘量回收記憶體。
  c) 啟動MySQL的時候,關閉NUMA特性:
  numactl --interleave=all mysqld
  當然,最好的方式是在BIOS中關閉。
  ii) 我們再看看vm.swappiness。
  vm.swappiness是操作系統控制物理記憶體交換出去的策略。它允許的值是一個百分比的值,最小為0,最大運行100,該值預設為60。vm.swappiness設置為0表示儘量少swap,100表示儘量將inactive的記憶體頁交換出去。
  具體的說:當記憶體基本用滿的時候,系統會根據這個參數來判斷是把記憶體中很少用到的inactive 記憶體交換出去,還是釋放數據的cache。cache中緩存著從磁碟讀出來的數據,根據程式的局部性原理,這些數據有可能在接下來又要被讀 取;inactive 記憶體顧名思義,就是那些被應用程式映射著,但是 長時間 不用的記憶體。
  我們可以利用vmstat看到inactive的記憶體的數量:
  #vmstat -an 1
  procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
  r b swpd free inact active si so bi bo in cs us sy id wa st
  1 0 0 27522384 326928 1704644 0 0 0 153 11 10 0 0 100 0 0
  0 0 0 27523300 326936 1704164 0 0 0 74 784 590 0 0 100 0 0
  0 0 0 27523656 326936 1704692 0 0 8 8 439 1686 0 0 100 0 0
  0 0 0 27524300 326916 1703412 0 0 4 52 198 262 0 0 100 0 0
  通過/proc/meminfo 你可以看到更詳細的信息:
  #cat /proc/meminfo | grep -i inact
  Inactive: 326972 kB
  Inactive(anon): 248 kB
  Inactive(file): 326724 kB
  這裡我們對不活躍inactive記憶體進一步深入討論。 Linux中,記憶體可能處於三種狀態:free,active和inactive。眾所周知,Linux Kernel在內部維護了很多LRU列表用來管理記憶體,比如LRU_INACTIVE_ANON, LRU_ACTIVE_ANON, LRU_INACTIVE_FILE , LRU_ACTIVE_FILE, LRU_UNEVICTABLE。其中LRU_INACTIVE_ANON, LRU_ACTIVE_ANON用來管理匿名頁,LRU_INACTIVE_FILE , LRU_ACTIVE_FILE用來管理page caches頁緩存。系統內核會根據記憶體頁的訪問情況,不定時的將活躍active記憶體被移到inactive列表中,這些inactive的記憶體可以被 交換到swap中去。
  一般來說,MySQL,特別是InnoDB管理記憶體緩存,它占用的記憶體比較多,不經常訪問的記憶體也會不少,這些記憶體如果被Linux錯誤的交換出去了,將浪費很多CPU和IO資源。 InnoDB自己管理緩存,cache的文件數據來說占用了記憶體,對InnoDB幾乎沒有任何好處。
  所以,我們在MySQL的伺服器上最好設置vm.swappiness=1或0

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在roadflow表單設計器不能滿足很複雜的業務需求的時候,可以採用自定義表單(即表單頁面自己做)。 自定義表單就是自己寫一個頁面,包含控制器視圖,然後將這個頁面掛到流程上進行審批。 自定義表單分為以下幾步: 1、自己寫頁面 示例: 控制器: 自定義表單的表單和數據保存代碼都是自己寫的,註意頁面一定 ...
  • ORM-SqlRepoEx 是 .Net平臺下相容.NET Standard 2.0,一個實現以Lambda表達式轉轉換標準SQL語句,使用強類型操作數據的輕量級ORM工具,在減少魔法字串同時,通過靈活的Lambda表達式組合,實現業務數據查詢的多樣性。 ...
  • 1、asp 的上傳 有兩個突出問題:1. 文件上傳框風格和整個頁面風格不搭配。 2. 上傳時是整個頁面回發,和FineUI預設的AJAX風格也不搭。 2、fineui 的上傳 下麵來看看FileUpload的屬性: 1. ButtonText:按鈕文本。 1. ButtonOnly:是否只顯示按鈕, ...
  • vs 打開項目報錯; 解決方法:刪除我的文檔下IISEXpress文件夾,然後重啟電腦。 ...
  • 按f1 搜索 Configore Display Language 設置 zh-cn 關閉軟體重啟。 如果重啟菜單等還是英文的,在商店查看已安裝的插件,把中文插件重新安裝一遍,然後重啟軟體。 ...
  • mknod 創建塊設備或者字元設備文件。此命令的適用範圍:RedHat、RHEL、Ubuntu、CentOS、SUSE、openSUSE、Fedora。 1、語法 mknod [選項] 設備名 設備類型 主設備號 次設備號 2、選項參數列表 選項 說明 --version 顯示命令版本信息 --he ...
  • 一、概述 記憶體管理涵蓋領域: 記憶體中的物理記憶體頁管理; 分配大塊記憶體的伙伴系統; 分配較小塊記憶體的slab、slub和slob分配器; 分配連續記憶體塊的vmalloc機制; 進程的地址空間。 Linux內核一般將處理器的虛擬地址分為兩個部分,以IA-32為例,地址空間在用戶進程和內核之間的劃分比例為 ...
  • 我們前面提到linux有兩種方法激活調度器:核心調度器和 周期調度器 一種是直接的, 比如進程打算睡眠或出於其他原因放棄CPU 另一種是通過周期性的機制, 以固定的頻率運行, 不時的檢測是否有必要 因而內核提供了兩個調度器 主調度器 , 周期性調度器 ,分別實現如上工作, 兩者合在一起就組成了 核心 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...