系统性能调优之绑定cpu

news2024/9/21 0:48:52

支持超线程的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

你可能注意到,三级缓存要比一、二级缓存大许多倍,这是因为当下的 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 中的物理核的第二个逻辑核依次编号。

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

预告

下一节,我们将聊聊如何通过提L1与L2缓存命中率来提高应用程序性能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/888432.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Studio One6最新音乐歌曲编曲伴奏软件

Studio One也是一款受众面积十分广泛的编曲软件,它集混音、编曲、乐曲制作为一体,是一款一站式工作的音乐制作软件。它支持用户添加乐器轨道,在轨道中使用内部乐器进行编辑输入,以实现编曲操作。 和FL Studio类似,Stu…

相关搜索引擎常用搜索语法(Google hacking语法和FOFA语法)

一:Google Hack语法 Google Hacking原指利用Google搜索引擎搜索信息来进行入侵的技术和行为,现指利用各种搜索引擎并使用一些高级的搜索语法来搜索信息。既利用搜索引擎强大的搜索功能,在在浩瀚的互联网中搜索到我们需要的信息。 &#xff0…

Jetpack Compose:探索声明式UI开发的未来

Jetpack Compose:探索声明式UI开发的未来 1. 引言 在移动应用开发领域,用户界面(UI)开发一直是开发过程中的关键挑战之一。传统的UI开发方式往往涉及大量繁琐的布局代码、手动管理状态和事件处理,不仅容易引发错误&a…

微信小程序 授权登录时不得默认强制用户同意隐私政策协议

今天提交微信小程序审核时,官方提示“隐私政策不合规,默认自动同意《用户服务协议》及《隐私政策》,应当由用户自主阅读后自行选择是否同意隐私政策协议,不得默认强制用户同意。” 需要在微信授权登录时先判断用户是否勾了隐私选…

ESP8266串口WiFi模块的四大创新型应用领域分析

ESP8266串口WiFi模块顾名思义,这是一款基于ESP8266方案的串口WiFi模块,可将用户的物理设备连接到WiFi无线网络上,进行互联网或局域网通信,实现联网功能。ESP8266串口WiFi模块是一种适用性强、应用范围广泛的WiFi模块。 ESP8266串口…

tsconfig.json和jsconfig.json配置

