CPU独占内核运行方式实现,并指定线程到特定CPU上执行

news2024/11/18 19:50:51

  • CPU独占内核运行方式实现,并指定线程到特定CPU上执行
    • 1. 隔离指定的CPU,避免其余线程run在被隔离的CPU上
    • 2. 绑定所有的interrupts(中断)到非隔离的CPU上,避免被隔离的CPU收到interrupt.
    • 3. C++绑定线程运行在指定CPU
    • 也可以通过taskset来使线程/进程绑定到隔离的CPU上:
  • 验证:版本:CentOS Linux release 7.9.2009 (Core)
  • 验证 版本 Ubuntu 22.04.2 LTS

CPU独占内核运行方式实现,并指定线程到特定CPU上执行

1. 隔离指定的CPU,避免其余线程run在被隔离的CPU上

隔离CPU的方法:修改Linux内核的启动参数isolcpus

直接更改GRUB配置文件:

# 打开GRUB配置文件 /etc/default/grub
sudo vim /etc/default/grub

# 找到名为 GRUB_CMDLINE_LINUX 的行。该行包含了内核启动参数。
#在双引号中的参数列表中添加 isolcpus 参数,并指定要隔离的CPU核心。例如,如果要隔离核心1,可以这样设置:
GRUB_CMDLINE_LINUX="isolcpus=1"

#还可以在GRUB中设置 'nohz_full=1' 减少系统定时器中断,以提高系统的性能和能效。
#在启用 nohz_full=1 后,需要注意一些时序相关的问题,例如定时器相关的系统调用的行为可能会受到影响。此外,一些应用程序可能依赖于系统定时器的正常工作,可能需要进行适当的测试和调整。
GRUB_CMDLINE_LINUX="isolcpus=1 nohz_full=1"

# 保存文件并退出编辑器。更新GRUB配置,以使更改生效。
sudo update-grub

# 在Centos下上面的更新GRUB配置是无效的
# 需要更新 GRUB 配置,按照以下步骤操作:
# 修改 /etc/default/grub 文件,添加或修改相应的内核参数。
# 运行以下命令以重新生成 GRUB 配置文件:
grub2-mkconfig -o /boot/grub2/grub.cfg

# 重新启动系统,使得修改生效。
sudo reboot

2. 绑定所有的interrupts(中断)到非隔离的CPU上,避免被隔离的CPU收到interrupt.

因为被隔离的CPU虽然没有线程run在上面,但是仍会收到interrupt,绑定所有的interrupts(中断)到非隔离的CPU上

特定IRQ的亲和度值储存在 ‘/proc/irq/IRP_NUMBER/smp_affinity’ 文件中。此文件仅ROOT用户可见。储存的值是一个十六进制位掩码(hexadecimal bit-mask),代表着系统的所有CPU核心.

实际上,在我们将isolcpus参数写入GRUB配置文件后,用户空间完全不会占用这个被隔离的CPU,内核空间Linux会将某些中断IRQ的smp_affinity都会避开所要隔离的CPU号,但是仍有一部分中断没有被绑定,例如: Single function call interrupts, Local timer interrupts等

​ 只要有了一个线程在所隔离的CPU上run,那么timer tick就会开始跑,这个timer tick也会频繁打断这一个线程,从而造成大量的上 下文切换,所以我们可以优化一下这种情况,也就是在GRUB配置中增加:(一个线程独占CPU时优化)

GRUB_CMDLINE_LINUX="nohz_full=2"

添加与不添加区别:

在这里插入图片描述

nohz_full=1nohz_full=2 之间的区别在于如何处理中断。在 nohz_full=1 模式下,中断仍然会在每个处理器的计时器到期时被触发。而在 nohz_full=2 模式下,Linux 内核会尝试将中断委托给少数几个特定的处理器,从而减少了中断的数量,提高了系统的性能。

3. C++绑定线程运行在指定CPU

设定某个线程的CPU亲和性

//POSIX 线程库提供的函数,设置线程的 CPU 亲和性
int pthread_setaffinity_np(pthread_t thread, size_t cpusetsize, const cpu_set_t *cpuset);
//获取线程的 CPU 亲和性
int pthread_getaffinity_np(pthread_t thread, size_t cpusetsize, cpu_set_t *cpuset);
#include <pthread.h>
#include <iostream>

int main() {
    pthread_t thread;
    cpu_set_t cpuset;
    int cpu_core = 1; // 绑定隔离的1号CPU

    // 获取当前线程的标识符
    thread = pthread_self();

    // 初始化 CPU 集合
    CPU_ZERO(&cpuset);

    // 设置要绑定的 CPU 核心
    CPU_SET(cpu_core, &cpuset);

    // 设置线程的 CPU 亲和性
    int result = pthread_setaffinity_np(thread, sizeof(cpu_set_t), &cpuset);
    if (result != 0) {
        std::cerr << "Error setting thread CPU affinity" << std::endl;
        return 1;
    }

    std::cout << "Thread CPU affinity set successfully" << std::endl;

    // 这里可以放置线程的逻辑代码
	//TODO
    
    return 0;
}

