cpu调用进程或线程的方式:

  Linux内核的进程调度器根据自有的调度策略将系统中的一个进程调度到某个CPU上执行。一个进程在前一个执行时间是在cpuM上运行,而在后一个执行时间则是在cpuN上运行,这样的情况在cpu中是很可能发生的,因为linux对进程执行的调度采用时间片法则,而在默认情况下,一个普通的进程或线程的处理器亲和性提现在所有可用的CPU上,进程或线程有可能在这些cpu之中的任何一个上执行。

  进程的处理器亲和性(Processor Affinity),即cpu绑定设置,是指将进程绑定到特定的一个或多个cpu上去执行,而不允许将进程调度到其他cpu上。Linux内核对进程的调度算法也是遵守进程的处理器亲和性设置的。设置进程的处理器亲和性带来的好处是可以减少进程在多个cpu之间交换运行带来的缓存命中失效(cache missing),从该进程运行的角度来看,可能带来一定程度上性能的提升。

换个角度来看,对进程亲和性的设置也可能会导致整个系统的进程调度变得低效。特别是在多处理器、多核、多线程技术使用的场景,如果不能对CPU、内存等有深入的了解,对进程的处理器亲和性进行设置可能导致系统的整体性能的下降而非提升。

kvm虚拟机设置CPU亲和性

每个虚拟机的vcpu在宿主机上,都表现为一个普通的qemu线程,可以使用taskset工具对其进行设置处理亲和性,使其绑定到某一个或几个固定的cpu上去调度。尽管Linux内核的进程调度算法已经非常高效了,在多数情况下是不需要对进程的调度进行干预,不过,在虚拟化环境中,有时有必要将客户机的qemu进程或线程绑定到固定的cpu上执行。

实例:
    系统:centos 7.2 x64   logical CPU number in total:4
    要求:创建2vcpu虚拟机,将每个vcpu绑定到固定的cpu上

                                  cpu绑定逻辑图

# 查看逻辑cpu个数
[root@kvm ~]# cat /proc/cpuinfo| grep "processor"| wc -l

将逻辑cpu 2、3 隔离

[root@kvm ~]# vim /etc/default/grub 

GRUB_TIMEOUT=
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="ipv6.disable=1 isolcpus=2,3 crashkernel=auto rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet"
GRUB_DISABLE_RECOVERY="true" # 添加如下:
ipv6.disable= # 禁止ipv6
isolcpus=, # 隔离2、3号逻辑cpu [root@kvm ~]# grub2-mkconfig -o /boot/grub2/grub.cfg # 重新生成grub配置文件
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-3.10.-.el7.x86_64
Found initrd image: /boot/initramfs-3.10.-.el7.x86_64.img
Found linux image: /boot/vmlinuz--rescue-42369fb880724a588225bd22cf55ab04
Found initrd image: /boot/initramfs--rescue-42369fb880724a588225bd22cf55ab04.img
done
[root@kvm ~]# reboot # 修改后重启生效

# 查看每个cpu的进程数

[root@kvm ~]# ps -eLo psr | grep  | wc -l 

[root@kvm ~]# ps -eLo psr | grep  | wc -l 

[root@kvm ~]# ps -eLo psr | grep  | wc -l 

[root@kvm ~]# ps -eLo psr | grep  | wc -l 

# 通过以上信息,逻辑cpu2,3已经隔离成功。通过top命令查看可以发现2、3空闲为100%

# 创建虚拟机

[root@kvm ~]# qemu-kvm -name 'test1' -cpu host -smp  -m 512m -drive file=/opt/iso/cirros-0.3.-i386-disk.img,if=virtio,media=disk -nographic
-name: 虚拟机的名字,注意不是主机名
-cpu: cpu的类型,host 表示使用物理机的cpu类型
-smp: 使用cpu核心数
-m: 内存数量
-drive: 设置磁盘使用选项;
file:磁盘所在目录
if:使用类型,virtio表示半虚拟化
media:磁盘类型,这里磁盘就是disk、cd就是cdrom # 查看代表vcpu的QEMU线程
[root@kvm ~]# ps -eLo ruser,pid,ppid,lwp,psr,args | grep qemu-kvm | grep -v grep
root qemu-kvm -name test1 -cpu host -smp -m 512m -drive file=/opt/iso/cirros-0.3.-i386-disk.img,if=virtio,media=disk -nographic
root qemu-kvm -name test1 -cpu host -smp -m 512m -drive file=/opt/iso/cirros-0.3.-i386-disk.img,if=virtio,media=disk -nographic
root qemu-kvm -name test1 -cpu host -smp -m 512m -drive file=/opt/iso/cirros-0.3.-i386-disk.img,if=virtio,media=disk -nographic

