Linux如何将进程绑定运行在指定CPU上

Linux如何将进程绑定运行在指定CPU上,第1张

绑定cpu方式:

c语言:

sched_setaffinity(0, sizeof(mask), &mask)

shell命令:

在grup启动时传给亮春内核参数: isolcpus=2-15, 这里表示隔离第3到16个CPU, Linux程序只跑在第一和第二个CPU上, 空闲的CPU我们可以指定跑进程了.

这是内核文档里对内核参数的解释:

isolcpus= [KNL,SMP] Isolate CPUs from the general scheduler.

Format:

<cpu number>,...,<cpu number>

or

<cpu number>-<cpu number>

(must be a positive range in ascending order)

or a mixture

<cpu number>,...,<cpu number>-<cpu number>

This option can be used to specify one or more CPUs

to isolate from the general SMP balancing and scheduling

algorithms. You can move a process onto or off an

"isolated" CPU via the CPU affinity syscalls or cpuset.

<cpu number>begins at 0 and the maximum value is

"number of CPUs in system - 1".

This option is the preferred way to isolate CPUs. The

alternative -- manually setting the CPU mask of all

tasks in the system -- can cause problems and

suboptimal load balancer performance.

linux nice 命令详解

功能说明:设置优先权

语法:nice [-n <优先等级>][--help][--version][执行指令]

补充说明:nice指令可以改变程序执行的拍侍优先权等级。

参数:-n<优先等级>或-<优先等级>或--adjustment=<优先等级> 设置欲执行的指令的敬贺耐优先权等级。等级的范围从-20-19,其中-20最高,19最低,只有系统管理者可以设置负数的等级。

--help  在线帮助。

   --version  显示版本信息。

linux renice 命令详解

功能说明:调整优先权。

语法:renice [优先等级][-g <程序群组名称>...][-p <程序识别码>...][-u <用户名称>...]

补充说明:renice指令可重新调整程序执行的优先权等级。预设是以程序识别码指定程序调整其优先权,您亦可以指定程序群组或用户名称调整优先权等级,并修改所有隶属于该程序群组或用户的程序的优先权。等级范围从-20--19,只有系统管理者可以改变其他用户程序的优先权,也仅有系统管理者可以设置负数等级。

参数:

-g <程序群组名称> 使用程序群组名称,修改所有隶属于该程序群组的程序的优先权。

-p <程序识别码> 改变该程序的优先权等级,此参数为预设值。

-u <用户名称> 指定用户名称,修改所有隶属于该用户的程序的优先权。

taskset设定cpu亲和力,cpu亲和力是指

CPU调度程序属性关联性是“锁定”一个进程,使他只能在一个或几个cpu线程上运行。对于一个给定的系统上设置的cpu。给定CPU亲和力和进程不会运行在任何其他CPU。注意,Linux调度器还支持自然CPU关联:(不能让这个cpu只为这一个进程服务)

这里要注意的是我们可以把某个程序限定在某一些CPU上运行,但这并不意味着该程序可以独占这些CPU,其实其他程序还是可以利用这些CPU运行。如果要精确控制CPU,taskset就略嫌不足,cpuset才是可以

-a, --all-tasks *** 作所有的任务线程-p, --pid *** 作已存在的pid-c, --cpu-list 通过列表显示方式设置CPU

(1)指定1和2号cpu运行25718线程的程序

taskset -cp 1,2 25718

(2),让某程序运行在指定的cpu上 taskset -c 1,2,4-7 tar jcf test.tar.gz test

(3)指定在1号CPU上后台执行指定的perl程序

taskset –c 1 nohup perl pi.pl &

背景:为什么要进程绑定到指定的CPU上?

1) 减少CPU切换开销

CPU固定绑定到主机的指定CPU上,在整个运行期间,不会发生CPU浮动, 减少CPU切换开销 ,提高虚拟机的计算性能。

2) 提供CPU cache的命中率

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

