详说 NUMA

标签(空格分隔): Cloud2.0


测试条件

两台机器:

CPU:

Intel(R) Xeon(R) CPU E5-2620 v3 @ 2.40GHz X 24

Intel(R) Xeon(R) CPU E5-2680 v2 @ 2.80GHz X 40

背景知识

![300px-NUMA.svg.png-10.1kB][1]

简要的说一下NUMA架构,更多的资料请google,本文只针对NUMA做一些特定点的测试,论证网上很多关于NUMA的流言蜚语.

测试过程

  • NUMA 结构下,某个CPU SOCKET NODE 无内存的情况下,会使用交换分区还是使用其他 NODE 的内存 ?

    NUMA 信息如下, 看到 node 0 和 node 1 的内存都还剩下42G 左右,那在 cpu0 上占用64G 的内存,剩下的22G会不会使用到交换分区,还是使用 node 1 的内存呢?
root@ip-10-21-184-4:/home/zhangbo3# numactl --hardware
available: 2 nodes (0-1)
node 0 cpus: 0 1 2 3 4 5 6 7 8 9 20 21 22 23 24 25 26 27 28 29
node 0 size: 64141 MB
node 0 free: 42625 MB
node 1 cpus: 10 11 12 13 14 15 16 17 18 19 30 31 32 33 34 35 36 37 38 39
node 1 size: 64509 MB
node 1 free: 43405 MB
node distances:
node 0 1
0: 10 20
1: 20 10

使用 stress 将某个 CPU 的内存沾满,总共 64G

root@ip-10-21-184-4:/home/zhangbo3# stress -m 1 --vm-bytes 64G --vm-keep
stress: info: [23651] dispatching hogs: 0 cpu, 0 io, 1 vm, 0 hdd

查看内存使用情况

root@ip-10-21-184-4:/home/zhangbo3# numastat -p 23652

Per-node process memory usage (in MBs) for PID 23652 (stress)
Node 0 Node 1 Total
--------------- --------------- ---------------
Huge 0.00 0.00 0.00
Heap 0.00 0.00 0.00
Stack 0.00 0.01 0.01
Private 44313.61 21222.64 65536.25
---------------- --------------- --------------- ---------------
Total 44313.61 21222.66 65536.27

统计结果发现并没有使用交换分区,而是使用到了 Node1 的内存,系统并没有那么傻,有内存不用而使用交换分区.

是否是因为numa balancing参数导致?

我们关闭 numa balancing 再测试一次

echo 0 > /proc/sys/kernel/numa_balancing

root@ip-10-21-184-4:/home/zhangbo3# numastat -p 24003

Per-node process memory usage (in MBs) for PID 24003 (stress)
Node 0 Node 1 Total
--------------- --------------- ---------------
Huge 0.00 0.00 0.00
Heap 0.00 0.00 0.00
Stack 0.00 0.01 0.01
Private 44318.18 21218.07 65536.25
---------------- --------------- --------------- ---------------
Total 44318.18 21218.08 65536.26

结果仍然是一样。

  • NUMA 结构下,跨 NODE 访问和 NODE 本地访问的效率差别是多少?

打开NUMA

cpu 与 mem 不在同一个 node 情况下,写内存速度

root@ip-10-21-184-4:/home/zhangbo3# numactl --cpubind=0 --membind=0 dd if=/dev/zero of=/dev/shm/local bs=20M count=1024
1024+0 records in
1024+0 records out
21474836480 bytes (21 GB) copied, 9.14673 s, 2.3 GB/s

cpu 与 mem 在同一个 node 情况下,读内存速度

root@ip-10-21-184-4:/home/zhangbo3# numactl --cpubind=0 --membind=0 dd of=/dev/null if=/dev/shm/local bs=20M count=1024
1024+0 records in
1024+0 records out
21474836480 bytes (21 GB) copied, 5.22966 s, 4.1 GB/s

cpu 与 mem 不在同一个 node 情况下,写内存速度

numactl --cpubind=0 --membind=1 dd if=/dev/zero of=/dev/shm/remote bs=20M count=1024
1024+0 records in
1024+0 records out
21474836480 bytes (21 GB) copied, 12.2229 s, 1.8 GB/s

cpu 与 mem 不在同一个 socket 情况下,读内存速度

root@ip-10-21-184-4:/home/zhangbo3# numactl --cpubind=0 --membind=1 dd of=/dev/null if=/dev/shm/B bs=20M count=1024
1024+0 records in
1024+0 records out
21474836480 bytes (21 GB) copied, 7.31183 s, 2.9 GB/s

关闭NUMA

写效率

numactl --cpubind=0 --membind=0 dd if=/dev/zero of=/dev/shm/1 bs=20MB count=1024
1024+0 records in
1024+0 records out
20480000000 bytes (20 GB) copied, 10.8606 s, 1.9 GB/s

读效率

root@ip-10-21-184-243:/home/zhangbo3# numactl --cpubind=0 --membind=0 dd of=/dev/null if=/dev/shm/A bs=20MB count=1024
1024+0 records in
1024+0 records out
20480000000 bytes (20 GB) copied, 5.41376 s, 3.8 GB/s

以上测试只作为一个基准测试,并不代表真实的内存访问或写入速率.

