• Linux内存-NUMA


    一、什么是numa?
    NUMA(Non-Uniform Memory Access),非一致性内存访问,是一种计算机内存的设计方式,这种设计模式将内存分为本地内存和远程内存
    由于CPU访问本地内存比访问远程内存的路径短,导致访问本地内存的延迟会小于访问远程内存

    通过numactl可以查看numa的节点信息

    # numactl -H
    available: 2 nodes (0-1)
    node 0 cpus: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
    node 0 size: 130713 MB
    node 0 free: 9043 MB
    node 1 cpus: 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
    node 1 size: 131072 MB
    node 1 free: 17986 MB
    node distances:
    node   0   1 
      0:  10  21 
      1:  21  10 
    从上述输出结果我们可以看出,该机器上包含两个 NUMA 节点,每个节点上都包含 32个 CPU 以及 128GB 的内存,最后的节点距离(node distances)告诉我们两个 NUMA 节点访问内存的开销,其中 NUMA 节点 0 和 NUMA 节点 1 互相访问对方内存的延迟是各自节点访问本地内存的 2.1 倍(21 / 10 = 2.1),所以如果 NUMA 节点 0 上的进程如果在节点 1 上分配内存,会增加进程的延迟。

    二、常用命令
    1、绑定cpu和选择内存分配策略
    我们可以通过numactl命令来指定cpu和内存的分配策略

    numactl --cpunodebind=0 --membind=0 cmd param
    
    内存分配策略
    --localalloc:总是在当前节点上分配内存;
    --preferred:倾向于在特定节点上分配内存,当指定节点的内存不足时,操作系统会在其他节点上分配;
    --membind:只能在传入的几个节点上分配内存,当指定节点的内存不足时,内存的分配就会失败;
    --interleave:内存会在传入的节点上依次分配(Round Robin),当指定节点的内存不足时,操作系统会在其他节点上分配;
    
    
    CPU分配策略
    --cpunodebind:将进程绑定到某几个 NUMA 节点上;
    --physcpubind:将进程绑定到某几个物理 CPU 上;
    2、numastat

    # numastat -c mysqld
    
    Per-node process memory usage (in MBs)
    PID              Node 0 Node 1 Total
    ---------------  ------ ------ -----
    84691 (mysqld_sa      1      1     2
    86312 (mysqld)    16504  19543 36047
    ---------------  ------ ------ -----
    Total             16505  19544 36049
    # numastat 
                               node0           node1
    numa_hit             65307931014     44941987932   # 使用本节点内存次数
    numa_miss                1129162     35124348722   # 计划使用本节点内存而被调度到其他节点次数
    numa_foreign         35124348722         1129162   # 计划使用其他节点内存而使用本地内存次数
    interleave_hit             58498           58740   # 交叉分配使用的内存中使用本节点的内存次数
    local_node           65306428842     45048694869   # 在本节点运行的程序使用本节点内存次数
    other_node               2631334     35017641785   # 在其他节点运行的程序使用本节点内存次数
    三、相关内核参数
    1、vm.zone_reclaim_mode
    调整当一个zone的内存不足时的内存回收策略,
    • 0:意味着关闭zone_reclaim模式,可以从其他zone或NUMA节点回收内存。
    • 1:表示打开zone_reclaim模式,这样内存回收只会发生在本地节点内。
    • 2:在本地回收内存时,可以将cache中的脏数据写回硬盘,以回收内存。
    • 4:可以用swap方式回收内存。
     
    2、kernel.numa_balancing
    通常,应用程式在其程序的线程访问 NUMA 节点上的内存、且此节点位置与线程排程时的位置相同的时候,性能最佳。自动化 NUMA 平衡会把任务(任务可能是线程或进程)移到与它们需要访问的内存更近的地方,同时也会移动内存应用程序数据,使其更靠近参考这一数据的任务。
    • 0:关闭
    • 1:开启

  • 相关阅读:
    MySQL select语句中where条件的提取过程
    MySQL特性:ICP,Index Condition Pushdown
    MySQL特性:BKA,Batched Key Access,批量索引访问
    MySQL特性:MRR,Multi-Range Read,多范围读
    show engine innodb status 输出结果解读
    IPv6的一点使用小计
    MySQL 通过ibd恢复数据
    explain 小结
    clickhouse的多路径存储策略
    cenos6.5升级glibc2.18
  • 原文地址:https://www.cnblogs.com/guoxianqi2020/p/13926043.html
Copyright © 2020-2023  润新知