深入淺出Linux NUMA

一、什麼是NUMA

NUMA的全稱是Non-Uniform Memory Access,中文翻譯為非一致性內存訪問,是一種在多處理器系統中使用的內存架構和訪問優化技術。

在NUMA架構下,多個處理器可以共享一部分內存,但是訪問不同的內存區域的時間不同,這就是“非一致性”的含義。為了優化訪問性能,Linux系統對NUMA架構提供了一些支持和優化手段。


/*
 * 查看當前系統是否支持NUMA
 */
# cat /proc/cpuinfo | grep -i numa

二、為什麼要使用NUMA

在單處理器系統中,所有內存都是一致的,處理器可以隨意訪問任何內存位置,不需要花費額外的時間。但是在多處理器系統中,不同處理器訪問距離較遠的內存位置的時間會變得很長,這就導致了可觀的性能下降。

NUMA架構通過將內存分成多個節點來優化內存訪問性能。每個節點擁有自己的內存,同時還能夠訪問其他節點的內存。這樣,處理器只需要訪問與自己所在節點相鄰的內存節點,可以有效減少訪問時間。

三、如何使用NUMA

1. 綁定進程

在NUMA架構下,Linux系統提供了一個針對進程的優化手段:CPU和內存綁定。通過指定進程運行的CPU和內存節點,可以提高進程的性能。


/*
 * 綁定當前進程到CPU 0 和 NUMA節點 0
 */
# numactl --cpubind=0 --membind=0 <command>

2. NUMA感知分配

NUMA感知分配是一種對內存分配進行優化的手段。在NUMA感知分配中,內存會被分配到最適合它的節點上,而不是默認的全局節點。


/*
 * 為指定進程分配一塊大小為2GB的內存,並將其分配到NUMA節點1上
 */
# numactl --membind=1 <command>
# ptr = numa_alloc_onnode(2<<30, 1);  // 用於內存分配的C函數

3. NUMA感知調度

NUMA感知調度是一種優化調度用於NUMA架構的進程的手段。在NUMA感知調度中,系統會盡量將進程調度到與它綁定的CPU和內存節點相同的CPU上。


/*
 * 設置NUMA感知調度
 */
# echo 1 > /proc/sys/kernel/numa_balancing
# echo 1 > /proc/sys/kernel/sched_numa_placement

四、NUMA帶來的性能提升舉例

下面是在NUMA架構下啟用NUMA感知分配和調度的例子。在這個例子中,通過在多個NUMA節點上啟用線程,從而使用了多個處理器和多個內存節點,大大提高了程序的性能。


#include <stdlib.h>
#include <stdio.h>
#include <pthread.h>
#include <numa.h>

#define THREAD_NUM 4
#define MEM_SIZE (1<<30)

void* thread_func(void* arg) {
    int node_id = *(int*)arg;
    char* mem;
    mem = (char*)numa_alloc_onnode(MEM_SIZE, node_id);
    for(long i = 0; i < MEM_SIZE; i++)
        mem[i] = 1;
}

int main() {
    int node_num = numa_max_node() + 1;
    pthread_t tids[THREAD_NUM];
    for(int i = 0; i < THREAD_NUM; i++) {
        pthread_create(&tids[i], NULL, thread_func, (void*)&(i % node_num));
    }
    for(int i = 0; i < THREAD_NUM; i++)
        pthread_join(tids[i], NULL);
    return 0;
}

五、總結

NUMA是一種優化多處理器系統中內存訪問性能的架構和技術。在Linux系統中,我們可以使用CPU和內存綁定、NUMA感知分配和調度等手段來進行性能優化。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/237742.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-12 12:07
下一篇 2024-12-12 12:07

相關推薦

  • 如何在Linux中添加用戶並修改配置文件

    本文將從多個方面詳細介紹在Linux系統下如何添加新用戶並修改配置文件 一、添加新用戶 在Linux系統下創建新用戶非常簡單,只需使用adduser命令即可。使用以下命令添加新用戶…

    編程 2025-04-27
  • 如何解決linux jar包 invalid or corrupt jarfile問題

    對於許多開發人員和系統管理員在Linux環境下使用Java開發過程中遇到的一個常見的問題是 invalid or corrupt jarfile(無效或損壞的jar文件)錯誤。當您…

    編程 2025-04-27
  • 在Linux上安裝JRE並配置環境變量

    本文將從以下幾個方面為您詳細闡述如何在Linux系統上,通過自己賬戶安裝JRE,並且配置環境變量。 一、安裝JRE 在進行安裝前,我們需要下載JRE的安裝包並解壓,可以從官方網站下…

    編程 2025-04-27
  • GTKAM:Linux下的照片管理器

    GTKAM是用於Linux操作系統的一款照片管理器,它支持多種相機及存儲設備,並提供了一系列強大的工具,讓用戶可以方便地瀏覽、管理、編輯和導出照片。本文將從多個方面對GTKAM進行…

    編程 2025-04-27
  • Linux sync詳解

    一、sync概述 sync是Linux中一個非常重要的命令,它可以將文件系統緩存中的內容,強制寫入磁盤中。在執行sync之前,所有的文件系統更新將不會立即寫入磁盤,而是先緩存在內存…

    編程 2025-04-25
  • Linux修改文件名命令詳解

    在Linux系統中,修改文件名是一個很常見的操作。Linux提供了多種方式來修改文件名,這篇文章將介紹Linux修改文件名的詳細操作。 一、mv命令 mv命令是Linux下的常用命…

    編程 2025-04-25
  • Linux網絡連接激活失敗原因及解決方法

    一、網卡驅動問題 1、缺少網卡驅動 若使用新的網卡,需要安裝對應網卡驅動,否則會導致網絡連接激活失敗。可通過以下命令查看當前系統中是否存在網卡驅動: lsmod | grep et…

    編程 2025-04-25
  • 如何在Windows/Linux/MacOS下安裝Python

    如果你對Python安裝一無所知,本文將從多個方面對Python在Windows/Linux/MacOS下的安裝做出詳細闡述,為初學者提供幫助。 一、Windows下Python的…

    編程 2025-04-25
  • Linux Redis 重啟

    一、概述 Redis 是一款高性能的 NoSQL 數據庫,常用於各種應用場景的數據緩存、消息隊列、實時數據分析等等。在使用 Redis 過程中,如果出現了某些問題,有時候只需要重啟…

    編程 2025-04-25
  • Linux防火牆配置詳解

    一、iptables基本介紹 iptables是一個重要的Linux內核中網絡安全系統,通過設置iptables規則,可以對進入和離開Linux服務器的數據進行過濾。 iptabl…

    編程 2025-04-25

發表回復

登錄後才能評論