如何设置进程在linux查看指定进程的CPU上运行

&>&&>&&>&&>&设置Python进程运行于固定CPU代码
设置Python进程运行于固定CPU代码
上传大小:2KB
Python的线程在多核情况下,由于GIL的存在,运行效率会比单核情况下还低,这个时候,可以通过设置运行Python代码的进程所在的CPU以提高线程的性能,达到和单核处理器时一致的性能。该代码从
https://pypi.python.org/pypi/affinity/0.1.0
修改而来,去掉了原代码中对pywin32的依赖。
综合评分:0(0位用户评分)
所需积分:0
下载次数:33
审核通过送C币
创建者:qq_
创建者:qq_
创建者:zhuxunyuoyi
课程推荐相关知识库
上传者其他资源上传者专辑
开发技术热门标签
VIP会员动态
您因违反CSDN下载频道规则而被锁定帐户,如有疑问,请联络:!
android服务器底层网络模块的设计方法
所需积分:0
剩余积分:720
您当前C币:0
可兑换下载积分:0
兑换下载分:
兑换失败,您当前C币不够,请先充值C币
消耗C币:0
你当前的下载分为234。
设置Python进程运行于固定CPU代码
会员到期时间:剩余下载次数:
你还不是VIP会员
开通VIP会员权限,免积分下载
你下载资源过于频繁,请输入验证码
您因违反CSDN下载频道规则而被锁定帐户,如有疑问,请联络:!
若举报审核通过,可奖励20下载分
被举报人:
举报的资源分:
请选择类型
资源无法下载
资源无法使用
标题与实际内容不符
含有危害国家安全内容
含有反动色情等内容
含广告内容
版权问题,侵犯个人或公司的版权
*详细原因:C/C++(57)
进程与指定cpu绑定:SetProcessAffinityMask(GetCurrentProcess(),&dwMask);
线程与指定cpu绑定:SetThreadAffinityMask(GetCurrentThread(),dwMask);
dwMask为CPU序号的或运算值:1(0001)代表只运行在CPU1,2(0010)代表只运行在CPU2,3(0011)代表可以运行在CPU1和CPU2,以此类推。
设置之前最好判断一下系统有几个CPU:
SYSTEM_INFO&SystemI
GetSystemInfo(&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给人卡顿的感觉。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:481053次
积分:4943
积分:4943
排名:第5538名
原创:54篇
转载:103篇
评论:127条
(2)(3)(2)(1)(2)(1)(2)(2)(4)(1)(1)(2)(1)(3)(6)(3)(1)(1)(2)(1)(2)(1)(2)(1)(1)(1)(1)(1)(3)(5)(1)(1)(10)(6)(4)(1)(1)(3)(1)(1)(4)(1)(4)(1)(2)(1)(1)(1)(1)(2)(1)(1)(1)(5)(26)(4)(13)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-23pid 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用户指定的进程。
阅读(...) 评论()2010年 总版技术专家分年内排行榜第一2009年 总版技术专家分年内排行榜第一
2011年 总版技术专家分年内排行榜第二
本帖子已过去太久远了,不再提供回复功能。}

我要回帖

更多关于 易语言结束指定进程 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信