导航:首页 > 操作系统 > linux进程绑定cpu

linux进程绑定cpu

发布时间:2022-09-27 03:37:27

linux下怎么解除中断和cpu绑定

在多 CPU 的环境中,还有一个中断平衡的问题,比如,网卡中断会教给哪个 CPU 处理,这个参数控制哪些 CPU 可以绑定 IRQ 中断。其中的 {number} 是对应设备的中断编号,可以用下面的命令找出: cat /proc/interrupt 比如,一般 eth0 的 IRQ

㈡ linux 单进程 跨多cpu

每个进程可以创建N个线程

㈢ 如何在Ubuntu中绑定CPU进程

现在科技在不断发展现在多CPU的趋势越来越大了. 有时候为了更好地操作机器, 需要将某个进程绑定到具体的CPU上去。大家可能不能理解将进程绑定到CPU中运行是什么意思,简单的说就是进程/线程与cpu绑定,最直观的好处就是提高了cpu cache的命中率,从而减少内存访问损耗,提高程序的速度,将普通进程变成核心进程。下面小编就像大家介绍在Ubuntu中怎么绑定CPU进程,Ubuntu(乌班图)是一个以桌面应用为主的Linux操作系统,和小编一起学习吧。

在Ubuntu中绑定CPU进程的方法

taskset -cp 《CPU ID | CPU IDs》 《Process ID》

下面用一个简单的例子来说明怎样做到。

1. CPU利用率达100%的样例代码:

class Test {

public static void main(String args[]) {

int i = 0;

while (true) {

i++;

}

}

}

2. 编译并运行上面的样例代码

# javac Test.java

# java Test &

[1] 26531

3. 使用htop命令查看CPU的利用率

如果未安装htop工具,执行下面的命令:

# apt-get install htop

Reading package lists... Done

Building dependency tree

Reading state information... Done

The following NEW packages will be installed:

htop

0 upgraded, 1 newly installed, 0 to remove and 41 not upgraded.

Need to get 66.9 kB of archives.

After this operation, 183 kB of additional disk space will be used.

Get:1 http://mirrors.163.com/ubuntu/ precise/universe htop amd64 1.0.1-1 [66.9 kB]

Fetched 66.9 kB in 0s (163 kB/s)

Selecting previously unselected package htop.

(Reading database ... 57100 files and directories currently installed.)

Unpacking htop (from .../htop_1.0.1-1_amd64.deb)...

Processing triggers for man-db ...

Setting up htop (1.0.1-1)...

安装完成后,执行命令:

# htop

上面的视图可以看到,CPU2的利用率达到100%,且这个进程有可能被分配到其它CPU核上运行,这个分配是不定的。

4. 进程绑定CPU核

运行以下命令,把此Java进程(进程ID号为26502)永久的分配给5号CPU核(CPU核号从0开始计算,因此序号4指的是5号CPU核)

# taskset -cp 5 26531

pid 26531‘s current affinity list: 0-7

pid 26531’s new affinity list: 5

从上面的视图中可以看到6号CPU核的利用率为100%。

随着CPU核的多个化,这样的绑定方法也是一样的,无论绑定哪个CPU核都能启动同样的效果,相信大家都追求运行的高速度,赶快来学习绑定CPU进程的方法吧!

㈣ linux下把进程/线程绑定到特定cpu核上运行

你那个是系统下把CPU的核说钉在五河以下是比较好的,因为吧和内心压力非常大,发热量非常大。

㈤ Linux 如何绑定指定线程在某个固定CPU上

大概的介绍一下Linux 的指定CPU运行,包括进程和线程。linux下的top命令是可以查看当前的cpu的运行状态,按1可以查看系统有多少个CPU,以及每个CPU的运行状态。
可是如何查看线程的CPU呢?top
-Hp pid,pid就是你当前程序的进程号,如果是多线程的话,是可以查看进程内所有线程的CPU和内存使用情况。

pstree可以查看主次线程,同样的pstree -p pid。可以查看进程的线程情况。

taskset这个其实才是重点,可以查看以及设置当前进程或线程运行的CPU(设置亲和力)。

taskset -pc pid,查看当前进程的cpu,当然有的时候不只是一个,taskset -pc cpu_num pid ,cpu_num就是设置的cpu。

这样的话基本的命令和操作其实大家都知道了,接下来就是在代码中完成这些操作,并通过命令去验证代码的成功率。

进程制定CPU运行:

