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
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
(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
1612 1614 5 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進行檢視
<a href="http://s4.51cto.com/wyfs02/M00/8A/AB/wKiom1g2tdeCkj_CAAAQlf4_uzk411.png-wh_500x0-wm_3-wmp_4-s_710471765.png" target="_blank"></a>
(7)綁定後檢視在cpu4上運作的線程
[root@localhost kvm_vhost]# ps -eLo psr,args|awk '{if ($1==4) print $0}'
4 qemu-system-x86_64 -m 2048 -smp 2 rhel6u5.img
我們看到多了一個且僅有一個使用者空間qemu程序,綁定成功。
本文轉自biao007h51CTO部落格,原文連結:http://blog.51cto.com/linzb/1876316 ,如需轉載請自行聯系原作者