绑定CPU逻辑核心的利器——taskset
在工作中,我们可能遇到这样的需求:如何评估程序在一核和多核下的工作效率差距?最简单的想法是找一台只有一个CPU逻辑核的机器和一台有多个逻辑核的机器。(转载请指明出于breaksoftware的csdn博客)但是这种方式有明显的问题:
- 不容易找到这样的机器。
- 找到的机器不能保证其他配置一致,比如CPU主频。
- 找的的机器不能保证环境一致,比如操作系统或者运行中的其他程序。
于是比较好的方式是:在一台多逻辑核的机器上指定程序可以运行在哪些核上。为了可以证明我们程序在多个核心上切换,我编写了如下代码
// build script:gcc -lpthread bind_core.c -o bind_core
#include <stdio.h>
#include <pthread.h>
#include <sched.h>void* thread_routine(void* arg) {int cpu = -1;while(1) {int cur_cpu = sched_getcpu();if (cur_cpu != cpu) {printf("pre:%d, cur:%d\n", cpu, cur_cpu);cpu = cur_cpu;}}
};void test_cpu_switch() {pthread_t thread;pthread_create(&thread, NULL, thread_routine, NULL);pthread_detach(thread);sleep(100);
}
这段代码中启动了一个线程,通过sched_getcpu函数不停检测当前占用的逻辑核心编号。如果发生核心切换,就打印出来。在一台相对繁忙的40个逻辑核心机器上,其输出结果如下:
上图可以看出,程序分别在:0,1,2,3,7,8,10,12,13,14,15,17,19,21号逻辑核上运行过。为了让CPU在固定的核心上执行,我们可以使用taskset指令,让程序绑定逻辑核心。
taskset -c 0,10 ./bind_core
上面指令让bind_core执行于0和10号逻辑核心上,这样我就可以看到它在这两个核心上的切换
基于上面的基础,我们可以编写测试代码,看看多线程程序在单核心和多核心下的处理能力
#include <stdio.h>
#include <pthread.h>
#include <sched.h>unsigned long g_a = 0;
unsigned long g_b = 0;void* thread_routine(void* arg) {while(1) {(*((unsigned long*)arg))++;}
};void test_cpu_ability() {pthread_t thread_a;pthread_create(&thread_a, NULL, thread_routine, &g_a);pthread_detach(thread_a);pthread_t thread_b;pthread_create(&thread_b, NULL, thread_routine, &g_b);pthread_detach(thread_b);sleep(3);printf("a:%lu\tb:%lu\n", g_a, g_b);
};
这段代码启动了两个线程,每个线程分别不停自增。过了3秒后,通过两个全局变量的值表达出不同场景的处理能力:
- 不设置CPU绑定
./bind_core a:999409723 b:994174648
- 设置绑定到0号CPU逻辑核心
taskset -c 0 ./bind_core a:563819215 b:564766868
- 设置绑定到0,1号CPU逻辑核心
taskset -c 0,1 ./bind_core a:1113333145 b:1072107088
- 设置绑定到0,1,2号CPU逻辑核心
taskset -c 0,1,2 ./bind_core a:1114825104 b:1113289961
可以看到,当启动两个线程时,绑定一个核心的处理能力是绑定两个核心的处理能力的一半左右。而绑定的核心数超过线程数时(如绑定到0,1,2号逻辑核心),其效率并没有明显提高。当然上述结论有个前提:这是CPU资源密集型的场景。
相关文章:

IDE set arguments
2019独角兽企业重金招聘Python工程师标准>>> code::blocks -> Project -->set programs arguments qtcreater -> Projects --> Build&Run --> Run --> Arguments xcode -> super < -->build-->arguments 转载于:https://my.osch…
2020年AI如何走?Jeff Dean和其他四位“大神”已做预测!
作者 | Khari Johnson译者 | 王艳妮 责编 | 胡巍巍出品 | AI科技大本营(ID:rgznai100)人工智能已经不再是随时准备改变世界的状态,而是已经在改变世界。在迈入2020年这新的一年、以及新的20年代之际,笔者请到了AI方面最…
zookeeper快速入门——简介
在几十年前,一个独立的计算机上往往部署着一套完整的应用系统。当时因为网络稳定性及速度的限制,将相关联的服务部署在一台机器上,让它们使用系统机制通信——比如管道,文件等,往往是最稳定和最高效的。然而随着网络技…

