北极熊的窝

« Previous month (二月 2008) | Main | Next month (四月 2008) »

http://blogs.163jsp.com/polarbear/date/20080303 星期一 2008年03月03日

Solaris 10 8/07容器的增强

Solaris 10 8/07容器的增强
  ●Solaris 10 8/07增强了容器的资源管理能力。一些是新的资源管理能力,一些是用户接口的增强。首先我们谈谈三个新的"RM"功能。
  早期的Solaris 10包括了RCP(Resource Capping Daemon)。这个工具能让你设置一个应用程序、用户或者组可用内存的软限制。当超出这个限制,实体占用的物理内存会被page out(就是影射到硬盘的缓存上),直到其占用的内存低于这个软限制。虽然你可以在区域上使用这个工具,它是相当麻烦的,需要你和容器的管理员协作。也就是说,容器的root帐号可以改变这个软限制。这在某些潜在的恶意环境下就存在着很高的风险。Solaris 10 8/07可以让系统管理员通过rcapd在容器上设置一个硬限制,这样就没必要和容器的管理员协作了。而且,设置也是相当的简单,语法如下:
global# zonecfg -z myzone
zonecfg:myzone> add capped-memory
zonecfg:myzone:capped-memory> set physical=500m
zonecfg:myzone:capped-memory> end
zonecfg:myzone> exit
  下一次容器启动后,这个容器就只能使用不超过500MB的物理内存。在容器运行的时候,这个限制也可以更改:
global# rcapadm -z myzone -m 600m
  虚拟内存(例如swap空间)也可以限制,如下:
global# zonecfg -z myzone
zonecfg:myzone> add capped-memory
zonecfg:myzone:capped-memory> set swap=1g
zonecfg:myzone:capped-memory> end
zonecfg:myzone> exit
  这个限制也可以在容器运行的时候进行更改:
global# prctl -n zone.max-swap -v 2g -t privileged   -r -e deny -i zone myzone
  和物理内存限制一样,如果你想修改正在运行的容器或者下次启动的容器的阀值,你必须使用zonecfg、prctl或者rcapadm工具。
  第三个新的内存限制就是锁定内存(locked memory)。这个容器占用的物理内存会被锁住,防止其被page out(也就是防止其内存被转储到磁盘缓存中)。下面是一个例子:
global# zonecfg -z myzone
zonecfg:myzone> add capped-memory
zonecfg:myzone:capped-memory> set locked=100m
zonecfg:myzone:capped-memory> end
zonecfg:myzone> exit
  ●简化的资源管理功能
○Dedicated CPUs
  很多已经存在的资源管理功能有了新的简化的用户接口。例如,"dedicated-cpus"就是利用了已经存在的Dynamic Resource Pools功能。但是命令更加简化:
global# zonecfg -z myzone
zonecfg:myzone> add dedicated-cpu
zonecfg:myzone:dedicated-cpu> set ncpus=1-3
zonecfg:myzone:dedicated-cpu> end
zonecfg:myzone> exit
  使用了上述命令,容器重启后,Solaris:
1.从默认池移出一个CPU。
2.指派这个CPU到一个最近创建的临时池中。
3.关联容器到那个池等等,仅安排那个容器的进程到那个CPU上。
  更进一步,如果那个CPU的负载超过了默认的阀值,将会从另一个池中移出来一个CPU,最大会使用3个CPU。最后,当容器停止的时候,临时池被销毁,它的CPU被放回默认的池中。
  另外,三个已经存在的资源控制选项也可以应用到容器上:
global# zonecfg -z myzone
zonecfg:myzone> set max-shm-memory=100m
zonecfg:myzone> set max-shm-ids=100
zonecfg:myzone> set max-msg-ids=100
zonecfg:myzone> set max-sem-ids=100
zonecfg:myzone> exit

○Fair Share Scheduler(公平共享调度器)
  另一个通用的方法是限制CPU被一个负载过分占用,一个相对的数值指定到区域,保证了区域的CPU份额。在过去,设置需要通过好几步。现在只需要两步。系统必须使用FSS作为默认的调度器。这个命令告诉系统下次启动后使用FSS作为默认的调度器。
global# dispadmin -d FSS
  同时,必须给容器指定一定数量的共享:
global# zonecfg -z myzone
zonecfg:myzone> set cpu-shares=100
zonecfg:myzone> exit
○Shared Memory Accounting(共享内存统计)
  这个功能不是减少了命令数量,但是减少了资源监视的复杂度。在Solaris 10 8/07之前,共享内存页的统计不是很准确。如果在一个容器中那个的两个进程共享一些内存,每个进程的共享内存都会被统计一次,所以显示的会比实际的高。这个在Solaris 10 8/07中得到了改变。现在,每容器使用pestat和类似工具,共享内存页对于每个容器仅计算一次。
  ●全局区域资源管理
  Solaris 10 8/07 现在可以控制全局区域及其进程的资源。这个控制包括:
    ◆ pool
    ◆ cpu-shares
    ◆ capped-memory: physical, swap, locked
    ◆ dedicated-cpu: ncpus, importance
例如:
global# zonecfg -z global
zonecfg:myzone> set cpu-shares=100
zonecfg:myzone> set scheduling-class=FSS
zonecfg:myzone> exit
  使用这些设置要注意。例如,指派一个100MB的物理内存限制到全局区域,会导致问题发生。
  ●新的启动参数
参数或者选项  意义
-s    启动一个单用户的里程碑。
-m <milestone>    启动指定的里程碑。
-i </path/to/init>    以'init'启动程序。这仅在标记区域中可用。
允许的语法包括:
global# zoneadm -z myzone boot -- -s
global# zoneadm -z yourzone reboot -- -i /sbin/myinit
ozone# reboot -- -m verbose
另外,这些启动参数可以通过zonecfg保存,用于下次启动用:
global# zonecfg -z myzone
zonecfg:myzone> set bootargs="-m verbose"
zonecfg:myzone> exit
  ●可配置的特权
  关于已经存在的三个DTrace特权、dtrace_proc和dtrace_user现在可以被指派给容器。这允许在一个容器内试用DTrace。当然,在一个容器中的root用户仍然不能查看和改变内核数据,但是DTrace可以在一个容器中被用来查看系统调用信息和用户进程的原数据。
  另外,proc_priocntl 可以被添加到容器中,允许其root用户改变它的进程的调度类。
  ●IP实例
  这个新的功能允许一个容器独占一个或者多个网络接口,即使全局区域也不能在其独占的网络接口存取数据。这允许一个容器控制其自己的网络配置,包括路由、IP Filter、使用DHCP客户端等等。语法例子如下:
global# zonecfg -z myzone
zonecfg:myzone> set ip-type=exclusive
zonecfg:myzone> add net
zonecfg:myzone:net> set physical=bge1
zonecfg:myzone:net> end
zonecfg:myzone> exit


Valid HTML! Valid CSS!

This is a personal weblog, I do not speak for my employer.