首页 > Scheduler > CPU亲和性的使用与机制

CPU亲和性的使用与机制

Scheduler 2013-08-15

CPU的亲和性, 就是进程要在指定的 CPU 上尽量长时间地运行而不被迁移到其他处理器,亲和性是从affinity翻译过来的,应该有点不准确,给人的感觉是亲和性就是有倾向的意思,而实际上是倒向的意思,称为CPU关联性更好,程序员的土话就是绑定CPU,绑核。

在多核运行的机器上,每个CPU本身自己会有缓存,缓存着进程使用的信息,而进程可能会被OS调度到其他CPU上,如此,CPU cache命中率就低了,当绑定CPU后,程序就会一直在指定的cpu跑,不会由操作系统调度到其他CPU上,性能有一定的提高。

另外一种使用绑核考虑就是将重要的业务进程隔离开,对于部分实时进程调度优先级高,可以将其绑定到一个指定核上,既可以保证实时进程的调度,也可以避免其他CPU上进程被该实时进程干扰。

1.CPU亲和性在用户态的使用

linux的CPU亲和性在用户态表现为一个cpu_set_t掩码的形式,用户可以调用两个函数设置和获取掩码:

#define _GNU_SOURCE /* See feature_test_macros(7) */ #include
int sched_setaffinity(pid_t pid, size_t cpusetsize, cpu_set_t *mask);
int sched_getaffinity(pid_t pid, size_t cpusetsize, cpu_set_t mask);

sched_setaffinity是设置指定pid亲和性掩码的,mask是传入的参数;sched_getaffinity则是获取指定pid亲和性掩码的,mask是获取的参数。

cpusetsize可以通过sizeof cpu_set_t算出来。

cpu_set_t 是一个掩码数组,一共有1024位,每一位都可以对应一个cpu核心,以下宏,都是对这个掩码进行操作的。如果需要,一个进程是可以绑定多个cpu的。

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);

而mask的表现是如此的:如果是0X23,转换成二进制则为00100011,则表明进程绑定在0核、1核和5核上。

绑核需要注意是,子进程会继承父进程的绑核关系。

代码实例:

#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sched.h>
#include <pthread.h>
#include <sys/syscall.h>
#define gettid() syscall(__NR_gettid)
void *test_thread(void *arg)
{ cpu_set_t mask; int loop = 0; int cpu_num = 0; cpu_num = sysconf(_SC_NPROCESSORS_CONF); pthread_detach(pthread_self()); CPU_ZERO(&mask); CPU_SET(1, &mask); if(sched_setaffinity(0, sizeof(mask), &mask) == -1) { printf("set affinity failedn"); } while(1) { CPU_ZERO(&mask); if(sched_getaffinity(0, sizeof(mask), &mask) == -1) { printf("get failedn"); } for(loop = 0; loop < cpu_num; loop++) { if(CPU_ISSET(loop, &mask)) { printf("test thread %lu run on processor %dn", gettid(), loop); } } sleep(1); }
}
void *child_thread(void *arg)
{ cpu_set_t mask; int loop = 0; int cpu_num = 0; cpu_num = sysconf(_SC_NPROCESSORS_CONF); pthread_detach(pthread_self()); while(1) { CPU_ZERO(&mask); if(sched_getaffinity(0, sizeof(mask), &mask) == -1) { printf("get failedn"); } for(loop = 0; loop < cpu_num; loop++) { if(CPU_ISSET(loop, &mask)) { printf("child thread %lu run on processor %dn", gettid(), loop); } } sleep(1); }
}
int main(int argc, char *argv[])
{ int cpu_num = 0; pthread_t thread; int cpuid = 0; int ret = 0; int loop = 0; cpu_set_t mask_set; cpu_set_t mask_get; if(argc != 2) { printf("usage:cpu numn"); return -1; } cpuid = atoi(argv[1]); /* 获取系统CPU的个数 */ cpu_num = sysconf(_SC_NPROCESSORS_CONF); printf("system has %i processor.n", cpu_num); /* 初始化mask_set */ CPU_ZERO(&mask_set); CPU_SET(cpuid, &mask_set); if(sched_setaffinity(0, sizeof(mask_set), &mask_set) == -1) { printf("Warning:set cpu %d affinity failedn", cpuid); } ret = pthread_create(&thread, NULL, child_thread, NULL); if(ret) { printf("Error:pthread_create failedn"); return -1; } ret = pthread_create(&thread, NULL, test_thread, NULL); if(ret) { printf("Error:pthread_create failedn"); return -1; } while(1) { CPU_ZERO(&mask_get); if(sched_getaffinity(0, sizeof(mask_get), &mask_get) == -1) { printf("Warning:get cpu %d affinity failedn", cpuid); } for(loop = 0; loop < cpu_num; loop++) { if(CPU_ISSET(loop, &mask_get)) { printf("this processor %lu is running on processor: %dn", gettid(), loop); } } sleep(1); } return 0;
}