为TextMate扩展全屏功能
今天看代码,感觉TextMate那个窗口太小了点,越看越不爽,就想把它弄成全屏的。于是搜索啊搜索啊搜索,终于让我找到一款很yd的小软件,叫megazoomer, 下载地址是:[url]http://ianhenderson.org/mega…

hdu1406
一道很水很水的题!!!!!!!!!!#include<iostream> using namespace std; int main(){int num1,num2,i,k,j,sum,n;while(cin>>n){ while(n--){cin&g…
zookeeper快速入门——部署
zookeeper有两种运行模式:独立模式和仲裁模式。独立模式就是只运行一个Zookeeper Server,这自然没法解决服务崩溃导致系统不可用的问题。仲裁模式就是以集群的方式运行Zookeeper Server,这样在Leader不可用时,集群内部会发起选举&…
2020,人工智能和深度学习未来的五大趋势
来源 | forbes编译 | Shawn编辑 | Carol出品 | AI科技大本营(ID:rgznai100)虽然近年来人工智能经常成为热门议题,但它还远未实现真正的成就。人工智能技术发展的主要障碍在于投资成本,投资成本影响短期内的回报。而当时…

电脑常见故障 1
死机恐怕是所有电脑故障里面最常见的一种了,但是死机的原因是多种多样的。 如果从硬件入手,先是看看机箱里的温度是否很高,要检查CPU的风扇是否正常运转,并要注意电脑的散热问题;其次可检查内存,检查完内存…

linux常用命令-date-clock-hwclock-type-whois--help-man-info-cal
date:时间管理电子表:晶体震荡器 石英震荡器Linux:rtc 硬件时间NTP:网络时间协义硬件时间(命令:clock)系统时间(命令:date)type COMMAND 判断命令是内部命令…
内存、性能问题分析的利器——valgraind
valgrind是一个知名的分析软件集。我们可以使用它进行内存、多线程及性能等各种问题的分析。它采用非侵入方式,所谓非侵入方式是指:我们不用在代码中插入分析工具的库。这对于开发者来说是友好的。因为如果要将工具编译到文件中,或者要调用其…
这是我见过最卡通的 Python 算法了,通俗易懂
普通程序员,不学算法,也可以成为大神吗?对不起,这个,绝对不可以。可是算法好难啊~~看两页书就想睡觉……所以就不学了吗?就一直当普通程序员吗?如果有一本算法书,看着很轻松……又有…

WebService(Axis2)视频教程与QQ交流群发布
Axis2是目前比较流行的WebService引擎。WebService被应用在很多不同的场景。例如,可以使用WebService来发布服务端 Java类的方法,以便使用不同的客户端进行调用。这样可以有效地集成多种不同的技术来完成应用系统。WebService还经常被使用在SOA中&#x…

fragment类onresume里面刷新操作处理
今天项目中涉及fragment中嵌套多个fragment,但是要根据tag去展示对应的fragment,而不是默认展示的第一个fragment,如果使用activity很容易想到onpause(),onResume()中进行处理,但是你会发现fragment的onpause和onresume只调用一次…
内存问题分析的利器——valgrind的memcheck
在《内存、性能问题分析的利器——valgrind》一文中我们简单介绍了下valgrind工具集,本文将使用memcheck工具分析各种内存问题。(转载请指明出于breaksoftware的csdn博客) 本文所有的代码都是使用g -O0 -g mem_error.c -o mem_erro编译&#…

类项目中的配置文件app.config在打包安装后的信息获取的问题
在一个项目中碰到这样的一个问题,做一个WORD插件,功能在类库项目中实现了,配置信息存在类库项目的配置文件app.config中,在进行打包后,获取的配置文件中的DocType节点信息时,使用以下方法 ConfigurationMa…
AAAI 2020论文解读:商汤科技提出新弱监督目标检测框架
来源 | Object Instance Mining for WeaklySupervised Object Detection编辑 | Carol出品 | AI科技大本营(ID:rgznai100)商汤科技视频大数据团队发表论文《Object Instance Mining forWeakly Supervised Object Detection》,该论文…

20135306黄韧 信息安全系统设计基础期中学习总结
信息安全系统设计基础第八周学习总结 知识点总结 第1章 计算机系统漫游 △计算机系统是由硬件和系统软件组成的,它们共同协作以运行应用程序。计算机内部的信息被表示为一组组的位.它们依据上下文有不同的解释方式。程序被其他程序翻译成不同的形式&…