也可以通过taskset来使线程/进程绑定到隔离的CPU上:

查看进程当前运行在哪个CPU上:

taskset -p [pid]

指定进程运行在第二个CPU(CPU1)上:

taskset -cp 1 进程号

测试结果:

隔离了CPU1,没有改之前,CPU0是满的

在这里插入图片描述

改了之后,CPU0与CPU1都满了

在这里插入图片描述

验证:版本:CentOS Linux release 7.9.2009 (Core)

'Test1.cc'

#include <iostream>
#include <unistd.h>

int main()
{
  fork();
  while(1);
  return 0;
}

默认状态执行Test1.cc

在这里插入图片描述

设置isolcpus=1后的cpu占用率

在这里插入图片描述

可以看出CPU1被隔离了

现在我们运行下面代码,设定创建的线程绑定所隔离的CPU1

在这里插入图片描述
可以看出来该线程在隔离的CPU1上运行

有些中断不能被更改,有些可以
在这里插入图片描述

验证 版本 Ubuntu 22.04.2 LTS

设置了isolcpus=1 nohz_full=1

在这里插入图片描述

已经将CPU1隔离,正常用户空间不会使用到CPU1

在这里插入图片描述

taskset能生效,将一个进程绑定进入CPU1

在这里插入图片描述

将两个进程都添加进入CPU1执行:

在这里插入图片描述

将线程绑定指定的CPU1执行(已经隔离了CPU1):

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

一文详解WebView,不好理解就想想iframe,类比后秒懂了。

Hi&#xff0c;我是贝格前端工场&#xff0c;又到了给大家做技术扫盲的时候&#xff0c;本文讲一讲webview&#xff0c;有些老铁觉得很难懂&#xff0c;其实借助iframe来中转一下&#xff0c;就好理解了。 WebView是一种用于在应用程序中显示Web内容的组件。它可以嵌入到应用程…

免费、好用、强大的轻量级笔记软件评测

在我们不断寻找能提高个人和团队效率的工具的过程中&#xff0c;优质的笔记软件扮演着至关重要的角色。本文将介绍几款经过精选的免费且功能强大的笔记应用&#xff0c;这些应用不仅适合个人记录和整理思维&#xff0c;也适合团队合作和信息共享。 Joplin —— 隐私保护的开源…

京东按关键字搜索商品 API 返回值说明

京东按关键字搜索商品的API返回值说明如下&#xff1a; 总记录数&#xff08;total_count&#xff09;&#xff1a;搜索结果的总数量。当前页码&#xff08;page_no&#xff09;&#xff1a;当前请求的页码。每页记录数&#xff08;page_size&#xff09;&#xff1a;每页显示…

蓝桥杯倒计时 36天-DFS练习

文章目录 飞机降落仙境诅咒小怂爱水洼串变换 飞机降落 思路&#xff1a;贪心暴搜。 #include<bits/stdc.h>using namespace std; const int N 10; int t,n; //这题 N 比较小&#xff0c;可以用暴力搜搜复杂度是 TN*N! struct plane{int t,d,l; }p[N]; bool vis[N];//用…

Elasticsearch:机器学习与人工智能 - 理解差异

作者&#xff1a;来自 Elastic Aditya Tripathi, Jessica Taylor 长期以来&#xff0c;人工智能几乎完全是科幻小说作家的玩物&#xff0c;人类将技术推得太远&#xff0c;以至于它变得活跃起来 —— 正如好莱坞让我们相信的那样 —— 开始造成严重破坏。 令人愉快的东西&#…

保护图纸不能打印,加密图纸如何加密只能看,不能打印复制

图纸是表达设计思想、传递产品信息、交流产品构思的最重要的工具&#xff0c;是企业中最重要的技术资料。 图纸作为企业重要的技术资料&#xff0c;包含了产品的核心设计、制造工艺、材料选择等关键信息。 那么&#xff0c;如何才能保护图纸呢&#xff1f; 首先&#xff0c;我…

Covalent(CQT)降低数据可用性成本,加快 Layer2 在 Web3 领域的扩张

Covalent Network&#xff08;CQT&#xff09;通过其统一 API&#xff0c;正在为 EVM Layer2 生态系统提供支持&#xff0c;减少了开发者需要导航多个数据供应商的需求&#xff0c;通过解决多链环境中的碎片化挑战&#xff0c;极大地提高了他们的效率。 通过其统一 API 支持 2…

静态源代码安全扫描工具测评结果汇总

测评背景 随着数字技术的进步&#xff0c;网络安全行业日益发展&#xff0c;企业对于DevSecOps的应用和落地的需求日益增加&#xff0c;静态源代码安全扫描工具已成为其中的关键产品或工具。同时&#xff0c;在代码安全审计或检测过程中&#xff0c;也需要选择一款合适的、好用…