[cpp] view plain
#include<stdlib.h>
#include<stdio.h>
#include<sys/types.h>
#include<sys/sysinfo.h>
#include<unistd.h>
#define __USE_GNU
#include<sched.h>
#include<ctype.h>
#include<string.h>

int main(int argc, char* argv[])
{
//sysconf获取有几个CPU
int num = sysconf(_SC_NPROCESSORS_CONF);
int created_thread = 0;
int myid;
int i;
int j = 0;

//原理其实很简单,就是通过cpu_set_t进行位与操作
cpu_set_t mask;
cpu_set_t get;

if (argc != 2)
{
printf("usage : ./cpu num\n");
exit(1);
}

myid = atoi(argv[1]);

printf("system has %i processor(s). \n", num);

//先进行清空,然后设置掩码
CPU_ZERO(&mask);
CPU_SET(myid, &mask);

//设置进程的亲和力
if (sched_setaffinity(0, sizeof(mask), &mask) == -1)
{
printf("warning: could not set CPU affinity, continuing...\n");
}
while (1)
{

CPU_ZERO(&get);
//获取当前进程的亲和力
if (sched_getaffinity(0, sizeof(get), &get) == -1)
{
printf("warning: cound not get cpu affinity, continuing...\n");
}
for (i = 0; i < num; i++)
{
if (CPU_ISSET(i, &get))
{
printf("this process %d is running processor : %d\n",getpid(), i);
}
}
}
return 0;
}

进程设置CPU运行,其实只能是单线程。多线程设定CPU如下:

[cpp] view plain
#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <pthread.h>
#include <sched.h>

void *myfun(void *arg)
{
cpu_set_t mask;
cpu_set_t get;
char buf[256];
int i;
int j;
//同样的先去获取CPU的个数
int num = sysconf(_SC_NPROCESSORS_CONF);
printf("system has %d processor(s)\n", num);

for (i = 0; i < num; i++) {
CPU_ZERO(&mask);
CPU_SET(i, &mask);
//这个其实和设置进程的亲和力基本是一样的
if (pthread_setaffinity_np(pthread_self(), sizeof(mask), &mask) < 0) {
fprintf(stderr, "set thread affinity failed\n");
}
CPU_ZERO(&get);
if (pthread_getaffinity_np(pthread_self(), sizeof(get), &get) < 0) {
fprintf(stderr, "get thread affinity failed\n");
}
for (j = 0; j < num; j++)
{
if (CPU_ISSET(j, &get))
{
printf("thread %d is running in processor %d\n", (int)pthread_self(), j);
}
}
j = 0;
while (j++ < 100000000) {
memset(buf, 0, sizeof(buf));
}
}
pthread_exit(NULL);
}

int main(int argc, char *argv[])
{
pthread_t tid;
if (pthread_create(&tid, NULL, (void *)myfun, NULL) != 0)
{
fprintf(stderr, "thread create failed\n");
return -1;
}
pthread_join(tid, NULL);
return 0;
}

㈥ linux下cpu的核绑定和隔离有什么不同

额 刚刚编辑完,结果没保存,然后·····只能重新总结一份。
我这个是在启动虚拟机之后,在虚拟机中跑DPDK,测试结果很不理想,然后我的领导说可以做CPU的隔离核绑定,然后做了之后发现确实效果有所提升。所以写一下小结。仅供大家参考。

1、首先创建隔离核,在系统启动的时候在INTEL_IOMMU=OFF那一行最后添加上isolcpus=2,3,4,5,6 隔离出5个核
2、系统启动,检查host上是否隔离成功,命令如下:
# ps –eLo ruser,pid,ppid,lwp,psr,args | awk ‘{if($5==1) print $0}’
# ps –eLo ruser,pid,ppid,lwp,psr,args | awk ‘{if($5==2) print $0}’
# ps –eLo ruser,pid,ppid,lwp,psr,args | awk ‘{if($5==3) print $0}’
# ps –eLo ruser,pid,ppid,lwp,psr,args | awk ‘{if($5==4) print $0}’通过查看线程确定是否隔离,如果隔离成功,则只有几个线程。
3、启动虚拟机之后,查看qemu的线程
# ps –eLo ruser,pid,ppid,lwp,psr,args | grep qemu | grep –v grep
4、绑定qemu的进程,绑定核
# taskset –p 0x4 28423
# taskset –p 0x8 28424
5、查看QEMU绑定是否生效
# ps –eLo ruser,pid,ppid,lwp,psr,args | grep qemu | grep –v grep
6、查看cpu2/3/4/5上运行的线程
# ps –eLo ruser,pid,ppid,lwp,psr,args | awk ‘{if($5==2) print $0}’