执行之后根据打印和/proc stat的内容可以判断,status有

Cpus_allowed: 08
Cpus_allowed_list: 3

可以更清楚的看到进程绑核状态

但是如果进程已经在运行过程中,用户不能直接改动代码,就用taskset工具更改CPU亲和性关系。

taskset [options] -p [mask] pid

其中mask前面已说了,参看man手册更详细一点。

二、CPU亲和性在内核态机制

在内核进程结构体task_struct里面有一个参数,即为

cpumask_t cpus_allowed;

用来记住CPU的绑核关系。

内核尤其是调度的时候,可以保证让task不会被调度到其他CPU上

static inline
int select_task_rq(struct task_struct *p, int sd_flags, int wake_flags)
{ int cpu = p->sched_class->select_task_rq(p, sd_flags, wake_flags); /* * In order not to call set_task_cpu() on a blocking task we need * to rely on ttwu() to place the task on a valid ->cpus_allowed * cpu. * * Since this is common to all placement strategies, this lives here. * * [ this allows ->select_task() to simply return task_cpu(p) and * not worry about this generic constraint ] */ if (unlikely(!cpumask_test_cpu(cpu, &p->cpus_allowed) || !cpu_online(cpu))) cpu = select_fallback_rq(task_cpu(p), p); return cpu;
}

进程在选择CPU队列的时候,只选择被允许的CPU队列,使用cpumask_test_cpu进行测试。


http://www.taodudu.cc/news/show-3375794.html

相关文章:

  • 服务器 amd cpu性能排行榜,AMD霸榜,桌面端移动端服务器端全面领先!最强CPU性能破世界纪录...
  • 你不好奇 CPU 是如何执行任务的吗?
  • 汇编学习教程:CPU内的小秘密
  • 服务器稳定度cpu温度,温度会不会影响CPU性能及稳定性
  • android cpu 悬浮窗口,Android 使用 WindowManager 实现悬浮窗监控 cpu 温度
  • Android开发之——Profiler-CPU性能分析
  • NET C#微信个人号 HOOK 基于微信2.8.0版本 全接口 微信机器人 淘宝客 二次开发
  • 【淘宝客】PHPMailer-v6.0.5版 发送邮件dome
  • 一个淘宝客劫持木马的分析
  • 一个成功的淘宝客网站具有哪些特点
  • 店铺做淘宝客推广的步骤和条件
  • 淘宝客订单API获取订单代码
  • 淘宝客APP开发定制都需要什么功能
  • 淘宝客对接遇到的坑!
  • wordpress淘宝客主题—仿礼物说主题
  • 淘宝客服务端SDK PHP7版本简单起步教程
  • 手游盒子推广_实在太难了 怎么推广游戏盒子?
  • 如何从推广短信链接唤起 App ?这种一键跳转的方式了解一下!
  • android 分享链接地址,android/IOS各平台分享链接/跳转链接配置说明(备用)
  • 推广链接PHP
  • 豆瓣影片TOP250排名分析报告-PPT呈现
  • PPT录屏录制多媒体时播放有回音的解决方法
  • PPT修复文档内容方法之一
  • K12教育产品竞品分析(VIPKID、DaDaABC) PPT
  • arcgis重心迁移分析_Arcgis第四章 空间分析.ppt
  • 『滴滴出行』产品分析(PPT)
  • 如何在ppt中生成柱状图_在ppt中做柱状图的方法图解步骤
  • 一种用markdown写PPT的方法,再也不用费劲排版了
  • 基于Python 爬虫+简单数据分析 附PPT
  • Mac OS 最新系统 Catalina升级记

