阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

系统性能调优:提升 CPU 缓存的命中率

37次阅读
没有评论

共计 2815 个字符,预计需要花费 8 分钟才能阅读完成。

导读 如果 CPU 所要操作的数据在缓存中,则直接读取,这称为缓存命中。命中缓存会带来很大的性能提升,因此,我们的代码优化目标是提升 CPU 缓存的命中率。

系统性能调优:提升 CPU 缓存的命中率

支持超线程的 numa 架构

物理硬件视角,将多个 CPU 封装在一起,这个封装被称为插槽 Socket;Core 是 socket 上独立的硬件单元; 通过 intel 的超线程 HT 技术进一步提升 CPU 的处理能力,OS 看到的逻辑上的核 Processor 的数量。

每个硬件线程都可以按逻辑 cpu 寻址,因此这个处理器看上去有八块 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

系统性能调优:提升 CPU 缓存的命中率

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

你可能注意到,三级缓存要比一、二级缓存大许多倍,这是因为当下的 CPU 都是多核心的,每个核心都有自己的一、二级缓存,但三级缓存却是一颗 CPU 上所有核心共享的。

但是,有个地方需要你注意一下:如果应用程序先在一个 Socket 上运行,并且把数据保存到了内存,然后被调度到另一个 Socket 上运行,此时,应用程序再进行内存访问时,就需要访问之前 Socket 上连接的内存,这种访问属于远端内存访问。和访问 Socket 直接连接的内存相比,远端内存访问会增加应用程序的延迟。

常用性能监测工具

Linux 系统下,CPU 与内存子系统性能调优的常用性能监测工具有 top、perf、numactl 这 3 个工具。1) top 工具 top 工具是最常用的 Linux 性能监测工具之一。通过 top 工具可以监视进程和系统整体性能。

  • top 查看系统整体的资源使用情况
  • top 后输入 1 查看看每一个逻辑核 cpu 的资源使用情况
  • top -p $PID -H 查看某个进程内所有检查的 CPU 资源使用情况
  • top 后输入 F,并选择 P 选项 查看线程执行过程中是否调度到其他 cpu 上执行,上下文切换过多时,需要注意。

2) perf 工具 perf 工具是非常强大的 Linux 性能分析工具,可以通过该工具获得进程内的调用情况、资源消耗情况并查找分析热点函数。以 CentOS 为例,使用如下命令安装 perf 工具:

  • perf top 查看占用 CPU 时钟最多的函数或者指令,因此可以用来查找热点函数。
  • perf -g record — sleep 1 -p $PID 记录进程在 1s 内的系统调用。
  • perf -g latency –sort max 查看上一步记录的结果,以调度延迟排序。
  • perf report 查看记录

3) numactl 工具 numactl 工具可用于查看当前服务器的 NUMA 节点配置、状态,可通过该工具将进程绑定到指定 CPU 核上,由指定 CPU 核来运行对应进程。以 CentOS 为例,使用如下命令安装 numactl 工具:

  • numactl -H 查看当前服务器的 NUMA 配置。
  • numastat 查看当前的 NUMA 运行状态。
优化方法

(1) NUMA 优化,减少跨 NUMA 访问内存 不同 NUMA 内的 CPU 核访问同一个位置的内存,性能不同。内存访问延时从高到低为:跨 CPU> 跨 NUMA,不跨 CPU>NUMA 内。因此在应用程序运行时要尽可能地避免跨 NUMA 访问内存,这可以通过设置线程的 CPU 亲和性来实现。常用的修改方式有如下:(1) 将设备中断绑定到特定 CPU 核上。可以通过如下命令绑定:

echo $cpuNumber > /proc/irq/$irq/smp_affinity_list
 例子:echo 0-4 > /proc/irq/78/smp_affinity_list
      echo 3,8 > /proc/irq/78/smp_affinity_list

(2) 通过 numactl 启动程序,如下面的启动命令表示启动程序./mongod,mongo 就只能在 CPU core 0 到 core7 运行 (- C 控制)。

numactl -C 0-7 ./mongod

(3) 可以使用 taskset 命令把一个程序绑定在一个核上运行。

taskset -c 0 ./redis-server

(4) 在 C /C++ 代码中通过 sched_setaffinity 函数来设置线程亲和性。(5) 很多开源软件已经支持在自带的配置文件中修改线程的亲和性,例如 Nginx 可以修改 nginx.conf 文件中 worker_cpu_affinity 参数来设置 Nginx 线程亲和性。

绑核注意事项

在 CPU 的 NUMA 架构下,对 CPU 核的编号规则,并不是先把一个 CPU Socket 中的所有逻辑核编完,再对下一个 CPU Socket 中的逻辑核编码,而是先给每个 CPU Socket 中每个物理核的第一个逻辑核依次编号,再给每个 CPU Socket 中的物理核的第二个逻辑核依次编号。

系统性能调优:提升 CPU 缓存的命中率

注意的是在多个进程要进行亲和性绑核的,你一定要注意 NUMA 架构下 CPU 核的编号方法,这样才不会绑错核。

阿里云 2 核 2G 服务器 3M 带宽 61 元 1 年,有高配

腾讯云新客低至 82 元 / 年,老客户 99 元 / 年

代金券:在阿里云专用满减优惠券

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2024-07-25发表,共计2815字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中