文章目录

  • 一、CPU亲和性
    • 1.1 使用场景
  • 二、使用接口
  • 测试

一、CPU亲和性

CPU亲和性又称CPU关联,可以映射到一个或多个CPU上。该技术基于对称多处理机操作系统中的native central queue调度算法。
队列(queue)中的每一个任务(进程或线程)都有一个标签(tag)来指定它们倾向的CPU。在分配处理器的阶段,每个任务就会
分配到它们所倾向的CPU上;在多核运行的机器上,每个CPU本身自己会有缓存,在缓存中存着进程使用的数据,而没有绑定CPU的话,进程可能会被操作系
统调度到其他CPU上,如此CPU cache(高速缓冲存储器)命中率就低了,也就是说调到的CPU缓存区没有这类数据;- 【1】要先把内存或硬盘的数据载入缓存,而当缓存区绑定CPU后,程序就会一直在指定的CPU执行,不会被操作系统调度到其  他CPU,性能上会有一定的提高;- 【2】使用CPU绑定考虑的是将关键的进程隔离开,对于部分实时进程调度优先级提高,可以将其绑定到一个指定CPU核上,可以保证实时进程的调度,也可以避免其他CPU上进程被该实时进程干扰;调度算法对于处理器亲和性的支持各不相同。有些调度算法在它认为合适的情况下会允许把一个任务调度到不同的处理器上。比如当
两个计算密集型的任务(A和B)同时对一个处理器具有亲和性时,另外一个处理器可能就被闲置了。这种情况下许多调度算法会把
任务B调度到第二个处理器上,使得多处理器的利用更加充分;处理器亲和性能够有效地解决一些高速缓存的问题,但却不能缓解负载均衡的问题。而且,在异构系统中,处理器亲和性问题会变
得更加复杂;
CPU的亲和性分为两种:软亲和性和硬亲和性;- 软CPU亲和性:进程要在指定的CPU上尽量长时间地运行而不被迁移到其他处理器上运行;Linux内核的自身特性,意味着进程通
常不会在处理器之间频繁迁移,以避免这种迁移对于计算能力的消耗,以达到最佳的平衡性;- 硬CPU亲和性的机制:这个机制让开发人员可以实现硬CPU亲和性。这意味着可以显式指定进程在哪个(或哪些)处理器上运行;以此提高性能;

1.1 使用场景

保持高CPU缓存命中率
SMP、NUMA、MPP体系结构介绍

目前主流的服务器配置都是SMP架构,在SMP的环境下,每个CPU本身自己会有缓存,缓存着进程使用的信息,如果一个给定的进程迁移到其他地方去了,那么它就失去了利用 CPU 缓存的优势。实际上,如果正在使用的 CPU 需要为自己缓存
一些特殊的数据,那么所有其他 CPU 都会使这些数据在自己的缓存中失效。因此,如果有多个线程都需要相同的数据,那么将这些
线程绑定到一个特定的 CPU 上是非常有意义的,这样就确保它们可以访问相同的缓存数据(或者至少可以提高缓存的命中率)。否
则,这些线程可能会在不同的 CPU 上执行,这样会频繁地使其他缓存项失效;

测试复杂的应用程序

考虑一个需要进行线性可伸缩性测试的应用程序。有些产品声明可以在使用更多硬件时执行得更好。 我们不用购买多台机器(为每
种处理器配置都购买一台机器),而是可以:1.购买一台多处理器的机器;2.不断增加分配的处理器;3.测量每秒的事务数;4.评估
结果的可伸缩性;

二、使用接口

