设为首页 收藏本站
查看: 1501|回复: 0

[经验分享] [ kvm ] 进程的处理器亲和性和vCPU的绑定

[复制链接]

尚未签到

发表于 2017-6-24 12:53:22 | 显示全部楼层 |阅读模式
  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上
   DSC0000.png
                                    cpu绑定逻辑图



# 查看逻辑cpu个数
[iyunv@kvm ~]# cat /proc/cpuinfo| grep "processor"| wc -l
4   
  将逻辑cpu 2、3 隔离



[iyunv@kvm ~]# vim /etc/default/grub
GRUB_TIMEOUT=5
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=1    # 禁止ipv6
isolcpus=2,3 # 隔离2、3号逻辑cpu
[iyunv@kvm ~]# grub2-mkconfig -o /boot/grub2/grub.cfg         # 重新生成grub配置文件
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-3.10.0-327.el7.x86_64
Found initrd image: /boot/initramfs-3.10.0-327.el7.x86_64.img
Found linux image: /boot/vmlinuz-0-rescue-42369fb880724a588225bd22cf55ab04
Found initrd image: /boot/initramfs-0-rescue-42369fb880724a588225bd22cf55ab04.img
done
[iyunv@kvm ~]# reboot     # 修改后重启生效
  # 查看每个cpu的进程数



[iyunv@kvm ~]# ps -eLo psr | grep 0 | wc -l
311
[iyunv@kvm ~]# ps -eLo psr | grep 1 | wc -l
58
[iyunv@kvm ~]# ps -eLo psr | grep 2 | wc -l
5
[iyunv@kvm ~]# ps -eLo psr | grep 3 | wc -l
5
# 通过以上信息,逻辑cpu2,3已经隔离成功。通过top命令查看可以发现2、3空闲为100%
  # 创建虚拟机



[iyunv@kvm ~]# qemu-kvm -name 'test1' -cpu host -smp 2 -m 512m -drive file=/opt/iso/cirros-0.3.4-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线程
[iyunv@kvm ~]# ps -eLo ruser,pid,ppid,lwp,psr,args | grep qemu-kvm | grep -v grep
root       2347   2287   2347   1 qemu-kvm -name test1 -cpu host -smp 2 -m 512m -drive file=/opt/iso/cirros-0.3.4-i386-disk.img,if=virtio,media=disk -nographic
root       2347   2287   2351   0 qemu-kvm -name test1 -cpu host -smp 2 -m 512m -drive file=/opt/iso/cirros-0.3.4-i386-disk.img,if=virtio,media=disk -nographic
root       2347   2287   2352   1 qemu-kvm -name test1 -cpu host -smp 2 -m 512m -drive file=/opt/iso/cirros-0.3.4-i386-disk.img,if=virtio,media=disk -nographic
  # 绑定代表整个客户机的QEMU进程,使其运行在逻辑cpu2上



[iyunv@kvm ~]# taskset -cp 2 2347
pid 2347's current affinity list: 0,1
pid 2347's new affinity list: 2
  # 绑定第一个vcpu的线程,使其运行在逻辑cpu2上



[iyunv@kvm ~]# taskset -cp 2 2351
pid 2351's current affinity list: 0,1
pid 2351's new affinity list: 2
  # 绑定第二个vcpu的线程,使其运行在逻辑cpu3上



[iyunv@kvm ~]# taskset -cp 3 2352
pid 2352's current affinity list: 0,1
pid 2352's new affinity list: 3
  # 查看QEMU 线程的绑定是否生效。第5列为处理器亲和性



[iyunv@kvm ~]# ps -eLo ruser,pid,ppid,lwp,psr,args | grep qemu-kvm | grep -v grep
root       2347   2287   2347   2 qemu-kvm -name test1 -cpu host -smp 2 -m 512m -drive file=/opt/iso/cirros-0.3.4-i386-disk.img,if=virtio,media=disk -nographic
root       2347   2287   2351   2 qemu-kvm -name test1 -cpu host -smp 2 -m 512m -drive file=/opt/iso/cirros-0.3.4-i386-disk.img,if=virtio,media=disk -nographic
root       2347   2287   2352   3 qemu-kvm -name test1 -cpu host -smp 2 -m 512m -drive file=/opt/iso/cirros-0.3.4-i386-disk.img,if=virtio,media=disk -nographic
  # 执行vcpu绑定后查看逻辑cpu2上运行的线程



[iyunv@kvm ~]# ps -eLo ruser,pid,ppid,lwp,psr,args | awk '{if($5==2) print $0}'
root        272      2    272   2 [watchdog/2]
root        273      2    273   2 [migration/2]
root        274      2    274   2 [ksoftirqd/2]
root        275      2    275   2 [kworker/2:0]
root        276      2    276   2 [kworker/2:0H]
root       2347   2287   2347   2 qemu-kvm -name test1 -cpu host -smp 2 -m 512m -drive file=/opt/iso/cirros-0.3.4-i386-disk.img,if=virtio,media=disk -nographic
root       2347   2287   2351   2 qemu-kvm -name test1 -cpu host -smp 2 -m 512m -drive file=/opt/iso/cirros-0.3.4-i386-disk.img,if=virtio,media=disk -nographic
  # 执行vcpu绑定后查看逻辑cpu3上运行的线程



[iyunv@kvm ~]# ps -eLo ruser,pid,ppid,lwp,psr,args | awk '{if($5==3) print $0}'
root        277      2    277   3 [watchdog/3]
root        278      2    278   3 [migration/3]
root        279      2    279   3 [ksoftirqd/3]
root        280      2    280   3 [kworker/3:0]
root        281      2    281   3 [kworker/3:0H]
root       2347   2287   2352   3 qemu-kvm -name test1 -cpu host -smp 2 -m 512m -drive file=/opt/iso/cirros-0.3.4-i386-disk.img,if=virtio,media=disk -nographic
root       2572      2   2572   3 [kworker/3:1]
    通过以上查看,在cpu进行绑定之前,代表这个虚拟机的QEMU进程和代表各个vcpu的QEMU线程分别被调度到cpu0和cpu1上。使用taskset命令将QEMU进程和第一个vcpu的线程绑定到cpu2,将第二个vcpu线程绑定到cpu3上。在绑定之后即可查看到绑定结果生效,代表两个vcpu的QEMU线程分别运行在cpu2和cpu3上,即使再过一段时间,它们也不会被调度到其他cpu上。

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


            

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-387517-1-1.html 上篇帖子: kvm命令总结和虚机器备份迁移 下篇帖子: 通过libVirt抓取kvm虚拟机监控指标数据
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表