首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

linux c设置cpu亲缘性

Linux C 设置 CPU 亲缘性基础概念

CPU 亲缘性(CPU Affinity)是指将进程或线程绑定到特定的 CPU 核心上运行,以优化性能和减少上下文切换。通过设置 CPU 亲缘性,可以确保进程或线程在指定的 CPU 核心上执行,从而减少缓存失效和提高执行效率。

相关优势

  1. 性能优化:减少上下文切换,提高缓存命中率。
  2. 负载均衡:合理分配任务,避免某些核心过载。
  3. 实时应用:确保关键任务在特定核心上稳定运行。

类型

  1. 软亲和性:操作系统尽量将进程绑定到指定核心,但不强制。
  2. 硬亲和性:操作系统强制将进程绑定到指定核心。

应用场景

  • 高性能计算:确保计算密集型任务在特定核心上运行。
  • 实时系统:保证关键任务的及时响应。
  • 多核优化:充分利用多核处理器的性能。

示例代码

以下是一个使用 sched_setaffinity 函数设置 CPU 亲缘性的 C 语言示例:

代码语言:txt
复制
#include <stdio.h>
#include <stdlib.h>
#include <sched.h>
#include <unistd.h>

void set_cpu_affinity(int cpu_id) {
    cpu_set_t mask;
    CPU_ZERO(&mask);
    CPU_SET(cpu_id, &mask);

    if (sched_setaffinity(0, sizeof(mask), &mask) == -1) {
        perror("sched_setaffinity");
        exit(EXIT_FAILURE);
    }
}

int main() {
    int cpu_id = 1; // 绑定到第二个 CPU 核心(从 0 开始计数)
    set_cpu_affinity(cpu_id);

    printf("进程已绑定到 CPU 核心 %d\n", cpu_id);
    while (1) {
        // 模拟长时间运行的任务
        sleep(1);
    }

    return 0;
}

可能遇到的问题及解决方法

问题1:设置 CPU 亲缘性失败

原因

  • 权限不足:普通用户可能无法设置 CPU 亲缘性。
  • 系统限制:某些系统可能禁用了 CPU 亲缘性设置。

解决方法

  • 使用 sudo 提升权限运行程序。
  • 检查系统配置,确保 CPU 亲缘性功能未被禁用。

问题2:进程频繁切换核心

原因

  • 系统负载过高,操作系统自动调整进程分配。
  • 程序内部逻辑导致频繁的上下文切换。

解决方法

  • 优化程序逻辑,减少不必要的计算和 I/O 操作。
  • 调整系统负载,确保核心资源充足。

总结

通过设置 CPU 亲缘性,可以有效提升多核处理器的利用率和程序性能。在实际应用中,应根据具体需求和系统环境合理配置 CPU 亲缘性,以达到最佳效果。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

CPU亲和性设置视频解析,代码示例 sched_setaffinity sched_getaffinity, CPU_ZERO、CPU_SET、CPU_IS