#inclde <sched.h>int sched_setaffinity(pid_t pid, size_t cpusetsize,cpu_set_t *mask);
/**
@func: 将ID为pid的进程的CPU亲和性掩码设置为mask指定的值;若pid为0,则使用当前调用进程;如果pid指定的进程当前不在掩码中指定的cpu上运行,那么该进程将迁移到掩码中指定的一个cpu上掩码中指定的cpu;
@param cpusetsize: sizeof(cpu_set_t);
return: 成功返回0,失败返回-1;
*/int sched_getaffinity(pid_t pid, size_t cpusetsize,cpu_set_t *mask);
/**
@func: 获取pid的亲和性掩码,存入mask中;
return: 成功返回0,失败返回-1;
*//** 清除set */
void CPU_ZERO(cpu_set_t *set);
/** 设置 */
void CPU_SET(int cpu, cpu_set_t *set);
/** 移除 */
void CPU_CLR(int cpu, cpu_set_t *set);
/** 判断是否设置 */
int  CPU_ISSET(int cpu, cpu_set_t *set);
/** CPU数量 */
int  CPU_COUNT(cpu_set_t *set);void CPU_AND(cpu_set_t *destset, cpu_set_t *srcset1, cpu_set_t *srcset2);
void CPU_OR(cpu_set_t *destset, cpu_set_t *srcset1, cpu_set_t *srcset2);
void CPU_XOR(cpu_set_t *destset, cpu_set_t *srcset1, cpu_set_t *srcset2);
int  CPU_EQUAL(cpu_set_t *set1, cpu_set_t *set2);cpu_set_t *CPU_ALLOC(int num_cpus);
void CPU_FREE(cpu_set_t *set);
size_t CPU_ALLOC_SIZE(int num_cpus);/*/usr/include/bits/sched.h*/# define __CPU_SETSIZE  1024
# define __NCPUBITS (8 * sizeof (__cpu_mask))/* Type for array elements in 'cpu_set'.  */
typedef unsigned long int __cpu_mask;typedef struct
{__cpu_mask __bits[__CPU_SETSIZE / __NCPUBITS];
} cpu_set_t;
// 每一个bit都表示一个cpu状态

测试

========》Centos下几种CPU查看使用率的常用命令《=========

#include <stdint.h>
#include <stdio.h>
#include <sched.h>
#include <pthread.h>
#include <stdlib.h>static inline void print_cpu_mask(cpu_set_t cpu_mask)
{unsigned char flag = 0;printf("Cpu affinity is ");for (unsigned int i = 0; i < sizeof(cpu_set_t); i ++){if (CPU_ISSET(i, &cpu_mask)){if (flag == 0){flag = 1;printf("%d", i);}else{printf(",%d", i);}}}printf(".\n");
}static inline void get_cpu_mask(pid_t pid, cpu_set_t *mask)
{if (sched_getaffinity(pid, sizeof(cpu_set_t), mask) == -1){perror("get cpu affinity failed.\n");abort();}
}static inline void set_cpu_mask(pid_t pid, cpu_set_t *mask)
{if (sched_setaffinity(pid, sizeof(cpu_set_t), mask) == -1){perror("set cpu affinity failed.\n");abort();}
}void *thread_func(void *param)
{cpu_set_t cpu_mask;get_cpu_mask(0, &cpu_mask);printf("Slave thread ");print_cpu_mask(cpu_mask);CPU_ZERO(&cpu_mask);CPU_SET(1, &cpu_mask);set_cpu_mask(0, &cpu_mask);get_cpu_mask(0, &cpu_mask);printf("Slave thread ");print_cpu_mask(cpu_mask);for (;;){;}
}int main(int argc, char *argv[])
{unsigned int active_cpu = 0;cpu_set_t cpu_mask;pthread_t thread;get_cpu_mask(0, &cpu_mask);print_cpu_mask(cpu_mask);CPU_ZERO(&cpu_mask);CPU_SET(active_cpu, &cpu_mask);set_cpu_mask(0, &cpu_mask);get_cpu_mask(0, &cpu_mask);printf("Master thread ");print_cpu_mask(cpu_mask);if (pthread_create(&thread, NULL, thread_func, NULL) != 0){perror("pthread_create failed.\n");}pthread_join(thread, NULL);return 0;
}
本次测试使用1号cpu,使用mpstat命令查看即可确认是否设置成功;

参考文章
关于CPU亲和性,这篇讲得最全面
Linux CPU亲缘性详解