# 绑定代表整个客户机的QEMU进程,使其运行在逻辑cpu2上

[root@kvm ~]# taskset -cp
pid 's current affinity list: 0,1
pid 's new affinity list: 2

# 绑定第一个vcpu的线程,使其运行在逻辑cpu2上

[root@kvm ~]# taskset -cp
pid 's current affinity list: 0,1
pid 's new affinity list: 2

# 绑定第二个vcpu的线程,使其运行在逻辑cpu3上

[root@kvm ~]# taskset -cp
pid 's current affinity list: 0,1
pid 's new affinity list: 3

# 查看QEMU 线程的绑定是否生效。第5列为处理器亲和性

[root@kvm ~]# ps -eLo ruser,pid,ppid,lwp,psr,args | grep qemu-kvm | grep -v grep
root qemu-kvm -name test1 -cpu host -smp -m 512m -drive file=/opt/iso/cirros-0.3.-i386-disk.img,if=virtio,media=disk -nographic
root qemu-kvm -name test1 -cpu host -smp -m 512m -drive file=/opt/iso/cirros-0.3.-i386-disk.img,if=virtio,media=disk -nographic
root qemu-kvm -name test1 -cpu host -smp -m 512m -drive file=/opt/iso/cirros-0.3.-i386-disk.img,if=virtio,media=disk -nographic

# 执行vcpu绑定后查看逻辑cpu2上运行的线程

[root@kvm ~]# ps -eLo ruser,pid,ppid,lwp,psr,args | awk '{if($5==2) print $0}'
root [watchdog/]
root [migration/]
root [ksoftirqd/]
root [kworker/:]
root [kworker/:0H]
root qemu-kvm -name test1 -cpu host -smp -m 512m -drive file=/opt/iso/cirros-0.3.-i386-disk.img,if=virtio,media=disk -nographic
root qemu-kvm -name test1 -cpu host -smp -m 512m -drive file=/opt/iso/cirros-0.3.-i386-disk.img,if=virtio,media=disk -nographic

# 执行vcpu绑定后查看逻辑cpu3上运行的线程

[root@kvm ~]# ps -eLo ruser,pid,ppid,lwp,psr,args | awk '{if($5==3) print $0}'
root [watchdog/]
root [migration/]
root [ksoftirqd/]
root [kworker/:]
root [kworker/:0H]
root qemu-kvm -name test1 -cpu host -smp -m 512m -drive file=/opt/iso/cirros-0.3.-i386-disk.img,if=virtio,media=disk -nographic
root [kworker/:]

  通过以上查看,在cpu进行绑定之前,代表这个虚拟机的QEMU进程和代表各个vcpu的QEMU线程分别被调度到cpu0和cpu1上。使用taskset命令将QEMU进程和第一个vcpu的线程绑定到cpu2,将第二个vcpu线程绑定到cpu3上。在绑定之后即可查看到绑定结果生效,代表两个vcpu的QEMU线程分别运行在cpu2和cpu3上,即使再过一段时间,它们也不会被调度到其他cpu上。

  总的来说,在kvm环境中,一般并不推荐手动设置QEMU进程的处理器亲和性来绑定vcpu,但是,在非常了解系统硬件架构的基础上,根据实际应用的需求,可以将其绑定到特定的cpu上,从而提高客户机中的cpu执行效率或实现cpu资源独享的隔离性。

          