结论

  1. NUMA 架构情况下,并不会导致到某个node内存不够的情况下,使用到交换分区而不使用其他内存的数据,可能这跟node1 上的内存比较充裕有关,但是node1上内存不够的情况下,大家都使用交换分区,并没有什么不妥。
  2. 大多数情况下,还是建议打开NUMA,特别是在CPU核数比较多的情况下,local memory access 还是快很多,毕竟大部分情况下不会出现remote memory access。

    [1]: http://static.zybuluo.com/mr8/kuz5e78l2cc8nvw5j2rqr59s/300px-NUMA.svg.png

[原] 细说 NUMA的更多相关文章

  1. OpenStack 虚拟机冷/热迁移的实现原理与代码分析

    目录 文章目录 目录 前文列表 冷迁移代码分析(基于 Newton) Nova 冷迁移实现原理 热迁移代码分析 Nova 热迁移实现原理 向 libvirtd 发出 Live Migration 指令 ...

  2. 【原】AFNetworking源码阅读(三)

    [原]AFNetworking源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇的话,主要是讲了如何通过构建一个request来生成一个data tas ...

  3. 【原】AFNetworking源码阅读(一)

    [原]AFNetworking源码阅读(一) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 AFNetworking版本:3.0.4 由于我平常并没有经常使用AFNetw ...

  4. [原] KVM 虚拟化原理探究(5)— 网络IO虚拟化

    KVM 虚拟化原理探究(5)- 网络IO虚拟化 标签(空格分隔): KVM IO 虚拟化简介 前面的文章介绍了KVM的启动过程,CPU虚拟化,内存虚拟化原理.作为一个完整的风诺依曼计算机系统,必然有输 ...

  5. 【原】SDWebImage源码阅读(五)

    [原]SDWebImage源码阅读(五) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 前面的代码并没有特意去讲SDWebImage的缓存机制,主要是想单独开一章节专门讲 ...

  6. 【原】SDWebImage源码阅读(三)

    [原]SDWebImage源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1.SDWebImageDownloader中的downloadImageWithURL 我们 ...

  7. C#综合揭秘——细说多线程(上)

    引言 本文主要从线程的基础用法,CLR线程池当中工作者线程与I/O线程的开发,并行操作PLINQ等多个方面介绍多线程的开发. 其中委托的BeginInvoke方法以及回调函数最为常用. 而 I/O线程 ...

  8. [转]C#综合揭秘——细说进程、应用程序域与上下文之间的关系

    引言 本文主要是介绍进程(Process).应用程序域(AppDomain)..NET上下文(Context)的概念与操作.虽然在一般的开发当中这三者并不常用,但熟悉三者的关系,深入了解其作用,对提高 ...

  9. PHP图像处理之在原图像处理

    处理原有的图像        图片处理,缩放,裁剪,翻转,旋转,透明,锐化等图片操作        一.创建图片资源            imagecreatetruecolor(width,hei ...

随机推荐

  1. Web在线视频方案浅谈

    写在前面 最近因为项目预研,花时间和精力了解并总结了现如今web在线视频的一些解决方案,由于资历薄浅,措辞或是表述难免出现遗漏,还望各位海涵,有好的建议或方案还望赐教,定细心学习品位. 如今的web技 ...

  2. UIBarButtonItem 小记边

     watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveWFuZ3poZW4xOTkwMDcwMQ==/font/5a6L5L2T/fontsize/400/ ...

  3. Oracle安装及使用入门

    新手Oracle安装及使用入门   一.安装Oracle Step1 下载oracle压缩包并解压到同一文件夹下面 Step2 双击setup.exe进行安装 Step3:进入如下界面配置: 邮箱可不 ...

  4. 经典算法题每日演练——第七题 KMP算法

    原文:经典算法题每日演练--第七题 KMP算法 在大学的时候,应该在数据结构里面都看过kmp算法吧,不知道有多少老师对该算法是一笔带过的,至少我们以前是的, 确实kmp算法还是有点饶人的,如果说红黑树 ...

  5. 安装 CocoaPods & Alcatraz

    (一)安装CocoaPods { CocoaPods :} 当你开发iOS应用时,会经常使用到很多第三方开源类库,比如JSONKit,AFNetWorking等等.可能某个类库又用到其他类库,所以要使 ...

  6. Opencv on Ubuntu (from Ubuntu)

     OpenCV Introduction Contents Introduction Installation Step 1 Step 2 Running OpenCV Python in C I ...

  7. [CLR via C#]7. 常量和字段

    原文:[CLR via C#]7. 常量和字段 7.1 常量 常量(constant)是一个特殊的值,它是一个从不变化的值. 在定义常量时,它的值必须在编译时确定.确定之后,编译器将常量的值保存到程序 ...

  8. Python学习笔记16:标准库多线程(threading包裹)

    Python主要是通过标准库threading包来实现多线程. 今天,互联网时代,所有的server您将收到大量请求. server要利用多线程的方式的优势来处理这些请求,为了改善网络port读写效率 ...

  9. 使用Bootstrap

    开始使用Bootstrap 作为一名Web开发者而言,如果不借助任何前端框架,从零开始使用HTML和CSS来构建友好的页面是非常困难的.特别是对于Windows Form的开发者而言,更是难上加难. ...

  10. C---通过指针访问数组

    C语言规定:如果指针变量P已指向数组中的一个元素,则P+1指向同一数组中的下一个元素. 引入指针变量后,就可以用俩种方法来访问数组元素了. 如果p的初值为&a[0],则: P+i 和a+i 就 ...