天天看點

kvm cpu的親和性綁定配置

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 ,如需轉載請自行聯系原作者

繼續閱讀