1.CPU的绑定配置


进程的处理器亲和性(process affinity):指将进程绑定到特定的一个或多个cpu上去执行,而不允许将进程调度到其他cpu上。

物理cpu:表示真实的cpu个数

逻辑cpu:表示所有拥有一个完整真实cpu功能的单元,一般等于所有真实cpu的核心或超线程数(ht技术)之和

例子:一个主板有cpu1,cpu2,cpu1双核不开超线程,cpu2四核其中某个核心开两个超线程,那么它有2个真实cpu,和2+(2*1+3)=7个逻辑cpu


实现:

(1)在grub.conf上使用”isolcpus=[num1],[num2]... “参数,进行cpu的隔离,使得系统启动后普通进程默认不会调度到被隔离的cpu上执行。(注:num表示逻辑cpu号码)

例子:

title CentOS (3.2.84)

        root (hd0,0)        kernel /vmlinuz-3.2.84 ro root=/dev/mapper/VolGroup-lv_root isolcups=4,5 rd_NO_LUKS rd_NO_MD rd_LVM_LV=VolGroup/lv_swap crashkernel=auto LANG=en rd_LVM_LV=VolGroup/lv_root  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet 

        initrd /initramfs-3.2.84.img

注:isolcups要紧跟在root后面,放在最后不行(个人测试,具体原因有待查明)


(2)查看是否隔离成功:

[root@localhost ~]# ps -eLo psr,args|awk '{if ($1==3) print $0}'

  3 [kworker/u:0]

  3 [migration/3]

  3 [kworker/3:0]

  3 [ksoftirqd/3]

  3 [watchdog/3]

  3 [kworker/3:1]

  3 auditd

  3 rpcbind

  3 [flush-253:0]

  3 /usr/sbin/modem-manager

  3 hald-runner

  3 /usr/libexec/postfix/master

[root@localhost ~]# ps -eLo psr,args|awk '{if ($1==4) print $0}'

  4 [migration/4]

  4 [kworker/4:0]

  4 [ksoftirqd/4]

  4 [watchdog/4]

  4 [kworker/4:1]

[root@localhost ~]# ps -eLo psr,args|awk '{if ($1==5) print $0}'

  5 [migration/5]

  5 [kworker/5:0]

  5 [ksoftirqd/5]

  5 [watchdog/5]

  5 [kworker/5:1]

[root@localhost ~]# ps -eLo psr,args|awk '{if ($1==2) print $0}'

  2 [kthreadd]

  2 [migration/2]

  2 [kworker/2:0]

  2 [ksoftirqd/2]

  2 [watchdog/2]

  2 [khubd]

  2 [kworker/2:1]

  2 [kworker/2:2]

  2 /sbin/rsyslogd -i /var/run/syslogd.pid -c 5

  2 pcscd

  2 /sbin/mingetty /dev/tty6


ps(process status):

-e:显示所有进程

-L:用于将线程(LWP,lightweight process)也显示出来,(这里我忽略这个结果了)

-o:以用户自定义格式输出(可选参数有psr、pid、ppid等)

-o参数里面: 

psr:当前分配给进程运行的处理器编号

args:表示运行进程的命令和参数


这里我们看到进程编号2、3都有很多进程,而4、5都只有5个带[]号的系统进程,所以隔离成功。


(3)启动客户机

qemu-system-x86_64 -m  2048 -smp 2 rhel6u5.img  &


(4)查看vcpu线程

[root@localhost kvm_vhost]# ps -eLo pid,lwp,psr,args|grep qemu|grep  -v grep

 1612  1612   6 qemu-system-x86_64 -m 2048 -smp 2 rhel6u5.img

 1612  1614   1 qemu-system-x86_64 -m 2048 -smp 2 rhel6u5.img

 1612  1615   6 qemu-system-x86_64 -m 2048 -smp 2 rhel6u5.img

 1612  1617  11 qemu-system-x86_64 -m 2048 -smp 2 rhel6u5.img


(5)绑定代表整个客户机的进程,使其运行在cpu4上

[root@localhost kvm_vhost]# taskset -p 0x10 1612

pid 1612's current affinity mask: ffcf

pid 1612's new affinity mask: 10

[root@localhost kvm_vhost]# ps -eLo pid,lwp,psr,args|grep qemu|grep  -v grep

 1612  1612   4 qemu-system-x86_64 -m 2048 -smp 2 rhel6u5.img

 1612  1614   3 qemu-system-x86_64 -m 2048 -smp 2 rhel6u5.img

 1612  1615   6 qemu-system-x86_64 -m 2048 -smp 2 rhel6u5.img

 1612  1617  11 qemu-system-x86_64 -m 2048 -smp 2 rhel6u5.img

(6)绑定第一个vcpu线程,使其运行在cpu5上

[root@localhost kvm_vhost]# taskset -p 0x20 1614

pid 1614's current affinity mask: ffcf

pid 1614's new affinity mask: 10

[root@localhost kvm_vhost]# ps -eLo pid,lwp,psr,args|grep qemu|grep  -v grep

 1612  1612   4 qemu-system-x86_64 -m 2048 -smp 2 rhel6u5.img

 1612  1614   5 qemu-system-x86_64 -m 2048 -smp 2 rhel6u5.img

 1612  1615   6 qemu-system-x86_64 -m 2048 -smp 2 rhel6u5.img

 1612  1617  11 qemu-system-x86_64 -m 2048 -smp 2 rhel6u5.img

 

 同理绑定另外一个vcpu,这里taskset的语法是taskset -p [mask] pid 

mask是代表处理器亲和性的掩码数字,转化为二进制,其值从最低位到最高位分别代表第一个逻辑cpu到最后一个逻辑cpu

0001 0000=0x10

0010 0000=0x20

0011 0000=0x30

所以如果使用taskset -p 0x30 1614则表示把vcpu线程运行在cpu4和cpu5上

pid表示线程的id,这里我们有三个线程怎么知道哪个是vcpu的id呢?答案是按ctrl+alt+2 到qemu monitor中使用info cpus进行查看

wKiom1g2tdeCkj_CAAAQlf4_uzk411.png-wh_50


(7)绑定后查看在cpu4上运行的线程

[root@localhost kvm_vhost]# ps -eLo psr,args|awk '{if ($1==4) print $0}'

  4 [migration/4]

  4 [kworker/4:0]

  4 [ksoftirqd/4]

  4 [watchdog/4]

  4 [kworker/4:1]

  4 qemu-system-x86_64 -m 2048 -smp 2 rhel6u5.img


我们看到多了一个且仅有一个用户空间qemu进程,绑定成功。