使用SQL Server维护计划实现数据库定时自动备份
在SQL Server中出于数据安全的考虑,所以需要定期的备份数据库。而备份数据库一般又是在凌晨时间基本没有数据库操作的时候进行,所以我们不可能要求管理员每天守到晚上1点去备份数据库。要实现数据库的定时自动备份,最常用的方式就是使用SQL S…
AI 医疗公司“战疫”在前线
作者 | Just来源 | CSDN(CSDNnews)紧急驰援疫区,涉足AI医疗领域的公司也出动了。截止到2月6日,随着新冠病毒肺炎疫情的不断发展,全国累计已有31161例确诊病例,26359例疑似病例。不过,由于医疗资…
动态执行流程分析和性能瓶颈分析的利器——valgrind的callgrind
在《内存、性能问题分析的利器——valgrind》一文中我们简单介绍了下valgrind工具集,本文将使用callgrind工具进行动态执行流程分析和性能瓶颈分析。(转载请指明出于breaksoftware的csdn博客) 之前的《利器》系列中,我们介绍了两种…

CentOS6.3编译安装Nginx1.4.7 + MySQL5.5.25a + PHP5.3.28
2019独角兽企业重金招聘Python工程师标准>>> 【准备工作】 01 #在编译安装lnmp之前,首先先卸载已存在的rpm包。 02 rpm -e httpd 03 rpm -e mysql 04 rpm -e php 05 06 yum -y remove httpd 07 yum -y remove mysql-server mysql 08 yum -y remove php 0…
GitHub标星14000+,阿里开源的SEATA如何应用到极致?
作者简介:袁鸣凯,家乐福技术总监, 高知特有限技术公司中国区架构师,HP上海研发技术专家,夸客金融首席架构师,现任家乐福中国区技术总监。多年互联网、企业级SOA、微服务、全渠道中台方面的架构设计实战经验…

C++拾趣——有趣的操作符重载
操作符重载是C语言中一个非常有用的特性。它可以让我们比较优雅的简化代码,从而更加方便的编写逻辑。 为什么要使用操作符重载一种常见的用法是重载<<运算符,让标准输出可以输出自定义的类型。比如 #include <iostream>class Sample {friend…

urlparse模块(专门用来解析URL格式)
# -*- coding: utf-8 -*- #python 27 #xiaodeng #urlparse模块(专门用来解析URL格式)#URL格式: #protocol ://hostname[:port] / path / [;parameters][?query]#fragment #parameters:特殊参数,一般用的很少。#1、url…
使用Boost的Serialization库序列化STL标准容器
使用Boost做对象序列化是非常方便的,本文将介绍一种序列化STL标准容器的方法。这是之前设计的异步框架的一个子功能:过程A将标准容器数据序列化成二进制流,然后将该二进制数据发送到过程B,过程B将数据反序列化为标准容器。&#x…
连登GitHub TOP榜,中国开发者在行动!
作者 | 唐小引数据 | 于瑞洋出品 | AI科技大本营(ID:rgznai100)中国开发者正在走向世界中文开源项目正在不断登上 GitHub TOP 榜不久前,一个名叫「wuhan2020」的开源项目进入了 GitHub Trending TOP 榜,截至到现在,已经…

Merge into的使用
用途 merge 命令可以用来用一个表中的数据来修改或者插入到另一个表。插入或者修改的操作取决于on子句的条件。该语句可以在同一语句中执行两步操作,可以减少执行多条insert 和update语句。merge是一个确定性的语句,即不会在同一条merge语句中去对同一条…

PHP和MySQL Web开发从新手到高手,第8天-创建categories管理页面
1. 创建categories管理页面 主要包含以下几个页面: A. index.php, 准备各种变量数据.供展示页面使用. B. categories.html.php, 显示categories. C. form.html.php, 用于编缉或添加作者的页面. 页面郊果: 2. categories页面的主要流程 2.1 是否已登录 if (!user_is_login()){in…

堆状态分析的利器——valgrind的DHAT
在《堆问题分析的利器——valgrind的massif》一文中,我们介绍了如何使用massif查看和分析堆分配/释放的问题。但是除了申请和释放,堆空间还有其他问题,比如堆空间的使用率、使用周期等。通过分析这些问题,我们可以对程序代码进行优…

cisco2950交换机密码恢复
在实际工作中可能会忘记交换机密码,导致不能对交换机进行配置的情况。cisco提供了密码恢复的方法。以下是关于交换机密码恢复说明:如果忘记密码,这时我们如果要配置交换机就必须在启动时绕过config.text的配置【密码保存在config.text中】然后…