[ kvm ] 进程的处理器亲和性和vCPU的绑定的更多相关文章

  1. 进程的处理器亲和性和 vCPU 的绑定(查看cpu信息,超线程等)

    通常情况下,在 SMP 系统中,Linux 内核的进程调度器根据自有的调度策略将系统中的一个进程调度到某个 CPU 上执行.一个进程在前一个执行时间是在 cpuM(M 为系统中的某 CPU 的 ID) ...

  2. KVM虚拟机cpu资源限制和vcpu亲缘性绑定

    前言 KVM中添加的实例存在资源分布不均的情况,这样如果有消耗资源的实例会影响到其他实例的服务正常运行,所以给kvm做资源限制是很有必要的,下面记录一下在centos7中KVM环境下使用cgroup限 ...

  3. 设置进程的cpu亲和性

    在busybox中提供了一个名叫taskset的命令用于设置进程的cpu亲和性,让指定的进程或者程序在指定的cpu上面运行,该程序是通过调用sched_getaffinity和sched_setaff ...

  4. 02 . Vue入门基础之条件渲染,列表渲染,事件处理器,表单控件绑定

    vue基础 声明式渲染 Vue.js 的核心是一个允许采用简洁的模板语法来声明式地将数据渲染进 DOM 的系统 Example1 <!DOCTYPE html> <html> ...

  5. ybc云计算思维

      YBC的云计算思维 计算机基础 一 计算机由5大单元组成 输入单元(鼠标 键盘) 存储单元(硬盘 内存) 逻辑单元(CPU) 控制单元(主板) 输出单元(显示器 音响 打印机) CPU CPU主要 ...

  6. CPU 架构SMP/NUMA,调优

    CPU 架构SMP/NUMA,调优 SMP:全称是"对称多处理"(Symmetrical Multi-Processing)技术 . 是指在一个计算机上汇集了一组处理器(多CPU) ...

  7. openstack-KVM-vCPU

    一.KVM基础功能 (1)支持 硬件支持 VT-x VT-d 系统支持 kernel > 3.5 (2)计算机系统的子系统 CPU 处理器 Memory 内存 Storage 存储 Networ ...

  8. taskset: 让进程运行在指定的CPU 上

    观察发现4核CPU,只有第1个核心(CPU#0)非常忙,其他都处于idle状态. 不了解Linux是如何调度的,但目前显然有优化的余地.除了处理正常任务,CPU#0还需要处理每秒网卡中断.因此,若能将 ...

  9. KVM libvirt的CPU热添加

    一. NUMA1. NUMA 介绍    早期的时候,每台服务器都是单CPU,随着技术的发展,出现了多CPU共同工作的需求.    NUMA(Non-Uniform Memory Access,非一致 ...

随机推荐

  1. PAT——乙级1015/甲级1062:德才论

    这两个题是一模一样的 1015 德才论 (25 point(s)) 宋代史学家司马光在<资治通鉴>中有一段著名的“德才论”:“是故才德全尽谓之圣人,才德兼亡谓之愚人,德胜才谓之君子,才胜德 ...

  2. redis字符串基本操作

    redis之字符串类型: 字符串类型是redis中最基本的数据类型,同时它也是memcached中仅有的数据类型.redis字符串类型的键能存储任何形式的字符串,包括二进制数据,例如,存储json化的 ...

  3. NO6——KMP

    int next[N]; char str1[M],str2[N]; //str1 长,str2 短 //len1,len2,对应str1,str2的长 void get_next(int len2) ...

  4. 软件工程项目组Z.XML会议记录 2013/09/14

    软件工程项目组Z.XML会议记录 [例会时间]2013年9月14日星期六21:00-22:30 [例会形式]小组讨论 [例会地点]新主楼A1025 [例会主持]李孟 [会议记录]李孟 会议整体流程 一 ...

  5. xml解析标签

    //获取两个标签之间的值 private static string GetStr(string message, string strStart, string strEnd) { ; ; star ...

  6. [剑指Offer] 22.从上往下打印二叉树

    [思路]广度优先遍历,队列实现 class Solution { public: vector<int> PrintFromTopToBottom(TreeNode* root) { qu ...

  7. [洛谷P3521][POI2011]ROT-Tree Rotations

    题目大意:给一棵$n(n\leqslant2\times10^5)$个叶子的二叉树,可以交换每个点的左右子树,要求前序遍历叶子的逆序对最少.输出最少的逆序对个数 题解:线段树合并,对于每个节点求出交换 ...

  8. AdjustTokenPrivileges启用权限

    原文链接地址:http://blog.csdn.net/xbgprogrammer/article/details/7276760    我们有很多操作需要用到OpenProcess函数,而为了使程序 ...

  9. 【NOIP模拟赛】藏宝图 最小生成树

    性质:我们把最小生成树建出来,如果其距离符合那么就是对的,不符合就是错的 因为这是个n^2的图所以不能Kruskal只能Prim #include <cstdio> #include &l ...

  10. 什么是node.js的事件驱动编程

    Node.js现在非常活跃,相关生态社区已经超过Lua(基本上比较知名的功能都有nodejs模块实现).但是我们为何要使用Node.Js?相比传统的webserver服务模式,nodejs有什么优点优 ...