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进行查看
(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进程,绑定成功。