首页 > 其他分享 >cpu亲缘性

cpu亲缘性

时间:2024-04-11 23:12:37浏览次数:19  
标签:set int 亲缘 pid CPU cpu

目录

引言

关于cpu亲缘性,文末参考链接讲述的非常详细,本文只记录自己写的一个小demo来了解cpu亲缘性

何为cpu亲缘性

所谓CPU亲缘性可以分为两大类:软亲缘性和硬亲缘性。

  • Linux 内核进程调度器天生就具有被称为 CPU 软亲缘性(soft affinity) 的特性,这意味着进程通常不会在处理器之间频繁迁移。这种状态正是我们希望的,因为进程迁移的频率小就意味着产生的负载小。但不代表不会进行小范围的迁移。
  • CPU 硬亲缘性是指通过Linux提供的相关CPU亲缘性设置接口,显示的指定某个进程固定的某个处理器上运行。本文所提到的CPU亲缘性主要是指硬亲缘性

使用亲缘性的好处

目前主流的服务器配置都是SMP架构,在SMP的环境下,每个CPU本身自己会有缓存,缓存着进程使用的信息,而进程可能会被kernel调度到其他CPU上(即所谓的core migration),如此,CPU cache命中率就低了。设置CPU亲缘性,程序就会一直在指定的cpu运行,防止进程在多SMP的环境下的core migration,从而避免因切换带来的CPU的L1/L2 cache失效。从而进一步提高应用程序的性能。

Linux CPU亲缘性的使用

利用glibc库中的sched_getaffinity接口,我们获取应用程序当前的cpu亲缘性,而通过sched_setaffinity接口则可以把应用程序绑定到固定的某个或某几cpu上运行

#include <sched.h>

void CPU_ZERO(cpu_set_t *set);
void CPU_CLR(int cpu, cpu_set_t *set);
void CPU_SET(int cpu, cpu_set_t *set);
int CPU_ISSET(int cpu, cpu_set_t *set);

int sched_getaffinity(pid_t pid, unsigned int cpusetsize, cpu_set_t *mask);

int sched_setaffinity(pid_t pid, unsigned int cpusetsize, cpu_set_t *mask);

例子

  • 使用htop命令查看linux操作系统有4个cpu,每一个的负载都很低:
    image
  • 我们通过下面的代码,写一个死循环并且亲缘某个CPU来观看是否能把CPU负载利用到100%
    注意#define __USE_GNU的位置,笔者也不知道为啥放在这里可以编译过,不放这里会报undefine的错误
#include <stdio.h>
#define __USE_GNU
#include <pthread.h>
#include <unistd.h>
#include <sched.h>
#include <sys/types.h>
#include <sys/syscall.h>


void process_affinity(int num) {

	// 作用同 : gettid();
	pid_t selfpid = syscall(__NR_gettid);

	cpu_set_t mask;
    
	CPU_ZERO(&mask);

	CPU_SET(selfpid % num, &mask);

	// 设置cpu亲缘性
	sched_setaffinity(selfpid, sizeof(mask), &mask);

	while(1) ; // 死循环
}

int main()
{
    // 获取CPU数
    int num = sysconf(_SC_NPROCESSORS_CONF);
    printf("cpu num = %d\n", num);

    pid_t pid;

    pid = fork();

    if (pid < 0) {
        printf("err\n");
        return -1;
    } else if (pid == 0) {
        process_affinity(num); // 子进程,cpu亲缘性
        return 0;
    } 

    // 父进程
    printf("pid = %d\n", pid);
    while (1) sleep(1);

    return 0;
}
  • 效果
    果然,其中一个cpu被死循环的进程亲缘而导致100%了,合理利用cpu亲缘性,可以有效提高cpu负载利用率
    image

参考-强推~

https://www.cnblogs.com/lojunren/p/3865232.html

标签:set,int,亲缘,pid,CPU,cpu
From: https://www.cnblogs.com/kongweisi/p/18130184

