numactl taskset

本文介绍了Linux系统下的NUMA架构和性能优化技术,包括numactl和taskset工具的使用,以及CPU缓存层次和访问延迟。通过调整进程的CPU亲和性,可以减少跨NUMA访问内存,提高性能。同时,文章提到了性能监测工具top、perf和numactl,并给出了实例和优化方法。
摘要由CSDN通过智能技术生成

简单一点来看:

一、numactl

numactl是手工调优numa的工具。NUMA(Non-Uniform Memory Access)字面直译为“非一致性内存访问”,是一种CPU的管理模式,可以通过node配置CPU的多core。

numactl --hardware # 查看CPU的node情况
numactl --cpubind=0 --membind=0 python a.py # 在cpu的第一个node上执行
numactl --cpubind=1 --membind=1 python b.py # 在cpu的第二个node上执行

这个命令可以指定不同的cpu node执行不同的任务,但根据Node->Socket->Core->Processor的顺序,我们还是不能操作同一个node下的不同core。

不相关知识:socket是物理概念,指的是主板上CPU插槽;node是逻辑概念,对应于socket。core是物理概念,一个独立的硬件执行单元,对应于物理CPU;thread = 逻辑CPU = Processor,thread是逻辑CPU,也就是Processor。
二、taskset

在Linux上,可以通过 taskset命令修改进程的“CPU亲和力”.
对运行中的进程,可以用下面的命令,把CPU core#1 #2 #3分配给PID为2345的进程:
taskset -cp 1,2,3 2345
2、指定进程在某个cpu上运行:
taskset -c 1 python c.py
总结:numactl + taskset

numactl + taskset一起用可以把程序分配到每个核,emmm,不过有可能不用numactl也可以。。。样例代码:
CUDA_VISIBLE_DEVICES=0 numactl --cpubind=0 --membind=0 taskset -c 14 python c.py
 

操作系统视角:

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来看:

你可能注意到,三级缓存要比一、二级缓存大许多倍,这是因为当下的 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线程亲和性。

2绑核注意事项

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

不同的服务器是有差异的 戴尔的15G 服务器上,是可以设置不同CPU核心的排列顺序,如0 2 4 6 8   或者可以设置成0 1 2 3 4 5 是连续在一起的CPU核心

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

 

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

frank0060071

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值