如何指定cpu运行进程运行的CPU

查看: 1639|回复: 4
设置进程(线程)在指定的CPU上运行,建议官方添加!
阅读权限90
在线时间 小时
签到天数:7 天结帖率: (9/9)
本帖最后由 萧阳天 于
20:13 编辑
今天写的软件在别人那里一运行就出错。还以为多线程代码写错了。找了一个晚上问题,才发现他的电脑是单核的。
实现方法进程与指定cpu绑定:
SetProcessAffinityMask(GetCurrentProcess(),dwMask);
线程与指定cpu绑定:SetThreadAffinityMask(GetCurrentThread(),dwMask);
dwMask为CPU序号的或运算值:1(0001)代表只运行在CPU1,2(0010)代表只运行在CPU2,3(0011)代表可以运行在CPU1和CPU2,以此类推。
设置之前最好判断一下系统有几个CPU:
SYSTEM_INFOSystemIGetSystemInfo(&SystemInfo);
CPU个数:SystemInfo.dwNumberOfProcessors
当前启用的CPU序号:SystemInfo.dwActiveProcessorMask,Mask representing the set of processors configured into the system. Bit 0 is processor 0;
bit 31 is processor 31.
CPU亲缘性介绍按照默认设置,当系统将线程分配给处理器时,Windows使用软亲缘性来进行操作。这意味着如果所有其他因素相同的话,它将设法在它上次运行的那个处理器上运行线程。让线程留在单个处理器上,有助于重复使用仍然在处理器的内存高速缓存中的数据。有一种新的计算机结构,称为NUMA(非统一内存访问),在该结构中,计算机包含若干块插件板,每个插 件板上有4个CPU和它自己的内存区。当CPU访问的内存是它自己的插件板上的内存时,NUMA系统运行的性能最好。如果CPU需要访问位于另一个插件板上的内 存时,就会产生巨大的性能降低。在这样的环境中,就需要限制来自一个进程中的线程在共享同一个插件版的CPU上运行。为了适应这种计算机结构的需要,Windows允许你设置进程和线程的亲缘性。换句话说,你可以控制哪个CPU能够运行某些线程。这称为硬亲缘性。请注意,子进程可以继承进程的亲缘性。注意:(1)无论计算机中实际拥有多少个CPU,Windows98及以前系统只使用一个CPU,上述API不被支持。(2)在大多数环境中,改变线程的亲缘性就会影响调度程序有效地在 各个CPU之间移植线程的能力,而这种能力可以最有效地使用CPU时间。应用场景举例:将UI线程限制在一个CPU,将其他实时性要求较高的线程限制在另一个CPU。这样,当UI需要占用大量CPU时间时,就不会拖累其他实时性要求较高的线程的执行。同样可以将UI线程与一些优先级不高但耗时的异步运算线程设置在不同CPU上,避免UI给人卡顿的感觉。
感谢你的支持,精易有你更精彩
您可以选择打赏方式支持楼主
阅读权限10
在线时间 小时
好,学习一下,感谢!
您可以选择打赏方式支持他
阅读权限90
在线时间 小时
签到天数: 15 天结帖率: (13/13)
.子程序 _按钮4_被单击
SetProcessAffinityMask (-1, 左移 (1, 到整数 (取CPU核心数 ()) - 2))&&' ' -2 我的cpu是&&4核8线程cpu编号0-7&&-2 在任务管理器设置相关性里面 就会显示6号cpu 如果减去1 那就是7号cpu&&NUMBER_OF_PROCESSORS 环境变量是显示你多少核心数
.子程序 取CPU核心数, 文本型, 公开
返回 (读环境变量 (“NUMBER_OF_PROCESSORS”))
.DLL命令 SetProcessAffinityMask, 整数型, , , 公开, 设置CPU亲和性&&进程句柄&&返回CPU号
& & .参数 hProcess, 整数型
& & .参数 hProcess, 整数型
您可以选择打赏方式支持他
阅读权限90
在线时间 小时
签到天数: 15 天结帖率: (13/13)
你说的是 精易模块 里面的命令吗?&&_按钮4_被单击&&SetProcessAffinityMask (-1, 左移 (1, 到整数 (取CPU核心数 ()) - 2)) ' ' -2 我的cpu是 4核8线程cpu编号0-7 -2 在任务管理器设置相关性里面 就会显示6号cpu 如果减去1 那就是7号cpu NUMBER_OF_PROCESSORS 环境变量是显示你多少核心数取CPU核心数文本型√返回 (读环境变量 (“NUMBER_OF_PROCESSORS”)).版本 2
.子程序 _按钮4_被单击
SetProcessAffinityMask (-1, 左移 (1, 到整数 (取CPU核心数 ()) - 2)) ' ' -2 我的cpu是 4核8线程cpu编号0-7 -2 在任务管理器设置相关性里面 就会显示6号cpu 如果减去1 那就是7号cpu NUMBER_OF_PROCESSORS 环境变量是显示你多少核心数
.子程序 取CPU核心数, 文本型, 公开
返回 (读环境变量 (“NUMBER_OF_PROCESSORS”))
.DLL命令 SetProcessAffinityMask, 整数型, , , 公开, 设置CPU亲和性 进程句柄 返回CPU号
.参数 hProcess, 整数型
.参数 hProcess, 整数型
您可以选择打赏方式支持他
阅读权限90
在线时间 小时
签到天数: 15 天结帖率: (13/13)
你说的是 精易模块 里面的命令吗?&&_按钮4_被单击&&SetProcessAffinityMask (-1, 左移 (1, 到整数 (取CPU核心数 ()) - 2)) ' ' -2 我的cpu是 4核8线程cpu编号0-7 -2 在任务管理器设置相关性里面 就会显示6号cpu 如果减去1 那就是7号cpu NUMBER_OF_PROCESSORS 环境变量是显示你多少核心数取CPU核心数文本型√返回 (读环境变量 (“NUMBER_OF_PROCESSORS”)).版本 2
.子程序 _按钮4_被单击
SetProcessAffinityMask (-1, 左移 (1, 到整数 (取CPU核心数 ()) - 2)) ' ' -2 我的cpu是 4核8线程cpu编号0-7 -2 在任务管理器设置相关性里面 就会显示6号cpu 如果减去1 那就是7号cpu NUMBER_OF_PROCESSORS 环境变量是显示你多少核心数
.子程序 取CPU核心数, 文本型, 公开
返回 (读环境变量 (“NUMBER_OF_PROCESSORS”))
.DLL命令 SetProcessAffinityMask, 整数型, , , 公开, 设置CPU亲和性 进程句柄 返回CPU号
.参数 hProcess, 整数型
.参数 hProcess, 整数型
您可以选择打赏方式支持他
阅读权限90
在线时间 小时
签到天数: 15 天结帖率: (13/13)
你说的是 精易模块 里面的命令吗?&&_按钮4_被单击&&SetProcessAffinityMask (-1, 左移 (1, 到整数 (取CPU核心数 ()) - 2)) ' ' -2 我的cpu是 4核8线程cpu编号0-7 -2 在任务管理器设置相关性里面 就会显示6号cpu 如果减去1 那就是7号cpu NUMBER_OF_PROCESSORS 环境变量是显示你多少核心数取CPU核心数文本型√返回 (读环境变量 (“NUMBER_OF_PROCESSORS”))SetProcessAffinityMask整数型√设置CPU亲和性 进程句柄 返回CPU号(未填写库文件名)(未填写命令名)(未填写子程序名)&&&hProcess整数型&&&hProcess整数型&&&.版本 2
.子程序 _按钮4_被单击
SetProcessAffinityMask (-1, 左移 (1, 到整数 (取CPU核心数 ()) - 2)) ' ' -2 我的cpu是 4核8线程cpu编号0-7 -2 在任务管理器设置相关性里面 就会显示6号cpu 如果减去1 那就是7号cpu NUMBER_OF_PROCESSORS 环境变量是显示你多少核心数
.子程序 取CPU核心数, 文本型, 公开
返回 (读环境变量 (“NUMBER_OF_PROCESSORS”))
.DLL命令 SetProcessAffinityMask, 整数型, , , 公开, 设置CPU亲和性 进程句柄 返回CPU号
.参数 hProcess, 整数型
.参数 hProcess, 整数型
您可以选择打赏方式支持他
阅读权限90
在线时间 小时
签到天数: 15 天结帖率: (13/13)
你说的是 精易模块 里面的命令吗?&&_按钮4_被单击&&SetProcessAffinityMask (-1, 左移 (1, 到整数 (取CPU核心数 ()) - 2)) ' ' -2 我的cpu是 4核8线程cpu编号0-7 -2 在任务管理器设置相关性里面 就会显示6号cpu 如果减去1 那就是7号cpu NUMBER_OF_PROCESSORS 环境变量是显示你多少核心数取CPU核心数文本型√返回 (读环境变量 (“NUMBER_OF_PROCESSORS”))SetProcessAffinityMask整数型√设置CPU亲和性 进程句柄 返回CPU号(未填写库文件名)(未填写命令名)(未填写子程序名)&&&hProcess整数型&&&hProcess整数型&&&.版本 2
.子程序 _按钮4_被单击
SetProcessAffinityMask (-1, 左移 (1, 到整数 (取CPU核心数 ()) - 2)) ' ' -2 我的cpu是 4核8线程cpu编号0-7 -2 在任务管理器设置相关性里面 就会显示6号cpu 如果减去1 那就是7号cpu NUMBER_OF_PROCESSORS 环境变量是显示你多少核心数
.子程序 取CPU核心数, 文本型, 公开
返回 (读环境变量 (“NUMBER_OF_PROCESSORS”))
.DLL命令 SetProcessAffinityMask, 整数型, , , 公开, 设置CPU亲和性 进程句柄 返回CPU号
.参数 hProcess, 整数型
.参数 hProcess, 整数型
您可以选择打赏方式支持他
阅读权限90
在线时间 小时
签到天数: 7 天结帖率: (9/9)
精易模块里面没有找到这个命令,建议官方添加进去。
您可以选择打赏方式支持他
阅读权限230
在线时间 小时
你说的是 精易模块 里面的命令吗?
您可以选择打赏方式支持他
精易论坛 - 有你更精彩 /1
投稿截止今晚8点,
优秀作品将奖励永久资源vip
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
揭阳精易科技有限公司申明:我公司所有的培训课程版权归精易所有,任何人以任何方式翻录、盗版、破解本站培训课程,我们必将通过法律途径解决!
公司简介:揭阳市揭东区精易科技有限公司致力于易语言教学培训/易语言学习交流社区的建设与软件开发,多年来为中小企业编写过许许多多各式软件,并把多年积累的开发经验逐步录制成视频课程供学员学习,让学员全面系统化学习易语言编程,少走弯路,减少对相关技术的研究与摸索时间,从而加快了学习进度!
防范网络诈骗,远离网络犯罪
违法和不良信息举报电话,企业QQ: ,邮箱:@
Powered by
粤公网安备 253429人阅读
个人转载(45)
系统资源统计(2)
coolshell最新的文章《性能调优攻略》在“多核CPU调优”章节,提到“我们不能任由操作系统负载均衡,因为我们自己更了解自己的程序,所以,我们可以手动地为其分配CPU核,而不会过多地占用CPU0,或是让我们关键进程和一堆别的进程挤在一起。”。在文章中提到了Linux下的一个工具,taskset,可以设定单个进程运行的CPU。
同时,因为最近在看redis的相关资料,redis作为单进程模型的程序,为了充分利用多核CPU,常常在一台server上会启动多个实例。而为了减少切换的开销,有必要为每个实例指定其所运行的CPU。
下文,将会介绍taskset命令,以及sched_setaffinity系统调用,两者均可以指定进程运行的CPU实例。
taskset是LINUX提供的一个命令(ubuntu系统可能需要自行安装,schedutils package)。他可以让某个程序运行在某个(或)某些CPU上。
以下均以redis-server举例。
1)显示进程运行的CPU
命令taskset -p 21184
显示结果:
pid 21184's current affinity mask: ffffff
注:21184是redis-server运行的pid
& & & 显示结果的ffffff实际上是二进制24个低位均为1的bitmask,每一个1对应于1个CPU,表示该进程在24个CPU上运行
2)指定进程运行在某个特定的CPU上
命令taskset -pc 3 21184
显示结果:
pid 21184's current affinity list: 0-23
pid 21184's new affinity list: 3
注:3表示CPU将只会运行在第4个CPU上(从0开始计数)。
3)进程启动时指定CPU
命令taskset -c 1 ./redis-server ../redis.conf
结合这上边三个例子,再看下taskset的manual,就比较清楚了。
operate on an existing PID and not launch a new task
-c, --cpu-list
specify a numerical list of processors instead of a bitmask. The list may contain multiple items, separated by comma, and ranges. For example, 0,5,7,9-11.
2.sched_setaffinity系统调用
如下文章部分翻译自:
sched_setaffinity可以将某个进程绑定到一个特定的CPU。你比操作系统更了解自己的程序,为了避免调度器愚蠢的调度你的程序,或是为了在多线程程序中避免缓存失效造成的开销,你可能会希望这样做。如下是sched_setaffinity的例子,其函数手册可以参考():
1 /* Short test program to test sched_setaffinity
2 * (which sets the affinity of processes to processors).
3 * Compile: gcc sched_setaffinity_test.c
4 *& & & & & & & -o sched_setaffinity_test -lm
5 * Usage: ./sched_setaffinity_test
7 * Open a &top&-window at the same time and see all the work
8 * being done on CPU 0 first and after a short wait on CPU 1.
9 * Repeat with different numbers to make sure, it is not a
10 * coincidence.
13 #include &stdio.h&
14 #include &math.h&
15 #include &sched.h&
17 double waste_time(long n)
19 & & double res = 0;
20 & & long i = 0;
21 & & while(i &n * 200000) {
22 & & & & i++;
23 & & & & res += sqrt (i);
25 & & return
28 int main(int argc, char **argv)
30 & & unsigned long mask = 1; /* processor 0 */
32 & & /* bind process to processor 0 */
33 & & if (sched_setaffinity(0, sizeof(mask), &mask) &0) {
34 & & & & perror(&sched_setaffinity&);
37 & & /* waste some time so the work is visible with &top& */
38 & & printf (&result: %f\n&, waste_time (2000));
40 & & mask = 2; /* process switches to processor 1 now */
41 & & if (sched_setaffinity(0, sizeof(mask), &mask) &0) {
42 & & & & perror(&sched_setaffinity&);
45 & & /* waste some more time to see the processor switch */
46 & & printf (&result: %f\n&, waste_time (2000));
根据你CPU的快慢,调整waste_time的参数。然后使用top命令,就可以看到进程在不同CPU之间的切换。(启动top命令后按“1”,可以看到各个CPU的情况)。
父进程和子进程之间会继承对affinity的设置。因此,大胆猜测,taskset实际上是首先执行了sched_setaffinity系统调用,然后fork+exec用户指定的进程。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:577305次
积分:5330
积分:5330
排名:第4308名
原创:146篇
转载:82篇
评论:45条
(3)(2)(2)(10)(3)(7)(12)(6)(3)(13)(3)(13)(10)(16)(8)(10)(10)(2)(2)(1)(1)(4)(16)(3)(2)(3)(7)(4)(5)(3)(5)(4)(7)(18)(12)如何让进程运行在指定的CPU
我的图书馆
如何让进程运行在指定的CPU
可任意转载,但必须在醒目位置以超链接形式标明文章原始出处和作者信息
原文地址:
我的十分繁忙,在跑一些密集操作数据库的Rake任务时尤其如此。但我观察发现,Linode服务器的4核CPU,只有第1个核心(CPU#0)非常忙,其他都处于idle状态。
不了解Linux是如何调度的,但在Linode的这种状态下,显然有优化的余地。除了处理正常任务,CPU#0还需要处理各种中断。因此,若能将CPU#0分担的任务摊派到其他CPU核心上,可以预见,系统的处理能力将有更大的提升。
SMP (Symmetrical Multi-Processing):指在一个计算机上汇集了一组处理器(多CPU),各CPU之间共享内存子系统以及总线结构。 []
CPU affinity:中文唤作“CPU亲和力”,是指在CMP架构下,能够将一个或多个进程绑定到一个或多个处理器上运行。[]
一、在Linux上修改进程的“CPU亲和力”
在Linux上,可以通过 命令进行修改。以Ubuntu为例,运行如下命令可以安装taskset工具。
# apt-get install schedutils
对运行中的进程,文档上说可以用下面的命令,把CPU#1 #2 #3分配给PID为2345的进程:
# taskset -cp 1,2,3 2345
但我尝试没奏效,于是我关掉了MySQL,并用taskset将它启动:
# taskset -c 1,2,3 /etc/init.d/mysql start
对于其他进程,也可如此处理(nginx除外,详见下文)。之后用top查看CPU的使用情况,原来空闲的#1 #2 #3,已经在辛勤工作了。
二、配置nginx绑定CPU
刚才说nginx除外,是因为nginx提供了更精确的控制。
在conf/nginx.conf中,有如下一行:
worker_processes& 1;
这是用来配置nginx启动几个工作进程的,默认为1。而nginx还支持一个名为worker_cpu_affinity的配置项,也就是说,nginx可以为每个工作进程绑定CPU。我做了如下配置:
worker_processes& 3;
worker_cpu_affinity 00;
这里00是掩码,分别代表第2、3、4颗cpu核心。
重启nginx后,3个工作进程就可以各自用各自的CPU了。
三、刨根问底
如果自己写代码,要把进程绑定到CPU,该怎么做?可以用函数。在Linux上,这会触发一次。
如果父进程设置了affinity,之后其创建的子进程是否会有同样的属性?我发现子进程确实继承了父进程的affinity属性(其实用taskset启动进程就是一次fork+exec)。
四、Windows?
在Windows上修改“CPU亲和力”,可以通过任务管理器搞定。
* 个人感觉,Windows系统中翻译的“处理器关系”比“CPU亲和力”容易理解点儿
—————–
进行了这样的修改后,即使系统负载达到3以上,不带缓存打开blogkid.net首页(有40多次查询)依然顺畅;以前一旦负载超过了1.5,响应就很慢了。效果很明显。
TA的最新馆藏[转]&新手园地& & & 硬件问题Linux系统管理Linux网络问题Linux环境编程Linux桌面系统国产LinuxBSD& & & BSD文档中心AIX& & & 新手入门& & & AIX文档中心& & & 资源下载& & & Power高级应用& & & IBM存储AS400Solaris& & & Solaris文档中心HP-UX& & & HP文档中心SCO UNIX& & & SCO文档中心互操作专区IRIXTru64 UNIXMac OS X门户网站运维集群和高可用服务器应用监控和防护虚拟化技术架构设计行业应用和管理服务器及硬件技术& & & 服务器资源下载云计算& & & 云计算文档中心& & & 云计算业界& & & 云计算资源下载存储备份& & & 存储文档中心& & & 存储业界& & & 存储资源下载& & & Symantec技术交流区安全技术网络技术& & & 网络技术文档中心C/C++& & & GUI编程& & & Functional编程内核源码& & & 内核问题移动开发& & & 移动开发技术资料ShellPerlJava& & & Java文档中心PHP& & & php文档中心Python& & & Python文档中心RubyCPU与编译器嵌入式开发驱动开发Web开发VoIP开发技术MySQL& & & MySQL文档中心SybaseOraclePostgreSQLDB2Informix数据仓库与数据挖掘NoSQL技术IT业界新闻与评论IT职业生涯& & & 猎头招聘IT图书与评论& & & CU技术图书大系& & & Linux书友会二手交易下载共享Linux文档专区IT培训与认证& & & 培训交流& & & 认证培训清茶斋投资理财运动地带快乐数码摄影& & & 摄影器材& & & 摄影比赛专区IT爱车族旅游天下站务交流版主会议室博客SNS站务交流区CU活动专区& & & Power活动专区& & & 拍卖交流区频道交流区
白手起家, 积分 12, 距离下一级还需 188 积分
论坛徽章:0
我用的是onyx2,四个cpu的。比如现在有四个进程,想让每个进程对应一个cpu,也就是说四个cpu每个运行一个进程,同时工作。有无办法实现。
&&nbsp|&&nbsp&&nbsp|&&nbsp&&nbsp|&&nbsp&&nbsp|&&nbsp
稍有积蓄, 积分 423, 距离下一级还需 77 积分
论坛徽章:0
高手指教:如何将一个进程指定到特定的CPU上运行
这是并行计算的问题,恰好是sgi的强项。并行我一点都不懂啊。去水木清华看看吧
白手起家, 积分 12, 距离下一级还需 188 积分
论坛徽章:0
高手指教:如何将一个进程指定到特定的CPU上运行
呵呵,谢谢了
,不过现在bbs都封外校,上不了水木啊。
白手起家, 积分 11, 距离下一级还需 189 积分
论坛徽章:0
高手指教:如何将一个进程指定到特定的CPU上运行
#miser_cpuset&&-q username -c -f conf_filename
%miser_cpuset -q username -A progname
白手起家, 积分 12, 距离下一级还需 188 积分
论坛徽章:0
高手指教:如何将一个进程指定到特定的CPU上运行
高人啊!呵呵,好几天没有上来看了,以为不会有人回帖了。
能不能留下你的qq号?我的是:3504480,希望能跟你多交流一下。多谢了 :wink:
白手起家, 积分 12, 距离下一级还需 188 积分
论坛徽章:0
高手指教:如何将一个进程指定到特定的CPU上运行
ncat你好,你说的是在Irix系统里的用法么,是不是直接在shell里面输入就可以了,为什么我输入以后提示:miser_cpuset command not found?
白手起家, 积分 20, 距离下一级还需 180 积分
论坛徽章:0
高手指教:如何将一个进程指定到特定的CPU上运行
他说的是你要先建立一个CPUSET
#miser_cpuset&&-q username -c -f conf_filename (建立一个CPUSET)
%miser_cpuset -q username -A progname (将一个程序指定给特定的CPUSET)
北京皓辰网域网络信息技术有限公司. 版权所有 京ICP证:060528号 北京市公安局海淀分局网监中心备案编号:
广播电视节目制作经营许可证(京) 字第1234号
中国互联网协会会员&&联系我们:
感谢所有关心和支持过ChinaUnix的朋友们
转载本站内容请注明原作者名及出处

我要回帖

更多关于 进程指定cpu 的文章

 

随机推荐