动态代理详解(原理+代码+代码解析)

动态代理 1.什么是动态代理&#xff1f; 动态代理是一种在运行的时候动态的生成代理对象的技术。它在不改变原始类的情况下&#xff0c;对原始类的方法进行拦截或者增强。 2.动态代理可以实现的功能&#xff1f; 使用动态代理可以实现如下常用功能&#xff1a; 1.AOP&#x…

Python实现线性查找算法

Python实现线性查找算法 以下是使用 Python 实现线性查找算法的示例代码&#xff1a; def linear_search(arr, target):"""线性查找算法:param arr: 要搜索的数组:param target: 目标值:return: 如果找到目标值&#xff0c;返回其索引&#xff1b;否则返回 -1…

Observer 模式

文章目录 &#x1f4a1;问题引入&#x1f4a1;概念&#x1f4a1;例子&#x1f4a1;总结 &#x1f4a1;问题引入 假设有一个在线商店系统&#xff0c;用户可以订阅商品的库存通知。当某个商品的库存数量发生变化时&#xff0c;系统会自动发送通知给所有订阅了该商品的用户。设计…

Anaconda下载安装及配置pytorch环境

先解释一下Python、Anaconda、Pytorch是啥 Python是一种广泛使用的编程语言&#xff0c;在许多领域都有应用。它具有简洁的语法&#xff0c;易于学习&#xff0c;并且有大量的第三方库可以使用。 Anaconda是一个Python的包和环境管理软件&#xff0c;提供了许多用于数据科学&a…

融资利率选哪家好?

第一&#xff1a;怎么理解融资融券&#xff1f; 融资融券交易&#xff0c;又称“证券信用交易”&#xff0c;分为融资交易和融券交易。是指投资者通过向具有融资融券业务资格的证券公司提供担保物&#xff0c;借入资金买入证券&#xff08;融资交易&#xff09;或借入证券并卖…

前端基础篇-深入了解用 HTML 与 CSS 实现标题排版

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 HTML 与 CSS 概述 2.0 HTML - 标题排版 2.1 图片标签 2.2 标题标签 2.3 水平标签 2.4 实现标题排版 3.0 HTML - 标题样式(style 样式) 3.1 CSS 的引入方式 3.2…

docker学习入门篇

1、docker简介 docker官网&#xff1a; www.docker.com dockerhub官网&#xff1a; hub.docker.com docker文档官网&#xff1a;docs.docker.com Docker是基于Go语言实现的云开源项目。 Docker的主要目标是&#xff1a;Build, Ship and Run Any App, Anywhere(构建&…

ScaleKD: Distilling Scale-Aware Knowledge in Small Object Detector

ScaleKD: Distilling Scale-Aware Knowledge in Small Object Detector在小目标检测器中提取尺度感知知识 摘要 尽管通用目标检测取得了显著的成功&#xff0c;但小目标检测&#xff08;SOD&#xff09;的性能和效率仍然令人不满意。与现有的努力平衡推理速度和SOD性能之间的…

华为数通方向HCIP-DataCom H12-821题库(多选题:121-140)

第121题 以下哪些事件会导致IS-IS产生一个新的LSP? A、引入的IP路由发送变化 B、周期性更新 C、接口开销发生了变化 D、邻接Up或Down 【参考答案】ABCD 【答案解析】 第122题 以下哪些协议既支持网络配置管理又支持网络监控管理? A、Telemetry B、NETCONF C、SNMP D、LLDP …

机器视觉学习(一)—— 认识OpenCV、安装OpenCV

目录 一、认识OpenCV 二、通过pip工具安装OpenCV 三、PyCharm安装OpenCV 一、认识OpenCV OpenCV&#xff08;Open Source Computer Vision Library&#xff0c;开源计算机视觉库&#xff09;是一个跨平台的计算机视觉库&#xff0c;最初由威尔斯理工学院的Gary Bradski于199…

Node.Js编码注意事项

Node.js 中不能使用 BOM 和 DOM 的 API&#xff0c;可以使用 console 和定时器 APINode.js 中的顶级对象为 global&#xff0c;也可以用 globalThis 访问顶级对象 浏览器端js的组成 Node.js中的JavaScript组成 相比较之下发现只有console与定时器是两个API所共有的&#xff…

QQ邮箱API的安全性和隐私保护措施有哪些?

QQ邮箱API接口有哪些功能&#xff1f;如何申请电子邮箱API接口&#xff1f; QQ邮箱作为国内广受欢迎的电子邮箱服务&#xff0c;其API接口的安全性和隐私保护措施更是备受关注。那么&#xff0c;QQ邮箱API的安全性和隐私保护措施究竟有哪些呢&#xff1f;接下来&#xff0c;就…