taskset:设置或检索进程的CPU相关性

1) 如果没有taskset命令, 安装 包含taskset命令的util-linux工具集:yum install util-linux

2) 查看进程的CPU亲和力 ,-p选项是一个十六进制数,-cp选项是一个cpu列表,表示相应的cpu核。3的颂肆二进制形式是0011,相应的第0位和第1位都是1,表示14795进程只能运行在cpu的第0个核和第1个核。

$ taskset -p 14795

pid 14795's current affinity mask: 3

$ taskset -cp 14795

pid 14795's current affinity list: 0,1

3) 绑定CPU : taskset -cp <CPU IDs>  <Process ID>

$ taskset -cp  0  14795

pid 14795's current affinity list: 0,1

pid 14795's new affinity list: 0

OpenStack K版本引入了许多CPU高级特性功能,不仅支持自定义CPU拓扑功能,支持设置虚拟机CPU的socket、core、threads等,还支持CPU pinning功能,即CPU核绑定,甚至能够配置虚拟机独占物理CPU,虚拟机的vCPU能够固定绑定到物理宿主机的指定pCPU上,在整个运行期间,不会发生CPU浮动,减少CPU切换开销,提高虚拟机的计算性能。

$ lscpu

Architecture:          x86_64

CPU op-mode(s):        32-bit, 64-bit

Byte Order:            Little Endian

CPU(s):                40

On-line CPU(s) list:  0-39

Thread(s) per core:    2

Core(s) per socket:    10

Socket(s):            2

NUMA node(s):          2

Vendor ID:            GenuineIntel

CPU family:            6

Model:                63

Model name:            Intel(R) Xeon(R) CPU E5-2650 v3 @ 2.30GHz

Stepping:              2

CPU MHz:              1201.480

BogoMIPS:              4603.87

Virtualization:        VT-x

L1d cache:            32K

L1i cache:            32K

L2 cache:              256K

L3 cache:              25600K

NUMA node0 CPU(s):    0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38

NUMA node1 CPU(s):    1,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31,33,35,37,39

以上可知,该宿主机有两个CPU(socket),每个CPU 10核(core),每个核可以开启两个 超线程(thread) ,即有40个逻辑CPU。宿主机CPU包含两个NUMA node,其中node0包括0,2,4,...,38,node1包括1,3,5,...,39。

步骤1) 创建支持绑核的主机集合

不是所有的计算节点都支持CPU绑核特性,可以通过主机集合(host aggregate)把支持绑核CPU的主机放到一个集合中。

步骤2)  创建支持绑核的flavor

目前Nova并不支持启动时直接指定主机集合的metadata(hint只支持指定server group),需要通过flavor的扩展属性和主机集合的metadata匹配,将不匹配的主机滤掉,部署到匹配的主机上。flavor支持配置虚拟机的CPU拓扑、QoS、CPU pinning策略、NUMA拓扑以及PCI passthrough等扩展属性。

步骤3) 通过步骤2) 的Flavor创建虚拟机,创建完成到虚机所在物理机上查看虚机绑核情况:

查询方法1) virsh dumpxml 虚机id

<vcpu placement='static'>8</vcpu>

<cputune>

<vcpupin vcpu='0' cpuset='25'/>

<vcpupin vcpu='1' cpuset='5'/>

<vcpupin vcpu='2' cpuset='8'/>

<vcpupin vcpu='3' cpuset='28'/>

<vcpupin vcpu='4' cpuset='9'/>

<vcpupin vcpu='5' cpuset='29'/>

<vcpupin vcpu='6' cpuset='24'/>

<vcpupin vcpu='7' cpuset='4'/>

<emulatorpin cpuset='4-5,8-9,24-25,28-29'/>

</cputune>

查询方法2) 在虚拟机所运行的物理宿主机上执行virsh list找到相应虚机的实例id,然后virsh vcpupin 实例id可以查到该虚拟机所占用的CPU具体核数。