没什么技术含量,仅供大家参考。

㈦ 如何指定CPU只运行特定任务,linux中断interrupt

cpuset 允许把所有进程echo到一个cpuset目录中,与指定的cpu绑定。

The following script which is a starting point for investigating willmove all the processes to a specific cpuset with one cpu.


if[!-d/sys/fs/cgroup];then
echo"cgroupnotsupportedbythekernel"
else
mkdir/sys/fs/cgroup/cpuset
mount-tcgroup-ocpusetcpuset/sys/fs/cgroup/cpuset
echo1>/sys/fs/cgroup/cpuset/cgroup.clone_children
mkdir/sys/fs/cgroup/cpuset/cpu0
mkdir/sys/fs/cgroup/cpuset/cpu1

#assignacpuforcgroupcpu0
echo0>/sys/fs/cgroup/cpuset/cpu0/cpuset.cpus

#moveoutselftothisnewcgroup
echo$$>/sys/fs/cgroup/cpuset/cpu0/tasks
foriin$(cat/sys/fs/cgroup/cpuset/tasks);do
echo$i>/sys/fs/cgroup/cpuset/cpu0/tasks||echo"failedtoaddpid$i/$(cat/proc/$i/comm)"
done

#assignacpuforcgroupcpu1
echo1>/sys/fs/cgroup/cpuset/cpu1/cpuset.cpus

#
#totheothercgroupwon'tuseit
echo1>/sys/fs/cgroup/cpuset/cpu1/cpuset.cpu_exclusive
fi

把系统中的进程与CPU0绑定,然后把CPU1设置 exclusive属性,这样其它cgroup不会使用这个CPU。

开启stress压力测试


在此基础上再开启一个CPUhot:

可见新启动的任务不会占用CPU1。

将CPUhot进程与 CPU1绑定:

此时观察CPU使用率:

另外还有一个问题就是怎样禁止一个中断打断cpu?

内核提供了中断的affinity,但要使用这个还需要关闭 irq balancer 进程。

如下脚本可以设置中断的cpu affinity。


for i in $(find /proc/irq -name "smp_affinity"); do echo 1 > $i; done

以上脚本把所有中断的CPU Affinity都设置为CPU0。

这样在/proc/irq目录下的每一个中断其CPU Affinity都被设置为CPU0。

此时仍有一系列的中断会打断CPU1:

Single function call interrupts

Local timer interrupts

另外要让中断的CPU Affinity起作用,irq balance 服务必须被关闭。但这样中断负载平衡就被打断,能不能修改irq balance 代码,让其在规定的若干个CPU核心上负责中断平衡

㈧ linux查看中断绑定在哪个cpu

cpuset 允许把所有进程echo到一个cpuset目录中,与指定的cpu绑定。 The following script which is a starting point for investigating willmove all the processes to a specific cpuset with one cpu. if [ ! -d /sys/fs/cgroup ]; then echo...

㈨ 如何指定CPU只运行特定任务,linux中断interrupt

cpuset 允许把所有进程echo到一个cpuset目录中,与指定的cpu绑定。
The following script which is a starting point for investigating willmove all the processes to a specific cpuset with one cpu.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

if [ ! -d /sys/fs/cgroup ]; then
echo "cgroup not supported by the kernel"
else
mkdir /sys/fs/cgroup/cpuset
mount -t cgroup -ocpuset cpuset /sys/fs/cgroup/cpuset
echo 1 > /sys/fs/cgroup/cpuset/cgroup.clone_children
mkdir /sys/fs/cgroup/cpuset/cpu0
mkdir /sys/fs/cgroup/cpuset/cpu1

# assign a cpu for cgroup cpu0
echo 0 > /sys/fs/cgroup/cpuset/cpu0/cpuset.cpus

# move outself to this new cgroup
echo $$ > /sys/fs/cgroup/cpuset/cpu0/tasks
for i in $(cat /sys/fs/cgroup/cpuset/tasks); do
echo $i > /sys/fs/cgroup/cpuset/cpu0/tasks || echo "failed to add pid $i/$(cat /proc/$i/comm)"
done

# assign a cpu for cgroup cpu1
echo 1 > /sys/fs/cgroup/cpuset/cpu1/cpuset.cpus

# make cpu1 exclusive so processes belonging
# to the other cgroup won't use it
echo 1 > /sys/fs/cgroup/cpuset/cpu1/cpuset.cpu_exclusive
fi