视频教程在这:cpu亲和性设置,NCCL,sched_setaffinity sched_getaffinity,CPU_ZERO、SET、ISSET、linux_哔哩哔哩_bilibili一、CPU亲和性简介...对于我们NCCL集合通信,也用到亲和性设置,通过将需要与GPU交互的CPU设置为距离近的CPU核心,来优化GPU和CPU间的通信路径。NCCL通信时也用到亲和性设置,来优化GPU和CPU间的通信路径。...二、Linux系统中CPU亲和性的设置方法在Linux系统中,CPU亲和性可通过sched_setaffinity系统调用进行设置,可以将当前进程或线程绑定到一组特定的CPU上。...():设置进程或线程的CPU亲和性 sched_ getaffinity():获取进程或线程的CPU亲和性参数说明pid:要获取 CPU 亲和性的进程或线程的 ID。...if (CPU_ISSET(1, &cpuset)) { // 如果cpuset中CPU 1对应的位被设置,则执行此代码块 }三、代码示例获取当前进程的亲和性,并将亲和性设置为CPU0和CPU1

32110
  • Redis高负载下的中断优化

    中断亲缘性设置 通过设置中断亲缘性,可以让指定的中断向量号更倾向于发送给指定的CPU Core来处理,俗称“绑核”。...例如下图中,将16进制的400转换成2进制后,为 10000000000,“1”在第10位上,表示亲缘性是第10个CPU Core。 ? 那为什么中断号只设置一个CPU Core呢?...容易想到,由最初的CPU 0单核处理中断,改进到多核处理中断,Redis进程被中断影响的几率增大了,因此我们需要对Redis进程也设置CPU亲缘性,使其与处理中断的Core互相错开,避免受到影响。...使用命令taskset可以为进程设置CPU亲缘性,操作十分简单,一句taskset -cp cpu-list pid即可完成绑定。...经过一番压测,我们发现使用8个core处理中断时,流量直至打满双万兆网卡也不会出现丢包,因此决定将中断的亲缘性设置为物理机上前8个core,Redis进程的亲缘性设置为剩下的所有core。

    3K110

    Linux 性能调优之CPU时间分布(亲和性、带宽、权重)配置Demo

    写在前面 考试整理,分享一些Linux CPU时间分布配置的笔记 内容涉及 CPU 带宽,权重,亲和性配置前后测试Demo Deom 主要以进程级别使用 Cgroup-v2实现 服务级别 使用 systyemd...这里的配置主要有三种方法: 设置CPU 亲和性:限定控制组的进程或者服务仅使用分配的CPU 设置CPU带宽:限定控制组的进程每秒可以在CPU上运行多少秒 设置CPU权重:限定控制组的进程在 CPU上多个应用程序使用...Rocky Linux 8.9 (Green Obsidian) CPE OS Name: cpe:/o:rocky:rocky:8:GA Kernel: Linux...,不能直接修改它们来设置 CPU 核心或内存节点的分配 ┌──[root@vms99.liruilongs.github.io]-[~] └─$ll /sys/fs/cgroup/cpu* -r--r-...在业务高峰期空闲率都着降低到 50% 左右,同时 用户态和系统态的 CPU 利用率增加,即所以核同时被使用 配置亲和性测试 这里我们配置tasks 对应的 Cgroup CPU 亲和性为 1,即只能使用

    64820

    【Linux】多进程高并发设计框架示例

    多进程高并发设计框架 建议根据cpu核心数量来设置子进程的数量。 建议将对应某一进程绑定到某一cpu上。(cpu亲缘性) 优点: 充分利用多核系统的并发处理能力。...示例: multip_process.c #define _GNU_SOURCE #include #include #include #include...cpu亲缘关系,将进程绑定在其中的一个核上 static void worker_process_init(int worker){ cpu_set_t cpu_affinity; //多核高并发处理...ps -eLo ruser,pid,lwp,psr,args 设置CPU亲缘性后,可以发现每个子进程对应一个核心。...若不设置,则存在进程与核心之间的切换,进程从一个核切换到另一个核,进行拷贝与复制,从而浪费了CPU的性能,降低了执行效率。 typedef函数指针相关文章——对于函数指针和typedef的结合运用

    66920

    进程、线程和协程之间的区别和联系

    文章目录 一、进程 二、线程 三、进程和线程的区别与联系 四、一个形象的例子解释进程和线程的区别 五、进程/线程之间的亲缘性 六、协程 一、进程 进程,直观点说,保存在硬盘上的程序运行以后,会在内存空间里形成一个独立的内存体...五、进程/线程之间的亲缘性 亲缘性的意思是进程/线程只在某个cpu上运行(多核系统),比如: BOOL WINAPI SetProcessAffinityMask( _In_ HANDLE...代表只在 cpu0 或 cpu1上工作; */ 使用CPU亲缘性的好处:设置CPU亲缘性是为了防止进程/线程在CPU的核上频繁切换,从而避免因切换带来的CPU的L1/L2 cache失效,cache失效会降低程序的性能...子程序,或者称为函数,在所有语言中都是层级调用,比如A调用B,B在执行过程中又调用了C,C执行完毕返回,B执行完毕返回,最后是A执行完毕。所以子程序调用是通过栈实现的,一个线程就是执行一个子程序。...blog.csdn.net/tennysonsky/article/details/46046317 https://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000

    1.4K30

    Linux CC++多进程同时写一个文件(三)

    本文是这《Linux C/C++多进程同时写一个文件》系列文章的第三篇,上一篇文章演示了两个亲缘关系的进程(父子进程)同时写一个文件的情形,并得出了数据只会错乱但不会覆盖的结论。...2 示例程序 下面这个linux_process_fork1_7.c程序很简单,主要是把p_buf指向的静态区数据写入到文件LINUX_MUTIL_PROCESS_WRITE中。...为了测试多进程同时写文件的情景,需要复制linux_process_fork1_7.c程序为linux_process_fork1_8.c,同时把p_buf指向改成abcdefghi,然后分别编译成两个不同的可执行文件..._7.c * @Describe Linux C/C++多进程同时写一个文件(三) * @Author vfhky 2017-10-29 22:23 https://typecodes.com...4 结论 从测试结果可以得出:两个非亲缘关系的进程同时写一个文件时,如果没有设置append同步文件偏移量,那么两个进程写入的数据会出现覆盖的情况。

    32110

    nginx+php-fpm故障排查

    小明初到一家公司做运维的工作,刚来的第一天就开始部署LNMP(Linux+Nginx+MySQL+PHP)环境,结果出现了问题。 他来向我请教。...具体问题现象、原因和解决思路如下: 问题一 nginx进程CPU和内存不均衡,某个进程占用资源特别高,如何解决?...回答:我让小明绑定下CPU的亲缘性(设置nginx配置worker_cpu_affinity项为auto,auto这个特殊值(1.9.10版本)允许自动绑定工作进程到可用的CPU上。)...,绑定后CPU和内存使用就均衡了。 问题二 小明又问close系统调用消耗很高怎么解决? 回答:且听我娓娓道来,继续看下文。 $ strace -cp $(pgrep -n nginx) ?...系统32c的,top查看负载去到75.14, 查看过nginx和php-fpm的 错误日志也没有什么发现。

    2.2K10

    UNIX(进程间通信):06 深入理解进程,线程和协程

    上下文切换:在某一时刻,一核CPU只能执行一个进程。相当于内核只能让一核CPU为一个机器人提供驱动力让它动起来(1:1),多核CPU可以同时为多个机器人提供驱动力。...CPU时间片。...五、进程/线程之间的亲缘性   亲缘性的意思是进程/线程只在某个cpu上运行(多核系统),比如: BOOL WINAPI SetProcessAffinityMask( _In_ HANDLE...代表只在 cpu0 或 cpu1上工作; */   使用CPU亲缘性的好处:设置CPU亲缘性是为了防止进程/线程在CPU的核上频繁切换,从而避免因切换带来的CPU的L1/L2 cache失效,cache...子程序,或者称为函数,在所有语言中都是层级调用,比如A调用B,B在执行过程中又调用了C,C执行完毕返回,B执行完毕返回,最后是A执行完毕。所以子程序调用是通过栈实现的,一个线程就是执行一个子程序。

    48410

    实时操作系统

    一般的linux都是GPOS(通用)内核。GPOS是不保证实时的,但是对于大多数应用程序来说是没有问题的。GPOS可以充分利用物理资源。但在实时性要求性比较高的场景需要使用实时内核,RT内核。...但是在实时系统中会导致中断自动漂移,对性能造成不稳定因素,在高性能的场合建议关闭并设置IRQs的CPU亲和性。 设置IRQs的CPU亲和性 1..../ } /* ... */ } 从程序的主循环可以很清楚的看到它的逻辑,在退出之前每隔10秒它做了以下的几个事情: 清除统计 分析中断的情况 分析中断的负载情况 根据负载情况计算如何平衡中断 实施中断亲缘性变更...实施中断亲缘性变更 echo MASK > /proc/irq/N/smp_affinity 测试 测试工具 Cyclictest是rt-tests 下使用最广泛的测试工具,一般主要用来测试使用内核的延迟...判断标准:延迟响应时间(us) 测试方法 对GPOS和RTOS分别执行下面的命令: # taskset -c 2 stress --cpu 1 --io 1 -d 1 # taskset -c 2 cyclictest

    2.4K90

    【鹅厂网事】高性能网关设备及服务实践

    那么,我们怎样才能让程序能在多个CPU核心上平行扩展:尽量让每个核维护独立数据结构;使用原子操作来避免冲突;使用无锁数据结构避免线程间相互等待;设置CPU亲缘性,将操作系统和应用进程绑定到特定的内核上,...EAL实现了DPDK运行的初始化工作,基于大页表的内存分配,多核亲缘性设置,原子和锁操作,并将PCI设备地址映射到用户空间,方便应用程序访问。...在CPU亲缘性设置方面,将Linux运行在单独的内核上,实际的数据收发包或者处理逻辑绑定在单独的内核上,避免进程间竞争和上下文切换。...亲缘性设置方面,在一台双CPU的12颗物理核的机器上,因为开启了超线程,逻辑核实际是24个,但由于两颗CPU之间的通信需要使用QPI,会增大报文处理时延。...图13 一种UDP服务程序的亲缘性设置方案 另外自己来处理数据包,从以太网数据帧开始向上层协议分析,并进行必要的校验,只过滤出需要处理的UDP报文,不去使用复杂且低效的Linux协议栈来处理报文。

    1.1K10

    windows 线程

    然后运行调度程序,调度下一个线程,所以说线程休眠的时间理论上最少也有20ms,通常会比我们设置的时间长。...线程的亲缘性 线程的亲缘性与进程的相似,但是线程的亲缘性只能在进程亲缘性的子集之上,比如进程的亲缘性被设置在0 2 3 8这几个CPU上,线程就只能在这几个CPU上运行即使设置亲缘性为7,系统也不会将线程加载到这个...调用函数SetThreadAffinityMask可以设置亲缘性,使所有线程都在不同的CPU上运行,已达到真正的并发执行。...下面是一个使用亲缘性的例子: //设置CPU的位掩码 #define SETCPUMASK(i) (1<<(i)) DWORD WINAPI ThreadProc(LPVOID lpParam); #define...//死循环 FOREVER } 上述程序首先判断了CPU核数,然后有几个CPU就创建几个线程,通过亲缘性设置为每个CPU绑定一个线程,在线程中我们什么都不做,只是一个死循环,主要是为了耗干

    1.7K20

    高性能网关设备及服务实践

    那么,我们怎样才能让程序能在多个CPU核心上平行扩展:尽量让每个核维护独立数据结构;使用原子操作来避免冲突;使用无锁数据结构避免线程间相互等待;设置CPU亲缘性,将操作系统和应用进程绑定到特定的内核上,...EAL实现了DPDK运行的初始化工作,基于大页表的内存分配,多核亲缘性设置,原子和锁操作,并将PCI设备地址映射到用户空间,方便应用程序访问。...在CPU亲缘性设置方面,将Linux运行在单独的内核上,实际的数据收发包或者处理逻辑绑定在单独的内核上,避免进程间竞争和上下文切换。...亲缘性设置方面,在一台双CPU的12颗物理核的机器上,因为开启了超线程,逻辑核实际是24个,但由于两颗CPU之间的通信需要使用QPI,会增大报文处理时延。...图13 一种UDP服务程序的亲缘性设置方案 另外自己来处理数据包,从以太网数据帧开始向上层协议分析,并进行必要的校验,只过滤出需要处理的UDP报文,不去使用复杂且低效的Linux协议栈来处理报文。

    3.5K94

    workerman如何通过reusePort解决Linux内核进程惊群问题?

    结论:如果你的 Linux 内核版本是 3.9 及以上的话,那么在使用 Workerman 时,可以将 reusePort 设置为 true 提升程序运行效率。...workerman 如何利用 reuseport 虽然你只要在 workerman 中把 reusePort 设置为 true,就能享受到 Linux 的这个高级特性。...当业务足够简单时,参与处理请求的进程数越趋近于cpu核心数服务器吞吐量越高。 例如4核服务器,进程数设置为4时,helloworld压测QPS一般是最高的。...如果参与处理的进程数超过cpu核数太多,进程上下文开销越大,性能反而越差。而一般带数据库业务时,进程数设置为cpu核数的3倍-6倍性能可能会更好。...requests-concentrated-in-certain-processes.html Workerman的reusePort属性详解:https://www.jianshu.com/p/97cc8c52d47a

    27510

    windows 多任务与进程

    进程的亲缘性 进程或者线程只在某些CPU上被执行,而不是由系统随机分配到任何可用的CPU上,这个就是进程的亲缘性。...例如某个CPU有8个处理器,可以通过进程的亲缘性设置让该进程的线程只在某两个处理器上运行,这样就不会像之前那样在8个CPU中的任意几个上运行。...,这个时候即使将这个线程又分配到5号处理器上,也能访问这个公共存储区,所以再设置线程在固定的处理器上运行就显得有些鸡肋,这也是拥有三级缓存的CPU比二级缓存的CPU占优势的地方。...但是如果CPU只具有二级缓存,通过设置亲缘性可以发挥高速缓存的优势,提高效率。 亲缘性可以通过函数SetProcessAffinityMask设置。...为了设置亲缘性,首先应该了解机器上CPU的情况,根据实际情况来妥善安排,获取CPU的详细信息可以通过函数GetLogicalProcessInformation来完成。

    1.2K40
    领券