CPU相关的学习
我理解的CPU
目前对cpu的了解停留在这个水平
查看CPU型号:
cat /proc/cpuinfo |grep model |tail -n 1
model name : Intel(R) Xeon(R) CPU E5-2620 v2 @ 2.10GHz
查看有多少processor:
cat /proc/cpuinfo |grep processor|tail -n 1
processor : 23
然后对性能要求就是主频越高越好,processor越多越好,其它的知道的很少,由于需要做性能相关调优,所以对CPU这一块做一个系统的学习,如果参考网上的一些CEPH性能调优的资料,很多地方都是让关闭numa,以免影响性能,这个从来都是只有人给出答案,至于为什么,对不对,适合不适合你的环境,没有人给出来,没有数据支持的调优都是耍流氓
单核和多核
在英文里面,单核(single-core)和多核(multi-core)多称作uniprocessor和multiprocessor,这里先对这些概念做一个说明:
这里所说的core(或processor),是一个泛指,是从使用者(或消费者)的角度看计算机系统。因此,core,或者processor,或者处理器(CPU),都是逻辑概念,指的是一个可以独立运算、处理的核心。
而这个核心,可以以任何形式存在,例如:单独的一个chip(如通常意义上的单核处理器);一个chip上集成多个核心(如SMP,symmetric multiprocessing);一个核心上实现多个hardware context,以支持多线程(如SMT,Simultaneous multithreading);等等。这是从硬件实现的角度看的。
最后,从操作系统进程调度的角度,又会统一看待这些不同硬件实现的核心,例如上面开始所提及的CPU(24个CPUs,从0编号开始),因为它们都有一个共同的特点:执行进程(或线程)。
NUNA与SMP的概念
NUMA(Non-Uniform Memory Access,非一致性内存访问)和SMP(Symmetric Multi-Processor,对称多处理器系统)是两种不同的CPU硬件体系架构
SMP(Symmetric Multi-Processing)的主要特征是共享,所有的CPU共享使用全部资源,例如内存、总线和I/O,多个CPU对称工作,彼此之间没有主次之分,平等地访问共享的资源,这样势必引入资源的竞争问题,从而导致它的扩展内力非常有限。特别是在现在一台机器CPU核心比较多,内存比较大的情况
NUMA技术将CPU划分成不同的组(Node),每个Node由多个CPU组成,并且有独立的本地内存、I/O等资源。Node之间通过互联模块连接和沟通,因此除了本地内存外,每个CPU仍可以访问远端Node的内存,只不过效率会比访问本地内存差一些,我们用Node之间的距离(Distance,抽象的概念)来定义各个Node之间互访资源的开销。
本章主要是去做NUMA的相关探索,下图是一个多核系统简单的topology
![coremuti.gif-23.7kB][2]
Node->Socket->Core->Processor(Threads)
如果你只知道CPU这么一个概念,那么是无法理解CPU的拓扑的。事实上,在NUMA架构下,CPU的概念从大到小依次是:Node、Socket、Core、Processor
- Sockets 可以理解成主板上cpu的插槽数,物理cpu的颗数,一般同一socket上的core共享三级缓存
- Cores 而Socket中的每个核心被称为Core,常说的核,核有独立的物理资源.比如单独的一级二级缓存什么的
- Threads 为了进一步提升CPU的处理能力,Intel又引入了HT(Hyper-Threading,超线程)的技术,一个Core打开HT之后,在OS看来就是两个核,当然这个核是逻辑上的概念,所以也被称为Logical Processor,如果不开超线程,threads应该与cores相等,如果开了超线程,threads应该是cores的倍数.相互之间共享物理资源
- Nodes 上图的多核图中没有涉及, Node是NUMA体系中的概念.由于SMP体系中各个CPU访问内存只能通过单一的通道.导致内存访问成为瓶颈,cpu再多也无用.后来引入了NUMA.通过划分node,每个node有本地RAM,这样node内访问RAM速度会非常快.但跨Node的RAM访问代价会相对高一点,下面看一下两种架构的明显区别
由此可以总结这样的逻辑关系(包含):Node > Socket > Core > Thread 区分这几个概念为了了解cache的分布,因为cpu绑定的目的就是提高cache的命中率,降低cpu颠簸.所以了解cache与cpu之间的mapping关系是非常重要的.通常来讲:
- 同Socket内的cpu共享三级级缓存
- 每个Core有自己独立的二级缓存
- 一个Core上超线程出来的Threads,避免绑定,看似可能会提高L2 cache命中率,但也可能有严重的cpu争抢,导致性能非常差.
查看CPU信息
[root@server9 ~]# lscpu
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 24
On-line CPU(s) list: 0-23
Thread(s) per core: 2
Core(s) per socket: 6
Socket(s): 2
NUMA node(s): 2
Vendor ID: GenuineIntel
CPU family: 6
Model: 62
Model name: Intel(R) Xeon(R) CPU E5-2620 v2 @ 2.10GHz
Stepping: 4
CPU MHz: 1607.894
BogoMIPS: 4205.65
Virtualization: VT-x
L1d cache: 32K
L1i cache: 32K
L2 cache: 256K
L3 cache: 15360K
NUMA node0 CPU(s): 0-5,12-17
NUMA node1 CPU(s): 6-11,18-23
2颗6核双线程,一共是24 processors,也可以看到是NUMA体系,可以使用以下命令详细查看numa信息.非NUMA体系时,所有cpu都划分为一个Node
[root@server9 ~]# numactl --hardware
available: 2 nodes (0-1)
node 0 cpus: 0 1 2 3 4 5 12 13 14 15 16 17
node 0 size: 31880 MB
node 0 free: 19634 MB
node 1 cpus: 6 7 8 9 10 11 18 19 20 21 22 23
node 1 size: 32253 MB
node 1 free: 29315 MB
node distances:
node 0 1
0: 10 21
1: 21 10
cpu的id不连续的原因是开启了超线程,超线程的cpuid是从新的ID开始计数的,也就是从12开始计数的
两个node,每个node32G内存左右,这台机器我的物理内存是64G
通过命令行查看cpu信息
# 获取cpu名称与主频
cat /proc/cpuinfo | grep 'model name' | cut -f2 -d: | head -n1 | sed 's/^ //'
# 获取逻辑核数
cat /proc/cpuinfo | grep 'model name' | wc -l
# 获取物理核数
cat /proc/cpuinfo | grep 'physical id' | sort | uniq | wc -l
# 查看cpu的flags
cat /proc/cpuinfo | grep flags | uniq | cut -f2 -d : | sed 's/^ //'
# 是否打开超线程(检查 physical id * cpu cores 与 processor的比例 1:1为未开启)
cat /proc/cpuinfo
# 查看cache大小,X自省替换
sudo cat /sys/devices/system/cpu/cpuX/cache/indexX/size
# 查看各个cpu之间与cache的mapping
cat /sys/devices/system/cpu/cpuX/cache/indexX/shared_cpu_list
# 获取CPU分布的信息(id-> core信息)(这一个可以看出来CPU0和CPU12在同一个core)
egrep 'processor|core id|physical id' /proc/cpuinfo | cut -d : -f 2 | paste - - - | awk '{print "CPU"$1"\tsocket "$2" core "$3}'
CPU0 socket 0 core 0
CPU1 socket 0 core 1
CPU2 socket 0 core 2
CPU3 socket 0 core 3
CPU4 socket 0 core 4
CPU5 socket 0 core 5
CPU6 socket 1 core 0
CPU7 socket 1 core 1
CPU8 socket 1 core 2
CPU9 socket 1 core 3
CPU10 socket 1 core 4
CPU11 socket 1 core 5
CPU12 socket 0 core 0
CPU13 socket 0 core 1
CPU14 socket 0 core 2
CPU15 socket 0 core 3
CPU16 socket 0 core 4
CPU17 socket 0 core 5
CPU18 socket 1 core 0
CPU19 socket 1 core 1
CPU20 socket 1 core 2
CPU21 socket 1 core 3
CPU22 socket 1 core 4
CPU23 socket 1 core 5
lscpu,numactl都是读取proc,sys文件系统信息并进行格式化,输出人性化的内容.当没有网络,而lscpu,numactl都没有安装时,只能使用这种命令行方式了
能用工具还是用工具,工具就是解放双手的
Cpu Topology可视化
lstopo 指令由 hwloc 数据包提供,创建了用户的系统示意图。lstopo-no-graphics 指令提供详尽的文本输出
通过lscpu与numactl获取的信息,必要的时候查询了/sys/devices/system/cpu/cpuX/*的数据将正在使用的 Intel(R) Xeon(R) CPU E5-2620 v2 @ 2.10GHz的topology进行可视化
详细的cache信息可以通过sysfs查看
ls /sys/devices/system/cpu/cpu0/cache/
index0 index1 index2 index3
包含以下4个目录:
- index0:1级数据cache
- index1:1级指令cache
- index2:2级cache
- index3:3级cache,对应cpuinfo里的cache
目录里的文件是cache信息描述,以本机的cpu0/index0为例简单解释一下:
文件 | 内容 | 说明 |
---|---|---|
type | Data | 数据cache,如果查看index1就是Instruction |
Level | 1 | L1 |
Size | 32K | 大小为32K |
coherency_line_size | 64 | 644128=32K |
physical_line_partition | 1 | |
ways_of_associativity | 4 | |
number_of_sets | 128 | |
shared_cpu_map | 00000101 | 表示这个cache被CPU0和CPU8 share |
解释一下shared_cpu_map内容的格式:
表面上看是2进制,其实是16进制表示,每个bit表示一个cpu,1个数字可以表示4个cpu 截取00000101的后4位,转换为2进制表示
|CPU id|15|14|13|12|11|10|9|8|7|6|5|4|3|2|1|0|
| :---: | :---: | :----: | :----: | :----: | :----: | :----: | :----: | :----: | :----: | :----: | :----: | :----: | :----: | :----: | :----: |
|0×0101的2进制表示|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|1|
0101表示cpu8和cpu0,即cpu0的L1 data cache是和cpu8共享的。
也可以使用上面提到的lstopo-no-graphics命令进行查询
[root@server9 ~]# lstopo-no-graphics
Machine (63GB)
NUMANode L#0 (P#0 31GB)
Socket L#0 + L3 L#0 (15MB)
L2 L#0 (256KB) + L1d L#0 (32KB) + L1i L#0 (32KB) + Core L#0
PU L#0 (P#0)
PU L#1 (P#12)
L2 L#1 (256KB) + L1d L#1 (32KB) + L1i L#1 (32KB) + Core L#1
PU L#2 (P#1)
PU L#3 (P#13)
L2 L#2 (256KB) + L1d L#2 (32KB) + L1i L#2 (32KB) + Core L#2
PU L#4 (P#2)
PU L#5 (P#14)
L2 L#3 (256KB) + L1d L#3 (32KB) + L1i L#3 (32KB) + Core L#3
PU L#6 (P#3)
PU L#7 (P#15)
L2 L#4 (256KB) + L1d L#4 (32KB) + L1i L#4 (32KB) + Core L#4
PU L#8 (P#4)
PU L#9 (P#16)
L2 L#5 (256KB) + L1d L#5 (32KB) + L1i L#5 (32KB) + Core L#5
PU L#10 (P#5)
PU L#11 (P#17)
HostBridge L#0
PCIBridge
PCI 1000:0086
PCIBridge
PCI 8086:1521
Net L#0 "enp4s0f0"
PCI 8086:1521
Net L#1 "enp4s0f1"
PCI 8086:1521
Net L#2 "enp4s0f2"
PCI 8086:1521
Net L#3 "enp4s0f3"
PCIBridge
PCI 8086:10fb
Net L#4 "enp6s0f0"
PCI 8086:10fb
Net L#5 "enp6s0f1"
PCIBridge
PCI 8086:1d6b
PCIBridge
PCI 102b:0532
GPU L#6 "card0"
GPU L#7 "controlD64"
PCI 8086:1d02
Block L#8 "sda"
NUMANode L#1 (P#1 31GB) + Socket L#1 + L3 L#1 (15MB)
L2 L#6 (256KB) + L1d L#6 (32KB) + L1i L#6 (32KB) + Core L#6
PU L#12 (P#6)
PU L#13 (P#18)
L2 L#7 (256KB) + L1d L#7 (32KB) + L1i L#7 (32KB) + Core L#7
PU L#14 (P#7)
PU L#15 (P#19)
L2 L#8 (256KB) + L1d L#8 (32KB) + L1i L#8 (32KB) + Core L#8
PU L#16 (P#8)
PU L#17 (P#20)
L2 L#9 (256KB) + L1d L#9 (32KB) + L1i L#9 (32KB) + Core L#9
PU L#18 (P#9)
PU L#19 (P#21)
L2 L#10 (256KB) + L1d L#10 (32KB) + L1i L#10 (32KB) + Core L#10
PU L#20 (P#10)
PU L#21 (P#22)
L2 L#11 (256KB) + L1d L#11 (32KB) + L1i L#11 (32KB) + Core L#11
PU L#22 (P#11)
PU L#23 (P#23)
这个得到的是文本的拓扑,这个转换成一个图看的要清楚一些
NUMA分组信息
- 通过图可以看到cpu为numa架构,且有两个node
- 将同一socket内的cpu(threads)都划分在一个node中.通过上图也解释了node中cpu序列不连续的问题.因为同一个Core上的两个Threads是超线程出来的.超线程Thread的cpu id在原有的core id基础上增长的
- 每个node中有32G左右的本地RAM可用
cache信息
- 每个core都有独立的二级缓存,而不是socket中所有的core共享二级缓存
- 同node中的cpu共享三级缓存
- 跨node的内存访问的花费要大些
cpu绑定注意的几点
- Numa体系中,如果夸node绑定,性能会下降.因为L3 cache命中率低,跨node内存访问代价高.
- 绑定同Node,同一个Core中的两个超线程出来的cpu,性能会急剧下降.cpu密集型的线程硬件争用严重.”玩转CPU Topology”中也提到了.
- Numa架构可能引起swap insanity.需要注意
测试CPU绑定性能
这个部分就不在这里赘述了,上面是把cpu比较清晰的剥离出来,至于效果,需要在实际环境当中去验证了,有可能变坏,也有可能变好
本篇参考了很多网络上的很多其他资料
CPU相关的学习的更多相关文章
- 支持向量机(SVM)相关免费学习视频集锦
http://www.matlabsky.com/thread-36823-1-1.html [其它] 支持向量机(SVM)相关免费学习视频集锦 [复制链接] faruto 签到天数: ...
- Linux系统CPU相关信息查询
Linux系统CPU相关信息查询 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.lscpu常用参数介绍 1>.查看帮助信息 [root@node105 ~]# lscpu ...
- 查看linux服务器CPU相关
查看linux服务器CPU相关: 1.查看物理CPU个数 cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l 2.查看 ...
- 统计cpu相关信息
我的cpu为i3310m 适用类型:笔记本 CPU系列:酷睿i3 3代系列 CPU主频:2.4GHz 三级缓存:3MB 插槽类型:FCBGA1023,FCPGA988 封装大小:37.5×37.5mm ...
- 监控系统cpu相关统计信息
背景:需要测试监控各个操作系统平台机器上的cpu相关的各种统计信息 为了方便测试,我写了一个比较通用的shell脚本,目前可以兼容Redhat6+,Redhat7+,其他操作系统没测,可以实时监控机器 ...
- github相关指令学习
正在廖雪峰官网学习关于git的相关知识,已经不是第一次来学习,但是忘得太快,索性这次边学边记录笔记,加深记忆,方便后期查看 1.找到一个合适的地方,鼠标右键 Git Bush Here ,新建文件夹, ...
- Python 多线程相关知识学习
多线程类似于同时执行多个不同程序,多线程运行有如下优点: 使用线程可以把占据长时间的程序中的任务放到后台去处理. 用户界面可以更加吸引人,这样比如用户点击了一个按钮去触发某些事件的处理,可以弹出一个进 ...
- cpu相关信息(进程、线程、核...)
cpu的相关信息. 1.cpu 1.1 物理cpu 实际Server中插槽上的CPU个数.物理cpu数量,可以数不重复的 physical id 有几个 1.1.1 查看物理CPU的个数 cat /p ...
- zepto源码--核心方法3(属性相关)--学习笔记
继续$.fn方法 今天主要介绍几个跟属性操作相关的方法attr, removeAttr, prop, data attr 读取或设置dom的属性.如果没有给定value参数,则读取对象集合中第一个元素 ...
随机推荐
- 【Luogu】P3005 [USACO10DEC]槽的游戏The Trough Game
一.题目 题目描述 农夫约翰和贝西又在玩游戏.这个游戏需要很多个槽. 农夫约翰在谷仓里藏起来了N(1<=N<=20)个槽,并且他已经把其中的一些装上了食物.贝西以"在这个表里(表 ...
- 第二十四章 Find命令详细介绍
一.Find 概述 可以根据文件的名称.文件大小.文件的修改时间.文件的类型.文件的权限.文件的属主属组.文件的目录层级进行查找 Find的语法: find [-H] [-L] [-P] [-Olev ...
- Martyr2项目实现——Number部分问题求解(3) Prime Factorization
Martyr2项目实现--Number部分问题求解(3) Prime Factorization 质因子分解 问题描述: Prime Factorization – Have the user ent ...
- SpringCloud Alibaba开篇:SpringCloud这么火,为何还要学习SpringCloud Alibaba?
写在前面 大家都知道,SpringCloud Alibaba是在SpringCloud基础上开发并开源的一套微服务架构体系.那么,肯定会有小伙伴要问:在微服务领域,SpringCloud已经很火了,为 ...
- SpringBoot+JPA+SpringSeurity+JWT
目的:使用这个框架主要就是为了解决高并发环境下登陆操作对数据库及服务器的压力,同时能保证安全性: 加载时,SpringSecurity定义拦截器和添加两个Fitler: 登陆时,登陆成功,通过传入的信 ...
- CF618F Double Knapsack
题意简化 给定两个大小为 n 的集合A,B,要求在每个集合中选出一个子集,使得两个选出来的子集元素和相等 元素范围在 1~n ,n<=1e5 题目连接 题解 考虑前缀和 令A集合的前缀和为SA, ...
- 浅析 JIT 即时编译技术
即时编译回顾 HotSpot 虚拟机执行 Java 程序时,先通过解释器对代码解释执行,发现某个方法或代码块执行比较频繁后,对热点代码进行编译,编译后生成与本地平台相关的机器码,再去执行机器码获得较高 ...
- Pycharm快捷键与基本使用方法
pycharm常用快捷键设置 关注公众号"轻松学编程"了解更多. 可在file->settings->keymap中查找关键字然后修改快捷键 1.多行编辑 ALT+鼠标 ...
- 适合 C++ 新手学习的开源项目——在 GitHub 学编程
作者:HelloGitHub-小鱼干 俗话说:万事开头难,学习编程也是一样.在 HelloGitHub 的群里,经常遇到有小伙伴询问编程语言如何入门方面的问题,如: 我要学习某一门编程语言,有什么开源 ...
- Python之list函数