- 論壇徽章:
- 0
|
本文介紹了在Solaris 10中如何運用虛擬化技術來實現動態(tài)CPU資源管理。
關鍵字:Solaris 10, Container, 資源管理,resource management, CMT
Solaris 10中提供了一項強大的虛擬化技術:Container(容器),通過使用Container,我們可以在一個操作系統(tǒng)實例中虛擬出多個運行環(huán)境(Zone),每個Zone有自己的文件系統(tǒng)和網絡地址,各個Zone中運行的應用互相不影響,從而實現應用級的隔離,并提高了安全性。如下圖所示, 在一個Solaris 10 的操作系統(tǒng)中,劃分了3個Container,分別運行App Server, Web Server和Database Server。
![]()
Container的使用非常簡單,通常只需要5-10分鐘的配置即可,所以Container的虛擬化技術得到了廣泛的應用。
資源管理的作用
在缺省的情況下,各個Container都可以看見物理機器上的所有CPU 和內存,也就是說物理機上的所有CPU和內存在各個Container中是共享的。在實際運用中,往往需要對各個Container使用的資源加以指定,以便確保一些關鍵應用的資源。另外一種場景是需要動態(tài)調節(jié)各個Container中的資源,例如,在月末做報表時,希望臨時給數據庫的Zone多分配一些CPU資源,在月末壓力高峰之后,就可以恢復成原來的CPU資源。動態(tài)資源調整(Dynamic Reconfiguration)的功能在中高端服務器上(如E25K,M4000-M9000等)可由硬件實現,在其他中低端類型的服務器中,我們可以用Container 來實現。
Container
Solaris 10 的Container 包括兩層功能:Zone和Resource Management(RM)。Zone是指隔離的虛擬運行環(huán)境,RM是以前版本的Solaris就有的功能,可以結合Zone來動態(tài)分配資源。本文以T5220為例子加以說明,在實際中對所有運行Solaris10的多處理器機器都適用,包括X86機器。T5220 有一個UltraSPARC T2處理器,可以擁有8個核心(cores),每個核心有8個硬件線程,因此,T5220可以擁有64個硬件線程,在操作系統(tǒng)中可以看到有64個物理CPU,如
# psrinfo
0 on-line since 04/08/2009 14:22:42
1 on-line since 04/08/2009 14:22:45
2 on-line since 04/08/2009 14:22:45
3 on-line since 04/08/2009 14:22:45
4 on-line since 04/08/2009 14:22:45
5 on-line since 04/08/2009 14:22:45
6 on-line since 04/08/2009 14:22:45
( 略去部分輸出)
61 on-line since 04/08/2009 14:22:45
62 on-line since 04/08/2009 14:22:45
63 on-line since 04/08/2009 14:22:45
創(chuàng)建Zone
1.創(chuàng)建Zone:
# mkdir –p /export/home/zones/zone1
# zonecfg -z zone1
zone1: No such zone configured
Use 'create' to begin configuring a new zone.
zonecfg:zone1>create
zonecfg:zone1>set zonepath=/export/home/zones/zone1
zonecfg:zone1>set autoboot=true
zonecfg:zone1>add net
zonecfg:zone1:net>set address=192.168.0.1
zonecfg:zone1:net>set physical=e1000g0
zonecfg:zone1:net>end
zonecfg:zone1>verify
zonecfg:zone1>commit
zonecfg:zone1>exit
2. 查看配置的zone:
# ls -l /etc/zones/*xml 可以看到zone1.xml的配置文件
# zoneadm list –cv 可以看到剛剛配置好的zone
3.安裝zone:
# zoneadm –z zone1 install
4. 檢查zone狀態(tài)可以看到zone1 的狀態(tài)為installed:
# zoneadm list –cv
5. 啟動zone:
# zoneadm –z zone1 boot
6.首次啟動需要初始化服務和配置,可用命令登陸console監(jiān)控:
# zlogin -C zone1
7. 系統(tǒng)會出現配置界面,如主機名,命名服務等。完成配置后,zone會重新啟動,
即可完成系統(tǒng)的啟動。
8.如果在zone1里面運行psrinfo命令,可以看到64個CPU,也就是說,
global zone和local zone里面的CPU目前是共享的,下一步我們可以
把zone里的資源進一步限定。
CPU資源分配
假定我們需要給這個zone分配8個CPU資源(即一個core),可以用以下資源管理命令: 1.先檢查資源管理服務是否啟用:
# svcs -a | grep pool
disabled Jan_03 svc:/system/pools:default
disabled Jan_03 svc:/system/pools/dynamic:default
如果顯示disabled,則需要啟用:
# svcadm enable pools
# svcadm enable pools/dynamic
# svcs -a | grep pool
online Jan_03 svc:/system/pools:default
online Jan_03 svc:/system/pools/dynamic:default
2. 啟動資源管理功能和生成基本配置文件 :
# pooladm -e
# pooladm -s
3. 創(chuàng)建資源池(pool):
# poolcfg -dc ‘create pool pool1’
4. 創(chuàng)建CPU集(pset), 包括8個CPU,其中pset.min和pset.max限定了CPU的個數:
# poolcfg -dc ‘create pset pset1 ( uint pset.min=8; uint pset.max=8 )’
5. 指定特定的CPU到CPU集中,此步驟可選,如果不指定CPU編號,則系統(tǒng)自動分配CPU。
為了使T5220的分區(qū)具有較好的性能,我們把同一個core中的CPU分配到同一個CPU集中:
# poolcfg -dc ‘transfer to pset pset1 ( cpu 0; cpu 1; cpu 2; \
cpu 3; cpu 4; cpu 5; cpu 6; cpu 7)’
6.把資源池pool1和CPU集pset1作關聯(lián):
# poolcfg -dc ‘associate pool pool1 ( pset pset1 )’
7.保存配置到文件(save):
# pooladm -s
8.查看當前CPU資源的配置,可以看到pool1已經關聯(lián)上pset1,
pset1中有8個CPU(id:0-7),而缺省的pset_default中只有56個CPU 了:
# pooladm
system default
string system.comment
int system.version 1
boolean system.bind-default true
string system.poold.objectives wt-load
pool pool_default
int pool.sys_id 0
boolean pool.active true
boolean pool.default true
int pool.importance 1
string pool.comment
pset pset_default
pool pool1
int pool.sys_id 2
boolean pool.active true
boolean pool.default false
int pool.importance 1
string pool.comment
pset pset1
pset pset1
int pset.sys_id 1
boolean pset.default false
uint pset.min 8
uint pset.max 8
string pset.units population
uint pset.load 0
uint pset.size 8
string pset.comment
cpu
int cpu.sys_id 5
string cpu.comment
string cpu.status on-line
cpu
int cpu.sys_id 4
string cpu.comment
string cpu.status on-line
cpu
int cpu.sys_id 7
string cpu.comment
string cpu.status on-line
cpu
int cpu.sys_id 6
string cpu.comment
string cpu.status on-line
cpu
int cpu.sys_id 1
string cpu.comment
string cpu.status on-line
cpu
int cpu.sys_id 0
string cpu.comment
string cpu.status on-line
cpu
int cpu.sys_id 3
string cpu.comment
string cpu.status on-line
cpu
int cpu.sys_id 2
string cpu.comment
string cpu.status on-line
pset pset_default
int pset.sys_id -1
boolean pset.default true
uint pset.min 1
uint pset.max 65536
string pset.units population
uint pset.load 807
uint pset.size 56
string pset.comment
cpu
int cpu.sys_id 13
string cpu.comment
string cpu.status on-line
cpu
int cpu.sys_id 12
string cpu.comment
string cpu.status on-line
cpu
int cpu.sys_id 15
string cpu.comment
string cpu.status on-line
cpu
int cpu.sys_id 14
string cpu.comment
string cpu.status on-line
cpu
int cpu.sys_id 9
string cpu.comment
string cpu.status on-line
cpu
int cpu.sys_id 8
string cpu.comment
string cpu.status on-line
cpu
int cpu.sys_id 11
string cpu.comment
string cpu.status on-line
cpu
int cpu.sys_id 10
string cpu.comment
string cpu.status on-line
cpu
int cpu.sys_id 21
string cpu.comment
string cpu.status on-line
cpu
int cpu.sys_id 20
string cpu.comment
string cpu.status on-line
cpu
int cpu.sys_id 23
string cpu.comment
string cpu.status on-line
cpu
int cpu.sys_id 22
string cpu.comment
string cpu.status on-line
cpu
int cpu.sys_id 17
string cpu.comment
string cpu.status on-line
cpu
int cpu.sys_id 16
string cpu.comment
string cpu.status on-line
cpu
int cpu.sys_id 19
string cpu.comment
string cpu.status on-line
cpu
int cpu.sys_id 18
string cpu.comment
string cpu.status on-line
cpu
int cpu.sys_id 29
string cpu.comment
string cpu.status on-line
cpu
int cpu.sys_id 28
string cpu.comment
string cpu.status on-line
cpu
int cpu.sys_id 31
string cpu.comment
string cpu.status on-line
cpu
int cpu.sys_id 30
string cpu.comment
string cpu.status on-line
cpu
int cpu.sys_id 25
string cpu.comment
string cpu.status on-line
cpu
int cpu.sys_id 24
string cpu.comment
string cpu.status on-line
cpu
int cpu.sys_id 27
string cpu.comment
string cpu.status on-line
cpu
int cpu.sys_id 26
string cpu.comment
string cpu.status on-line
cpu
int cpu.sys_id 53
string cpu.comment
string cpu.status on-line
cpu
int cpu.sys_id 52
string cpu.comment
string cpu.status on-line
cpu
int cpu.sys_id 55
string cpu.comment
string cpu.status on-line
cpu
int cpu.sys_id 54
string cpu.comment
string cpu.status on-line
cpu
int cpu.sys_id 49
string cpu.comment
string cpu.status on-line
cpu
int cpu.sys_id 48
string cpu.comment
string cpu.status on-line
cpu
int cpu.sys_id 51
string cpu.comment
string cpu.status on-line
cpu
int cpu.sys_id 50
string cpu.comment
string cpu.status on-line
cpu
int cpu.sys_id 61
string cpu.comment
string cpu.status on-line
cpu
int cpu.sys_id 60
string cpu.comment
string cpu.status on-line
cpu
int cpu.sys_id 63
string cpu.comment
string cpu.status on-line
cpu
int cpu.sys_id 62
string cpu.comment
string cpu.status on-line
cpu
int cpu.sys_id 57
string cpu.comment
string cpu.status on-line
cpu
int cpu.sys_id 56
string cpu.comment
string cpu.status on-line
cpu
int cpu.sys_id 59
string cpu.comment
string cpu.status on-line
cpu
int cpu.sys_id 58
string cpu.comment
string cpu.status on-line
cpu
int cpu.sys_id 37
string cpu.comment
string cpu.status on-line
cpu
int cpu.sys_id 36
string cpu.comment
string cpu.status on-line
cpu
int cpu.sys_id 39
string cpu.comment
string cpu.status on-line
cpu
int cpu.sys_id 38
string cpu.comment
string cpu.status on-line
cpu
int cpu.sys_id 33
string cpu.comment
string cpu.status on-line
cpu
int cpu.sys_id 32
string cpu.comment
string cpu.status on-line
cpu
int cpu.sys_id 35
string cpu.comment
string cpu.status on-line
cpu
int cpu.sys_id 34
string cpu.comment
string cpu.status on-line
cpu
int cpu.sys_id 45
string cpu.comment
string cpu.status on-line
cpu
int cpu.sys_id 44
string cpu.comment
string cpu.status on-line
cpu
int cpu.sys_id 47
string cpu.comment
string cpu.status on-line
cpu
int cpu.sys_id 46
string cpu.comment
string cpu.status on-line
cpu
int cpu.sys_id 41
string cpu.comment
string cpu.status on-line
cpu
int cpu.sys_id 40
string cpu.comment
string cpu.status on-line
cpu
int cpu.sys_id 43
string cpu.comment
string cpu.status on-line
cpu
int cpu.sys_id 42
string cpu.comment
string cpu.status on-line
配置Zone的CPU資源
此時,如果在Zone1中運行psrinfo命令,會發(fā)現只有56個CPU了(8-63),原因是zone1缺省情況下使用了pool_default這個資源池。我們用zonecfg命令,把pool1分配給zone1: # zonecfg -z zone1
zonecfg:zone1>set pool=pool1
zonecfg:zone1>commit
zonecfg:zone1>exit
# zoneadm –z zone1 reboot
在Zone1重新啟動后,我們在這個zone里可以看到只有8個CPU了:
Zone1# psrinfo
0 on-line since 04/08/2009 14:22:42
1 on-line since 04/08/2009 14:22:45
2 on-line since 04/08/2009 14:22:45
3 on-line since 04/08/2009 14:22:45
4 on-line since 04/08/2009 14:22:45
5 on-line since 04/08/2009 14:22:45
6 on-line since 04/08/2009 14:22:45
7 on-line since 04/08/2009 14:22:45
動態(tài)分配CPU資源
如果需要改變zone1的CPU資源的分配配置,例如需要增加CPU到16個,可以通過重新配置pset1來實現,注意,這個操作可以在不停止zone 的情況下進行: 1)先取消原來pset1的配置:
# poolcfg –dc ‘destroy pset pset1’
2)此時zone1中的CPU數恢復到64個,我們再用命令創(chuàng)建一個包含16個CPU的pset1,
命令和前述的過程差不多:
# poolcfg -dc 'create pool pool1'
# poolcfg -dc 'create pset pset1 ( uint pset.min=16; uint pset.max=16 )'
# poolcfg -dc 'transfer to pset pset1 ( cpu 0; cpu 1; cpu 2; cpu 3;\
cpu 4; cpu 5; cpu 6; cpu 7)'
# poolcfg -dc 'transfer to pset pset1 ( cpu 8; cpu 9; cpu 10; cpu 11; \
cpu 12; cpu 13; cpu 14; cpu 15)'
# poolcfg -dc 'associate pool pool1 ( pset pset1 )'
# pooladm –s
3)這時,在zone1中的CPU數目改為16個。
這樣,我們就在Solaris 10中實現了通常由硬件實現的CPU資源動態(tài)管理功能。
本文來自ChinaUnix博客,如果查看原文請點:http://blog.chinaunix.net/u/23363/showart_2154381.html |
|