{// 编译选项"compilerOptions": {// 生成代码的语言版本:将我们写的 TS 代码编译成哪个版本的 JS 代码// 命令行: tsc --target es5 11-测试TS配置文件.ts"target": "es5",// 指定要包含在编译中的 library"lib&quo…

掌握指针进阶:探索字符指针、数组指针和指针数组的妙用

🍁博客主页:江池俊的博客 💫收录专栏:C语言—探索高效编程的基石 💡代码仓库:江池俊的代码仓库 🎪我的社区:GeekHub 🎉欢迎大家点赞👍评论📝收藏⭐…

Springboot 整合MQ实现延时队列入门

延时队列 添加依赖配置文件队列TTL代码架构图交换机、队列、绑定配置文件代码生产者代码消费者代码延时队列优化添加普通队列配置代码生产者发送消息是进行设置消息的ttl 通过MQ 插件实现延时队列代码架构图配置交换机生产者代码消费者代码测试发送 添加依赖 <!-- rabbitMQ …

2023国赛数学建模思路 - 复盘:校园消费行为分析

文章目录 0 赛题思路1 赛题背景2 分析目标3 数据说明4 数据预处理5 数据分析5.1 食堂就餐行为分析5.2 学生消费行为分析 建模资料 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 赛题背景 校园一卡通是集…

Unity如何控制声音大小(包括静音功能)

一&#xff1a;UGUI制作 1. 首先在【层级】下面创建UI里面的Slider组件。设置好它对应的宽度和高度。 2.调整Slider滑动条的填充颜色。一般声音颜色我黄色&#xff0c;所以我们也调成黄色。 我们尝试滑动Slider里面的value。 a.滑动前。 b.滑动一半。 c.滑动完。 从以上滑动va…

Cat(2):下载与安装

1 github源码下载 要安装CAT&#xff0c;首先需要从github上下载最新版本的源码。 官方给出的建议如下&#xff1a; 注意cat的3.0代码分支更新都发布在master上&#xff0c;包括最新文档也都是这个分支注意文档请用最新master里面的代码文档作为标准&#xff0c;一些开源网站…

8月14-15日上课内容 LVS负载均衡的群集

知识点&#xff1a; 本章结构: 企业群集概述 集群的含义&#xff1a; 1、群集的含义 ①、Cluster、集群、群集 ②、由多台主机构成&#xff0c;但对外只表现为一个整体&#xff0c;只提供一个访问入口&#xff08;域名与IP地址&#xff09;&#xff0c;相当于一台大型计算机。…

TypeScript相关面试题

typeScript 1.什么是TypeScript?是什么&#xff1f;特性&#xff1f;区别&#xff1f; 2.TypeScript数据类型&#xff1f;3.说说你对 TypeScript 中枚举类型的理解&#xff1f;应用场景&#xff1f;4.说说你对 TypeScript 中接口的理解&#xff1f;应用场景&#xff1f;使用方…

面试题. 分割链表

给你一个链表的头节点 head 和一个特定值 x &#xff0c;请你对链表进行分隔&#xff0c;使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。 你不需要 保留 每个分区中各节点的初始相对位置。 示例 1&#xff1a; 输入&#xff1a;head [1,4,3,2,5,2], x 3 输出&a…

C#学习....

1.基础 //引用命名空间using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;//项目名或者命名空间 namespace _01_MY_First_Demo {//Program类class Program{//程序的主入口或者Main函数static void Main(S…

大模型是什么?大模型可以在哪些场景应用落地?

大模型是什么&#xff1f;大模型是指模型具有庞大的参数规模和复杂程度的机器学习模型。在深度学习领域&#xff0c;大模型通常是指具有数百万到数十亿参数的神经网络模型。 大模型是指模型具有庞大的参数规模和复杂程度的机器学习模型。在深度学习领域&#xff0c;大模型通常是…

实验三十、压控振荡电路的测量

一、题目 利用 Multisim 分析图1所示电路&#xff0c;测试各项指标参数。 图 1 压控振荡电路 图1\,\,压控振荡电路 图1压控振荡电路 二、仿真电路 仿真电路如图2(a)所示&#xff0c;其中 A 1 \textrm A_1 A1​ 采用通用型集成运放 LM324AJ&#xff0c; A 2 \textrm A_2 A2​…

Java进阶(2)——结合源码深入理解final关键字,修饰数据,方法,类

目录 引出深入理解final关键字final修饰数据基本数据类型对象的引用空白final final修饰方法final修饰类总结 引出 1.在java源码中较多使用final修饰数据&#xff0c;比如ArrayList的初始长度&#xff1b; 2.final关键字修饰对象的引用的特点理解&#xff1b; 3.了解一下空白fi…

地址在数据线和地址线上怎么传?

如下图所示&#xff0c;对于地址总线&#xff0c;其传输方向是单向的&#xff0c;是只能由CPU发出&#xff0c;即只能用于CPU选择主存地址或I/O端口地址&#xff0c;并不能从主存或IO端口发到CPU。 相关题目&#xff1a; 在系统总线的数据线上&#xff0c;不可能传输的是&am…

试卷去痕迹app分享,轻松擦除答案痕迹

在考试中&#xff0c;不小心写错答案是常有的事情。如果你是用铅笔写的&#xff0c;那么你可以直接用橡皮擦擦除。但如果你是用钢笔或圆珠笔写的&#xff0c;该怎么办呢&#xff1f;现在有一些APP可以帮助你擦除答案&#xff0c;以下是一些值得尝试的APP分享。 1.拍试卷 拍试卷…