把系统中的进程与CPU0绑定,然后把CPU1设置 exclusive属性,这样其它cgroup不会使用这个CPU。
开启stress压力测试

在此基础上再开启一个CPUhot:
可见新启动的任务不会占用CPU1。
将CPUhot进程与 CPU1绑定:
此时观察CPU使用率:
另外还有一个问题就是怎样禁止一个中断打断cpu?
内核提供了中断的affinity,但要使用这个还需要关闭 irq balancer 进程。
如下脚本可以设置中断的cpu affinity。

for i in $(find /proc/irq -name "smp_affinity"); do echo 1 > $i; done
以上脚本把所有中断的CPU Affinity都设置为CPU0。
这样在/proc/irq目录下的每一个中断其CPU Affinity都被设置为CPU0。
此时仍有一系列的中断会打断CPU1:
Single function call interrupts
Local timer interrupts

另外要让中断的CPU Affinity起作用,irq balance 服务必须被关闭。但这样中断负载平衡就被打断,能不能修改irq balance 代码,让其在规定的若干个CPU核心上负责中断平衡

㈩ 如何将一个进程(线程)绑定到一个固定的CPU

第一种:linux的shell命令行方式,命令名字为taskset。第二种就是代码实现级别的了,pthread_setaffinity_np和sched_setaffinity函数接口。
第一种方式我已经验证过了,确实可行。同时验证了我心中的疑问:如果将某个线程绑定到某个物理核上之后,在此线程运行结束前,会不会有别的线程被调度到此物理核上执行? 写了一个死循环验证了下,发现绑定之后是不会调度别的线程在此核上运行的!(肉眼观察的,时不时观察下,没发现别的线程在此核上执行;对比了下没有绑定的情况,会发现过段时间此线程就会被调度到别的核心上执行)
此种方式有个问题,就是只有线程运行起来后才会被绑定到某个核上,不够及时。
具体的方式为:
1.首先根据系统的差别运行如下安装命令:
sudo apt-get install util-linux (Debian,Ubuntu or Linux Mint)
sudo yum install util-linux (Fedora,CentOS or RHEL)
2.相关命令的使用:
2.1 使用命令 taskset -p <PID> 来获得此Process的 CPU affinity。
eg: taskset -p 2915 ------> pid 2915's current affinity mask:ff; ff=="1111 1111",没一个1代表一个核,共8个核,能用的核数也为8个核。
2.2 使用命令 taskset -cp <PID> 可获得数字形式的CPU affinity。
eg: taskset -cp 2915 ------> pid 2915's current affinity list: 0--7。
接下来为将进程pin到某个核上的命令;
2.3 taskset -p <COREMASK> <PID>
eg:taskset -p 0x11 9030 ------>pid 9030's current affinity mask: ff , pid 9030's new affinity mask: 11 。意思就是将此进程绑定到了CPU core 0 and 4。
2.4 taskset -cp <CORE-LIST> <PID>
eg:taskset -cp 0,4 9030 ------>the same as below.
With "-c" option, you can specify a list of numeric CPU core IDs separated by commas, or even include ranges (e.g., 0,2,5,6-10).

2.5 taskset <COREMASK> <EXECUTABLE>
eg: taskset 0x1 xxxx ----->"xxxx" represented the name of one program.
另外:参考文章最后的位置说到,绑定到此物理核之后,别的进程(线程)还可以调度到此核上执行,但是没说绑定的这个线程没执行完之前是否会被别的线程挤掉。根据我的观察是不会被挤掉,这我在文章的开头也有提到。

阅读全文

与linux进程绑定cpu相关的资料

热点内容
python字符串转string 浏览:357
在电影院不要说话用英语怎么说 浏览:807
重生香江开银行建立财团的小说 浏览:128
已上传到服务器什么意思 浏览:449
R命令dim 浏览:653
苹果ipad编程软件 浏览:282
javaodbcaccess 浏览:769
云服务器怎么对接 浏览:417
股票分时图源码 浏览:912
如何查询红帽服务器的日志文件 浏览:200
bcb开发51单片机 浏览:763
程序员男士图片 浏览:708
如何把pdf文件拆分 浏览:749
法国LOVE爱恋完整版观看 浏览:388
python自动安装程序 浏览:253
为什么有压缩分卷才能继续解压 浏览:316
AnalDelinquent 浏览:889
同人绿帽改编 浏览:625
生病的男人也要去找电影 浏览:566
邵氏全部电影 浏览:281