[原] 细说 NUMA
详说 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
以上测试只作为一个基准测试,并不代表真实的内存访问或写入速率.
结论
- NUMA 架构情况下,并不会导致到某个node内存不够的情况下,使用到交换分区而不使用其他内存的数据,可能这跟node1 上的内存比较充裕有关,但是node1上内存不够的情况下,大家都使用交换分区,并没有什么不妥。
- 大多数情况下,还是建议打开NUMA,特别是在CPU核数比较多的情况下,local memory access 还是快很多,毕竟大部分情况下不会出现remote memory access。
[1]: http://static.zybuluo.com/mr8/kuz5e78l2cc8nvw5j2rqr59s/300px-NUMA.svg.png
[原] 细说 NUMA的更多相关文章
- OpenStack 虚拟机冷/热迁移的实现原理与代码分析
目录 文章目录 目录 前文列表 冷迁移代码分析(基于 Newton) Nova 冷迁移实现原理 热迁移代码分析 Nova 热迁移实现原理 向 libvirtd 发出 Live Migration 指令 ...
- 【原】AFNetworking源码阅读(三)
[原]AFNetworking源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇的话,主要是讲了如何通过构建一个request来生成一个data tas ...
- 【原】AFNetworking源码阅读(一)
[原]AFNetworking源码阅读(一) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 AFNetworking版本:3.0.4 由于我平常并没有经常使用AFNetw ...
- [原] KVM 虚拟化原理探究(5)— 网络IO虚拟化
KVM 虚拟化原理探究(5)- 网络IO虚拟化 标签(空格分隔): KVM IO 虚拟化简介 前面的文章介绍了KVM的启动过程,CPU虚拟化,内存虚拟化原理.作为一个完整的风诺依曼计算机系统,必然有输 ...
- 【原】SDWebImage源码阅读(五)
[原]SDWebImage源码阅读(五) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 前面的代码并没有特意去讲SDWebImage的缓存机制,主要是想单独开一章节专门讲 ...
- 【原】SDWebImage源码阅读(三)
[原]SDWebImage源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1.SDWebImageDownloader中的downloadImageWithURL 我们 ...
- C#综合揭秘——细说多线程(上)
引言 本文主要从线程的基础用法,CLR线程池当中工作者线程与I/O线程的开发,并行操作PLINQ等多个方面介绍多线程的开发. 其中委托的BeginInvoke方法以及回调函数最为常用. 而 I/O线程 ...
- [转]C#综合揭秘——细说进程、应用程序域与上下文之间的关系
引言 本文主要是介绍进程(Process).应用程序域(AppDomain)..NET上下文(Context)的概念与操作.虽然在一般的开发当中这三者并不常用,但熟悉三者的关系,深入了解其作用,对提高 ...
- PHP图像处理之在原图像处理
处理原有的图像 图片处理,缩放,裁剪,翻转,旋转,透明,锐化等图片操作 一.创建图片资源 imagecreatetruecolor(width,hei ...
随机推荐
- Web在线视频方案浅谈
写在前面 最近因为项目预研,花时间和精力了解并总结了现如今web在线视频的一些解决方案,由于资历薄浅,措辞或是表述难免出现遗漏,还望各位海涵,有好的建议或方案还望赐教,定细心学习品位. 如今的web技 ...
- UIBarButtonItem 小记边
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveWFuZ3poZW4xOTkwMDcwMQ==/font/5a6L5L2T/fontsize/400/ ...
- Oracle安装及使用入门
新手Oracle安装及使用入门 一.安装Oracle Step1 下载oracle压缩包并解压到同一文件夹下面 Step2 双击setup.exe进行安装 Step3:进入如下界面配置: 邮箱可不 ...
- 经典算法题每日演练——第七题 KMP算法
原文:经典算法题每日演练--第七题 KMP算法 在大学的时候,应该在数据结构里面都看过kmp算法吧,不知道有多少老师对该算法是一笔带过的,至少我们以前是的, 确实kmp算法还是有点饶人的,如果说红黑树 ...
- 安装 CocoaPods & Alcatraz
(一)安装CocoaPods { CocoaPods :} 当你开发iOS应用时,会经常使用到很多第三方开源类库,比如JSONKit,AFNetWorking等等.可能某个类库又用到其他类库,所以要使 ...
- Opencv on Ubuntu (from Ubuntu)
OpenCV Introduction Contents Introduction Installation Step 1 Step 2 Running OpenCV Python in C I ...
- [CLR via C#]7. 常量和字段
原文:[CLR via C#]7. 常量和字段 7.1 常量 常量(constant)是一个特殊的值,它是一个从不变化的值. 在定义常量时,它的值必须在编译时确定.确定之后,编译器将常量的值保存到程序 ...
- Python学习笔记16:标准库多线程(threading包裹)
Python主要是通过标准库threading包来实现多线程. 今天,互联网时代,所有的server您将收到大量请求. server要利用多线程的方式的优势来处理这些请求,为了改善网络port读写效率 ...
- 使用Bootstrap
开始使用Bootstrap 作为一名Web开发者而言,如果不借助任何前端框架,从零开始使用HTML和CSS来构建友好的页面是非常困难的.特别是对于Windows Form的开发者而言,更是难上加难. ...
- C---通过指针访问数组
C语言规定:如果指针变量P已指向数组中的一个元素,则P+1指向同一数组中的下一个元素. 引入指针变量后,就可以用俩种方法来访问数组元素了. 如果p的初值为&a[0],则: P+i 和a+i 就 ...