linux中的numa和swap

linux中的numa和swap
一.linux的numa技术(非一致性内存访问)
1.numa的基础认知
       所有处理器都共享系统总线,因此当处理器的数目增大时,系统总线的竞争冲突加大,系统总线将成为瓶颈,所以目前SMP系统的CPU数目一般只有数十个,可扩展能力受到极大限制。NUMA技术有效结合了SMP系统易编程性和MPP(大规模并行)系统易扩展性的特点,较好解决了SMP系统的可扩展性问题,已成为当今高性能服务器的主流体系结构之一。
      现在的机器上都是有多个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内的内存块,那这样的效率就是最高的。
       针对我的以下机器:node节点的分配情况可以通过lscpu、numactl -H查看

从以上截图,可看出我的机器中节点数,节点cpu和内存的分布情况;
2.numa的控制
   1)打开或关闭
   a.Redhat或者Centos系统中可以通过命令判断bios层是否开启numa(bios会控制numa的打开和关闭)
    # grep -i numa /var/log/dmesg
          如果输出结果为: No NUMA configuration found , 说明numa为disable,如果不是上面内容说明numa为enable,会有节点信息显示;
   2) OS内核,启动时grub设置numa=off;
注意:在os层numa关闭时,打开bios层的numa会影响性能,QPS会下降15-30%;
              在bios层面numa关闭时,无论os层面的numa是否打开,都不会影响性能
3.numa的坑和使用
当你的服务器还有内存的时候,发现它已经在开始使用swap了,甚至已经导致机器出现停滞的现象,这就存在numa的具体使用问题了 ;
   1)内核参数
   a ) 内核参数overcommit_memory :
    它是 内存分配策略,可选值:0、1、2。
0:表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。
1:表示内核允许分配所有的物理内存,而不管当前的内存状态如何。
2:表示内核允许分配超过所有物理内存和交换空间总和的内存
        b)内核参数zone_reclaim_mode,可选值0、1
    a、当某个节点可用内存不足时:
        1、如果为0的话,那么系统会倾向于从其他节点分配内存
        2、如果为1的话,那么系统会倾向于从本地节点回收Cache内存
    b、Cache对性能很重要,所以0是一个更好的选择
   2)修改numa内存分配策略为 interleave=all (在所有node节点进行交织分配的策略)
针对一开始的问题,就可以通过zone_reclaim_mode=0(直到所有节点无内存可用是,才会使用swap)或者 numactl --interleave=all 取消numa node的限制
4.进程的numa策略
    1)每个进程(或线程)都会从父进程继承NUMA策略,并分配有一个优先node。如果NUMA策略允许的话,进程可以调用其他node上的资源。
    2)NUMA的CPU分配策略有cpunodebind、physcpubind。cpunodebind规定进程运行在某几个node之上,而physcpubind可以更加精细地规定运行在哪些核上。
    3)NUMA的内存分配策略有localalloc、preferred、membind、interleave。
    例如:numactl --cpubind=0 --membind=0 dd if=/dev/zero of=/dev/shm/A bs=1M count=1024 用0节点上的cpu和内存来做copy测试;
localalloc规定进程从当前node上请求分配内存;
preferred比较宽松地指定了一个推荐的node来获取内存,如果被推荐的node上没有足够内存,进程可以尝试别的node。
membind可以指定若干个node,进程只能从这些指定的node上请求分配内存。
interleave规定进程从指定的若干个node上以RR(Round Robin 轮询调度)算法交织地请求分配内存
二、linux中的swap
    1.swap的含义:
有二个意思:
     1) 动词,交换,内存和磁盘的颠簸行为。没有文件背景的页面,即匿名页(anonymous page),如堆,栈,数据段等,不是以文件形式存在,因此无法和磁盘文件交
换,但可以通过硬盘上划分额外的swap交换分区或使用交换文件进行交换。即上面swap作为名词的意思。Swap分区可以将不活跃的页交换到硬盘中,缓解内存紧张。
    2)名词,硬盘的swap分区,也可以是文件swap分区。
注意,即使没有swap分区,也会存在swap行为,因为有文件背景的页面(file-backed page)也会有swap动作,即第1点的磁盘和内存之间的交换行为。
    2.监控swap的方法
     1)vmstat ----->swapd si so
     2)top/free -h ----->Swap 
     3)   sar -W------>pswpin/s  pswpout/s
   3.何时会使用swap分区
     1)系统内存不足

        注意:换出到swap的内存即使在内存不紧张的时候也不会立刻的回到内存!为什么呢?
        参考:https://access.redhat.com/solutions/41520  
        a) 设计如此!after memory is swapped out, it will not return to the physical memory unless it is being used again
        b)如何去换回?There is no need to worry. In most cases this is actually not needed and it is recommended to just keep the data in swap. OS will automaticallyswap the needed pages back into physical memory when needed, and moreover it will also benefit the saved available memory for performance in the meantime.
     2)内存还有,但是也会使用swap,基本有二种,一种是和系统配置swappiness有关,另一种就是和numa的恩怨纠葛了,后面说;
    shell> sysctl -a | grep swappiness

    vm.swappiness = 60
  取值为0-100,简单的可以理解为内存不足时,60%的概率会发生swap交换,实际不是这么简单的算法,暂且这样理解吧;
4.内存的回收方式(page cache向磁盘或匿名页向swap分区,swappiness越大,回收匿名页多一点)
    1)和swap分区交换
    2)直接回收cache中的page来释放内存
    补充:cache回收机制 1)cache的回收内核通过kswapd内核线程慢慢回收,回收的时机由水位控制。
        low:当剩余内存慢慢减少,触到这个水位时,就会触发kswapd线程的内存回收。
        min:如果剩余内存减少到触及这个水位,可认为内存严重不足,当前进程就会被堵住,kernel会直接在这个进程的进程上下文里面做内存回收(direct reclaim)。
        high: 进行内存回收时,内存慢慢增加,触到这个水位时,就停止回收。
        大小关系:high>low>min
         由于每个ZONE是分别管理各自内存的,因此每个ZONE都有这三个水位。
                                   2)主动发起回收:主动地进行drop_cache(echo 3)。 
5.swap的打开和关闭
     1)查看swap:swapon -s 
     2)关闭swap(回收swap): swapoff /dev/dm-1,此操作需要保证内存空间够回收swap的内容
     3)打开swap:swapon /dev/dm-1
三、numa和swap
在现有的Redhat Linux中,localalloc是默认的NUMA内存分配策略,这个配置选项导致资源独占程序很容易将某个node的内存用尽,典型的如mysql。而当某个node的内存耗尽时,Linux又刚好将这个node分配给了某个需要消耗大量内存的进程(或线程),swap就妥妥地产生了。尽管此时还有很多page cache可以释放,甚至还有很多的free内存。
 

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值