# virsh vcpupin vm46  绑核的虚机

VCPU: CPU Affinity

----------------------------------

  0: 25

  1: 5

  2: 8

  3: 28

  4: 9

  5: 29

  6: 24

  7: 4

# virsh vcpupin vm6 未绑核的虚机

VCPU: CPU Affinity

----------------------------------

  0: 0-39 

  1: 0-39

  2: 0-39 

  3: 0-39

  4: 0-39 

  5: 0-39

  6: 0-39 

  7: 0-39

virsh vcpupin 子命令是KVM自带的指令工具,它可以把vm实例的每个vcpu与宿主机的cpu对应绑定,这种绑定方式粒度更小。

# virsh vcpupin vm4 查看绑定情况

VCPU: CPU Affinity

----------------------------------

  0: 0-23     

  1: 0-23

#默认2个vcpu没有进行绑定,可以在0-23号cpu上切换

# virsh vcpuinfo vm4 查看CPU使用时长

VCPU:          0

CPU:            10  #运行在10号cpu上

State:          running

CPU time:      14.2s

CPU Affinity:  yyyyyyyyyyyyyyyyyyyyyyyy

VCPU:          1

CPU:            8      #运行在8号cpu上

State:          running

CPU time:      6.8s

CPU Affinity:  yyyyyyyyyyyyyyyyyyyyyyyy

# virsh vcpupin vm4 0 3 绑定虚机的第1个CPU到宿主机的第4号cpu上

# virsh vcpupin vm4 1 5 绑定虚机的第2个CPU到宿主机的第6号cpu上

# virsh vcpuinfo vm4

VCPU:          0

CPU:            3

State:          running

CPU time:      14.5s

CPU Affinity:  ---y--------------------

VCPU:          1

CPU:            5

State:          running

CPU time:      7.3s

CPU Affinity:  -----y------------------

# virsh vcpupin vm4

VCPU: CPU Affinity

----------------------------------

  0: 3

  1: 5

三种方法的相同点:都能实现绑核效果

优劣势对比:openstack支持虚机重生虚拟迁移到其他物理主机上,第1种方法在这些 *** 作后绑核还是有效的,但2和3就不会绑核的。此外,第1种方法是自动的,2和3是手动的,可以作为临时补救方法。

在虚拟机上执行高密度计算,测试的Python脚本如下:

# test_compute.py

k = 0

for i in xrange(1, 100000):

    for j in xrange(1, 100000):

        k = k + i * j

使用shell脚本同时跑50个进程,保证CPU满载运行:

for i in `seq 1 50`do

    python test_compute.py &

done

使用sar命令查看宿主机CPU使用情况:

sar -P ALL 1 100

结果如下:

Linux 3.10.0-229.20.1.el7.x86_64 (8409a4dcbe1d11af)    05/10/2018      _x86_64_        (40 CPU)

10:20:14 PM    CPU    %user    %nice  %system  %iowait    %steal    %idle

10:20:15 PM    all    20.48      0.00      0.15      0.03      0.00    79.34

10:20:15 PM      0      0.00      0.00      0.00      0.00      0.00    100.00

10:20:15 PM      1      0.99      0.00      0.00      0.00      0.00    99.01

10:20:15 PM      2      0.00      0.00      0.00      0.00      0.00    100.00

10:20:15 PM      3      0.00      0.00      0.00      0.00      0.00    100.00

10:20:15 PM      4    100.00      0.00      0.00      0.00      0.00      0.00

10:20:15 PM      5    100.00      0.00      0.00      0.00      0.00      0.00

10:20:15 PM      6      0.00      0.00      0.00      0.00      0.00    100.00

10:20:15 PM      7      0.00      0.00      0.00      0.00      0.00    100.00

10:20:15 PM      8    100.00      0.00      0.00      0.00      0.00      0.00