为程序选择在哪个cpu上跑相关推荐

  1. AidLearning安装Oracle JDK让Java Swing程序在华为MatePadPro平板上跑起来

    AidLearning安装Oracle JDK让Java Swing程序在华为MatePadPro平板上跑起来 cemike@126.com 入手华为MatePadPro平板以后就有把windows台 ...

  2. 基于Tusimple数据集在windows cpu上跑通车道线检测算法LSTR

    基于Tusimple数据集在windows cpu上跑通车道线检测算法LSTR PS:基于CULane数据集在windows cpu上跑通车道线检测算法LSTR参考: https://blog.csd ...

  3. CPU上跑到 33 FPS 的简单轻量级人体姿态估计网络

    点击我爱计算机视觉标星,更快获取CVML新技术 在姿态估计算法中,微软开发的 SimpleBaseline 是精度高而又轻量级的典范,昨天一篇论文Simple and Lightweight Huma ...

  4. CPU上跑到 100 fps 的高精度PyTorch人脸特征点检测库

      视学算法分享   作者 | cunjian 编译 | CV君 转自 | 我爱计算机视觉 [导读]向大家推荐一款基于PyTorch实现的快速高精度人脸特征点检测库,其在CPU上的运行速度可达100 ...

  5. CPU上跑深度学习模型,FPS也可以达100帧

    点击我爱计算机视觉标星,更快获取CVML新技术 本文转载自OpenCV学堂. 英特尔从去年推出OpenVINO开发框架,从此以后几乎每三个月就更新一个版本,最新版本2019R03,但是此版本跟之前的版 ...

  6. 让16位Pwin3.2程序在64位Win10上跑起来

    序言 曾经在Pwin32上写的16位程序,只有编译文件但已经没有原码了.用了otvdmw支持,程序在Win10上就跑起来了,下载地址 https://download.csdn.net/downloa ...

  7. cpu 指定cpu执行 java_java程序可以实现在指定CPU上运行吗?

    java程序可以指定CPU运行吗?这是我以前遇到的一个面试问题,这两天又想起来了.一般我们都知道C.C++是可以实现程序指定CPU运行的,那么java到底可不可以呢?网上一部分人说可以,一部分人说不可 ...

  8. python如何让进程运行在指定的cpu上_java程序可以实现在指定CPU上运行吗?

    java程序可以指定CPU运行吗?这是我以前遇到的一个面试问题,这两天又想起来了.一般我们都知道C.C++是可以实现程序指定CPU运行的,那么java到底可不可以呢?网上一部分人说可以,一部分人说不可 ...

  9. 服务器跑python程序后还能安装网站吗_如何在服务器上跑python程序

    在服务器上跑python程序的方法: 登录服务器,将需要运行的python程序上传到服务器端,选择合适的python版本,运行python解释器,将程序路径添加进去执行就可以了 示例如下: windo ...

最新文章

  1. 技术 | Bengio终结Theano不是偶然,其性能早在Keras支持的四大框架中垫底
  2. 经典问题——进程和线程区别
  3. 网站设计流程图(来源于网络)
  4. openstack搭建之-nova配置(10)
  5. Essential fact about future of PhD studies
  6. 【跨平台网络抓包神器のtcpdump】ubuntu下编译tcpdump开源抓包工具
  7. python3 logging模块
  8. [动态代理三部曲:下] - 从动态代理,看Retrofit的源码实现
  9. tidb时间转字符串_如何使用TiDB节省时间
  10. NV21数据的镜像算法
  11. Android 设备上实现串口的移植
  12. 国家标准的台式计算机,GBT 9813.1-2016 计算机通用规范 第1部分:台式微型计算机国家标准...
  13. Android Studio 配置 NDK 开发编译环境
  14. uni-app和H5页面使用支付宝登陆问题解决
  15. HDU1922 POJ3004 Subway planning “神题”留名
  16. 转载Faster-rcnn理解
  17. spring aop 记录controller层的入参和出参
  18. JAVA-API(一)
  19. 徒步穿越神农架无人区
  20. 卡在linuxctrld进系统_centos7系统停在Ctrl+d界面的解决方法

热门文章

  1. VO、BO、PO、DO、DTO的区别
  2. 【MMC驱动开发】——EMMC协议速览
  3. windows 定制 terminal 上手实践
  4. 电赛专题---一.概述【电赛简介 /信号类需要准备什么?/怎么才能打好电赛?】
  5. 测牛学堂:高级软甲测试工程师基础夯实之linux系统权限命令学习总结
  6. jsp小区停车位管理系统毕业设计
  7. Java学习日志(八): 可变参数,debug断点调试,静态导入,集合嵌套
  8. AUTOCAD(二)绘制立体图
  9. 2021-05-06PLC选型和串口通信
  10. 根据关键词批量获取淘宝商品链接并保存图片