[原] 细说 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 ...
随机推荐
- [python]自问自答:python -m参数? (转)
python -m xxx.py 作用是:把xxx.py文件当做模块启动但是我一直不明白当做模块启动到底有什么用.python xxx.py和python -m xxx.py有什么区别! 自问自答: ...
- Oracle拉进sqlserver表声明的建设
我们将Oracle数据被同步到sqlserver时间,早餐在sqlserver表中的端构造. 我们是不同步的复杂领域,只考虑以下四种数据类型. Oracle到SQLServer做的映射: int -& ...
- rm-rf 恢复过程中滥用
多DBA一定rm -rf讨厌它,也许有一天自己将数据库,以消除一个中午,然后.那么就没有一个--这种情况下,--这个不幸真的发生,你真的无药可救?不必要,有解决方法.也许你遇到不幸时,有一天.你可以用 ...
- 创建Windows类别
Windows在表单.控制.对话框基本上形成.Windows类是Windows形式的类型,可处理叙述性说明. 在Windows提前有很多定义Windows类别,但它可以很容易地创建自己的Windows ...
- JavaEE(18) - JPA原生SQL查询和存储过程
1. 使用原生SQL执行查询 2. 映射原生SQL查询的结果集 3. 使用原生SQL查询执行实体查询 4. 命名原生SQL查询 5. 在JPQL查询中调用存储过程
- CSS3添加属性选择: [attribute*=value] 、[attribute^=value] 和[attribute$=value]
在CSS3新的 [attribute*=value] .[attribute^=value] 和[attribute$=value] 三个选择.使得属性选择使用通配符概念. 下面是利用这三个属性样本代 ...
- Power Strings (poj 2406 KMP)
Language: Default Power Strings Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 33205 ...
- 一步一步的理解C++STL迭代器
一步一步的理解C++STL迭代器 "指针"对全部C/C++的程序猿来说,一点都不陌生. 在接触到C语言中的malloc函数和C++中的new函数后.我们也知道这两个函数返回的都是一 ...
- Codeforces 443 B. Kolya and Tandem Repeat
纯粹练JAVA.... B. Kolya and Tandem Repeat time limit per test 2 seconds memory limit per test 256 megab ...
- JavaScript学习之获取URL参数
最近看了几道面试题,其中有一道就是关于写一个方法来获取浏览器地址栏URL查询部分的字段内容.虽然之前看过相关的东西,但感觉有点模糊,所以就又全面的学习一遍,谨以此文记之! 准备知识 在JavaScri ...