系统性能调优之绑定cpu
支持超线程的numa架构
物理硬件视角,
- 将多个CPU封装在一起,这个封装被称为插槽Socket;
- Core是socket上独立的硬件单元;
- 通过intel的超线程HT技术进一步提升CPU的处理能力,OS看到的逻辑上的核Processor的数量。
每个硬件线程都可以按逻辑cpu寻址,因此这个处理器看上去有八块cpu。
对于操作系统的视角:
- CPU(s):8
- NUMA node0 CPU(s):0,4
- NUMA node1 CPU(s):1,5
- NUMA node2 CPU(s):2,6
- NUMA node3 CPU(s):3,7
操作系统视角.png
L1缓分成两种,一种是指令缓存,一种是数据缓存。L2缓存和L3缓存不分指令和数据。L1和L2缓存在第一个CPU核中,L3则是所有CPU核心共享的内存。L1、L2、L3的越离CPU近就越小,速度也越快,越离CPU远,速度也越慢。再往后面就是内存,内存的后面就是硬盘。我们来看一些他们的速度:
- L1 的存取速度:4 个CPU时钟周期
- L2 的存取速度:11 个CPU时钟周期
- L3 的存取速度:39 个CPU时钟周期
- RAM内存的存取速度 :107 个CPU时钟周期
如果 CPU 所要操作的数据在缓存中,则直接读取,这称为缓存命中。命中缓存会带来很大的性能提升,因此,我们的代码优化目标是提升 CPU 缓存的命中率。
在主流的服务器上,一个 CPU 处理器会有 10 到 20 多个物理核。同时,为了提升服务器的处理能力,服务器上通常还会有多个 CPU 处理器(也称为多 CPU Socket),每个处理器有自己的物理核(包括 L1、L2 缓存),L3 缓存,以及连接的内存,同时,不同处理器间通过总线连接。通过lscpu来看:
root@ubuntu:~# lscpu
Architecture: x86_64
CPU(s): 32
Thread(s) per core: 1
Core(s) per socket: 8
Socket(s): 4
L1d cache: 32K
L1i cache: 32K
L2 cache: 256K
L3 cache: 20480K
NUMA node0 CPU(s): 0-7
NUMA node1 CPU(s): 8-15
NUMA node2 CPU(s): 16-23
NUMA node3 CPU(s): 24-31