相关文章

  • 使用 Prometheus 在 KubeSphere 上监控 KubeEdge 边缘节点(Jetson) CPU、GPU 状态
    作者:朱亚光,之江实验室工程师,云原生/开源爱好者。KubeSphere边缘节点的可观测性在边缘计算场景下,KubeSphere基于KubeEdge实现应用与工作负载在云端与边缘节点的统一分发与管理,解决在海量边、端设备上完成应用交付、运维、管控的需求。根据KubeSphere的支持矩阵,只有1.23......
  • 多线程下写全局变量时,可借助sleep(0)让出cpu
    目录一个demo(对全局变量++)-->反汇编阅读cpu指令多个线程都去对全局变量++线程不挂起sleep(0)使线程挂起,让出cpu总结一下为啥不到10W?加锁版本近期在重读APUE,对unix下多线程有了新的理解用一个小demo来说明多线程下写全局变量时,让出cpu(使线程挂起)的重要性一个demo(对全局变量++)-......
  • CPU、DSP、MPU、MCU、SOC、FPGA、ARM等概念
    CPU、DSP、MPU、MCU、SOC、FPGA、ARM等概念参考资料:百度知道“stm32和cortexm3是什么关系”:https://zhidao.baidu.com/question/178510430.html知乎“DSP与MCU与ARM与FPGA有什么区别?”:https://www.zhihu.com/question/278500219/answer/405183375CSDN“MCU和SOC的区别”:ht......
  • RISC-V CPU流水线仿真
    RISC-VCPU流水线仿真1.简介RISC-V是一个开源体系结构和指令集标准,源于伯克利。该项目要求您实现一个基于标准的五级管道。您将需要实现指令的子集来自RISC-V规范2.2中指定的RV32I指令集。实施完整的CPU模拟器可以有效地锻炼系统编程能力加深对建筑相关知识的理解。2.项目简介......
  • py脚本实现监控(内存、磁盘、CPU负载)发送邮件
    #!usr/local/python3/bin/python3importsubprocess#引用模块importyagmail#引用模块defsendmail(user,passwd,text,subject,touser):yag=yagmail.SMTP(user=user,password=passwd,host="smtp.163.com"......
  • CPU怎么实现LOCK指令
    概述在CPU实现LOCK指令时,需要考虑到多核CPU的并发访问问题。一种常用的实现方式是在CPU内部添加一个锁控制单元,该单元负责控制对共享资源的访问锁控制单元通常由几个逻辑门组成在实现基于总线的锁机制时,锁控制单元可以由一个锁定信号线和一个锁定控制器组成当一个CPU需......
  • 操作系统综合题之“采用实时调度,可调度的限制条件和可调度的最大X值是是多少ms的CPU时
    一、问题:单处理器情况下,m个周期性实时进程,若进程i处理时间为Ci,周期时间为Pi<(1≤i ≤m)1.要使系统可调度的限制条件什么?2.设置一个实时系统使用了4个周期事件,其周期分别为50ms,100ms,200ms,200ms。假设这4个周期时间分别需要25ms,20ms,10ms和xms的CPU时间。保持系统可调度的最......
  • CPU 是怎样进行任务切换的?
    通过“中断+任务门”进行任务切换好处好处抢占式任务调度,所有任务都有运行的机会例子在8258A中,把时钟的中断向量号设置为0x20,因此在中断描述符表IDT的第0x20个中断描述符中注册了时钟的中断处理程序随着时钟中断的定期发生,满足一定条件后,该中断处理程序又调用schedule......
  • 利用 Optimum Intel 和 fastRAG 在 CPU 上优化文本嵌入
    嵌入模型在很多场合都有广泛应用,如检索、重排、聚类以及分类。近年来,研究界在嵌入模型领域取得了很大的进展,这些进展大大提高了基于语义的应用的竞争力。BGE、GTE以及E5等模型在MTEB基准上长期霸榜,在某些情况下甚至优于私有的嵌入服务。HuggingFace模型hub提供了多种尺......
  • cpu如何执行指令
    重点:理解cpu执行指令的大概过程.c源代码文件->编译->.exe可执行文件(二进制)->点击运行.exe文件->操作系统把这个文件加载到内存cpu根据PC程序计数器,取指令解析执行指令  例子:......