【Linux系统编程】| Linux性能优化——CPU亲缘性相关推荐

  1. LINUX系统编程 LINUX 虚拟内存

    LINUX 虚拟内存 以32位操作系统为例子,因为64位系统虚拟地址过大为2^64,32位仅仅为2^32=4G更利于描述,但是原理东西都一样 这首先要从程序和进程之间的关系开始,我们一般写好一段C\C ...

  2. Linux系统编程——Linux系统调用

    系统调用概述 系统调用,顾名思义,说的是操作系统提供给用户程序调用的一组"特殊"接口.用户程序可以通过这组"特殊"接口来获得操作系统内核提供的服务,比如用户可以 ...

  3. C语言嵌入系统编程修炼-性能优化

    2019独角兽企业重金招聘Python工程师标准>>> 本文来自:智趣网-C/C++语言编程技术交流论坛 http://www.bczh.net 使用宏定义 在 C语言中,宏是产生内 ...

  4. Linux系统编程笔记

    文章目录 1.Linux系统编程 2.文件IO 2.1 文件描述符 2.2 open 2.3 perror 2.4 close 2.5 write 2.6 read 2.7 remove 2.8 系统 ...

  5. 学习Linux系统编程、网络编程的方法

    Linux系统编程 Linux网络编程 学习的参考文档 链接:https://pan.baidu.com/s/1lPXTkrn0SKGs-BEY61FOgw 提取码:47i9

  6. linux nginx cpu 高,Linux 系统 Nginx性能优化CPU参数

    Nginx性能优化CPU参数worker_cpu_affinity使用说明 官方说明: worker_cpu_affinity Syntax:worker_cpu_affinity cpumask [ ...

  7. linux性能优化--cpu篇

    linux性能优化--cpu篇 前言 负载 CPU使用率 proc perf 一些链接 `perf list` 比较有用的event `perf stat` `perf record` Profili ...

  8. 【Linux 性能优化系列】Linux 性能优化 -- CPU 性能篇(三) Linux 软中断

    [Linux 性能优化系列]Linux 性能优化 -- CPU 性能篇(三) Linux 软中断 [1]相关概念 [1.1]中断 中断其实是一种异步的事件处理机制,可以提高系统的并发处理能力:为了减少 ...

  9. Linux性能优化-CPU性能优化思路

    目录 CPU性能指标 性能工具 如何迅速的分析CPU性能瓶颈 性能优化方法论 CPU优化 参考 CPU性能指标 CPU使用率 1.CPU使用率描述了非空闲时间占总CPU时间的百分比,根据CPU上运行任 ...

最新文章

  1. 2019南昌网络赛 C题,Hello 2019
  2. php面试题之五——MySQL数据库(基础部分)
  3. LINQ学习之旅——第二站LTQ之标准数据库操作(增查删改)
  4. C语言字符串怎么算char字符,计算C中字符串中char的出现次数
  5. [C++基础]032_常用的字符串处理函数(strcat,strcpy,strcmp,strupr,strlwr,strlen)...
  6. spring依赖注入_Spring的依赖注入陷阱
  7. Fiddler的安装和使用教程(详细)
  8. 数据库系统概念第六版课后习题答案-第二章
  9. Mujoco制作模拟视频
  10. 快速取消PPT中所有动画效果
  11. Java多线程系列--【JUC锁04】-公平锁(二)
  12. 怎么在地图上标注自己的店铺
  13. 阿里云大学安全课程-阿里云首席安全研究员吴瀚清:WannaCry事件最“细思恐极“的一个事实是?...
  14. 洗牌 --网易有道2017内推编程题
  15. 谷歌的AI布局:机器学习是重心 继续在中国招人
  16. 解决NVIDIA显卡驱动 图形驱动程序安装失败 问题
  17. parseInt() 函数的奇怪行为
  18. 第九届全球云计算大会·中国站圆满落幕甬城,赋能双循环“新”发展!
  19. 分枝定界图解(含 Real-Time Loop Closure in 2D LIDAR SLAM论文部分解读及BB代码部分解读)
  20. Spring系列【11】配置Bean的初始化行为

热门文章

  1. 电脑白屏 结束explorer.exe进程
  2. 微信公众号网页授权----redirect_uri域名与后台配置不一致,错误码10003 错误
  3. castep此计算机无法与提供,MaterialStudio中CASTEP计算好的结构怎么导出材
  4. 2018.10.26 酷狗音乐校招前端一面经历(转)
  5. 职场人士都在用的15款办公软件,有你用过的吗?
  6. 两分钟解决Unity谜之问题,License error,Unity2021打不开
  7. cisco ospf 隔离_思科网络工程师干货 | Cisco 路由器、交换机设备实战配置课程
  8. java开发进销存系统_java进销存系统
  9. ACP认证考试-必须要了解的那点事
  10. 2023计算机毕业设计SSM最新选题之java养老院信息管理系统1v87b