10:20:15 PM      9    100.00      0.00      0.00      0.00      0.00      0.00

10:20:15 PM      10      1.01      0.00      0.00      0.00      0.00    98.99

10:20:15 PM      11      1.00      0.00      0.00      0.00      0.00    99.00

10:20:15 PM      12      0.00      0.00      0.00      0.00      0.00    100.00

10:20:15 PM      13      0.00      0.00      0.99      0.00      0.00    99.01

10:20:15 PM      14      0.99      0.00      0.99      0.00      0.00    98.02

10:20:15 PM      15      1.00      0.00      0.00      0.00      0.00    99.00

10:20:15 PM      16      0.99      0.00      0.99      0.00      0.00    98.02

10:20:15 PM      17      0.00      0.00      0.00      0.00      0.00    100.00

10:20:15 PM      18      0.00      0.00      0.00      0.00      0.00    100.00

10:20:15 PM      19      3.96      0.00      0.99      0.00      0.00    95.05

10:20:15 PM      20      0.00      0.00      0.00      0.00      0.00    100.00

10:20:15 PM      21      0.00      0.00      0.00      0.00      0.00    100.00

10:20:15 PM      22      0.00      0.00      0.00      0.00      0.00    100.00

10:20:15 PM      23      0.00      0.00      0.00      0.00      0.00    100.00

10:20:15 PM      24    100.00      0.00      0.00      0.00      0.00      0.00

10:20:15 PM      25    100.00      0.00      0.00      0.00      0.00      0.00

10:20:15 PM      26      0.00      0.00      0.00      0.00      0.00    100.00

10:20:15 PM      27      0.00      0.00      0.00      0.00      0.00    100.00

10:20:15 PM      28    100.00      0.00      0.00      0.00      0.00      0.00

10:20:15 PM      29    100.00      0.00      0.00      0.00      0.00      0.00

10:20:15 PM      30      2.00      0.00      0.00      0.00      0.00    98.00

10:20:15 PM      31      0.00      0.00      0.00      0.00      0.00    100.00

10:20:15 PM      32      2.97      0.00      0.99      0.00      0.00    96.04

10:20:15 PM      33      0.00      0.00      0.00      0.00      0.00    100.00

10:20:15 PM      34      0.00      0.00      0.00      0.00      0.00    100.00

10:20:15 PM      35      1.00      0.00      0.00      0.00      0.00    99.00

10:20:15 PM      36      0.00      0.00      0.00      0.00      0.00    100.00

10:20:15 PM      37      0.00      0.00      0.00      0.00      0.00    100.00

10:20:15 PM      38      0.00      0.00      0.00      0.00      0.00    100.00

10:20:15 PM      39      0.00      0.00      0.00      0.00      0.00    100.00

从CPU使用情况看宿主机的pCPU 4-5,8-9,24-25,28-29使用率100%,并且整个过程中没有浮动,符合我们的预期结果,说明CPU核绑定成功。

Linux核隔离和绑定都是Linux内核对进程和CPU资源的管理机制,但是它们的概念和作用有所局银举不同。

1. 核隔离(CPU isolation):核隔离是指将CPU核心绑定到一个或多个特定进程上,从而实现不同进程之间的CPU资源隔离,避免不同进程之间的CPU竞争,并提高CPU利用率。这种方法需要使用cpuset控制工具进行设置,用于分配CPU资源给指定的进程组。

2. 绑定(CPU affinity):绑定是指将一个或多个特定的CPU核心分配给某个进程或线桐碧程,使其只能在该CPU核心上运行,其他CPU核心不参与该进程或线程的调度。通过绑定CPU核心可以避免缓存变冷、页表失效等问题,提高CPU缓存命中率和应用程序性能。这种方法需要使用taskset命令来实现。

总之,在不同的应用场景下,搏厅可根据需求选择不同的CPU资源管理机制,以便更好地管理和利用CPU资源。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12386856.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存