2. 专用CPU

在专用 CPU 配置的情况下,我们可以为区域定义 CPU 的最小和最大限制。
要使此配置起作用,我们应该在全局区域中拥有 1 个以上的 CPU。
要检查全局区域中可用的 CPU:

global # psrinfo -pv
The physical processor has 32 virtual processors (0-31)
  UltraSPARC-T2 (cpuid 0 clock 1165 MHz)
global # zonecfg -z zone01
zonecfg:zone01> add dedicated-cpu
zonecfg:zone01:dedicated-cpu> set ncpus=1-3
zonecfg:zone01:dedicated-cpu> set importance=2
zonecfg:zone01:dedicated-cpu> end
zonecfg:zone01> verify
zonecfg:zone01> commit
zonecfg:zone01> exit

重要性属性是一个可选属性,仅当我们定义了 CPU 范围并使用由 poold 管理的动态资源池时才需要。
如果 poold 未运行,则忽略重要性。
如果 poold 正在运行并且未设置重要性,则重要性默认为 1.
如果需要,请使用 svcadm 启用 poold 服务。

on  it road.com

3. 上限 CPU

CPU caps 为我们提供了一个区域可以消耗的 CPU 资源量的细粒度限制。
如果存在 CPU 竞争,这会将 CPU 时间的最小保证部分设置为给定区域。
ncpu 表示一个区域保证拥有的 CPU 时间百分比。
因此,值 os n=1 意味着 100% 的 CPU 时间。
因此,下面示例中的 0.75 值指定了 75% 的 CPU 时间。

global # zonecfg -z zone01
zonecfg:zone01> add capped-cpu
zonecfg:zone01:capped-cpu> set ncpus=0.75
zonecfg:zone01:capped-cpu> end

测试 CPU 资源分配

为了确保对区域的 CPU 分配正常工作,我们可以使用 Brendan Gregg 的脚本。

将给定链接中的脚本复制到全局区域并按如下方式运行。

global # ./zoneflogcpu start

在全局区域上运行 prstat -Z 以检查每个区域的资源利用率。
对于我们在此示例中配置的 CPU 份额示例,我们将看到:

global # prstat -Z
ZONEID    NPROC  SWAP   RSS MEMORY      TIME  CPU ZONE
     2       37  273M 9280K   0.4%   0:00:41  54% zone02
     1       38  184M   10M   0.4%   0:00:22  33% zone01
     0       79  679M   21M   1.0%   0:00:15 2.4% global

如我们所见,全局区域的 CPU 份额没有任何负载(定义为 20%),因此 zone01 使用的 CPU 份额比为其定义的(20%)多,而 zone02 低于其 CPU 份额限制60%。

要停止 cpu flog 脚本,请使用:

global # ./zoneflogcpu stop

1. 使用 FSS 共享 CPU

公平共享调度程序 (FSS) 是 solaris OS 中的默认调度程序。
它负责根据工作负载的重要性为操作系统中运行的所有进程提供对 CPU 的平等访问。
我们可以使用 FSS 来定义区域的 CPU 份额。
请记住,FSS 仅在存在 CPU 资源竞争的情况下根据定义的份额来限制 CPU 资源。
如果系统上只有一个区域正在运行,则无论分配给它的份额如何,它都可以使用 100% 的 CPU。
CPU 份额是根据相对数量定义的。
当全局区域中只有一个 CPU 并且我们希望在非全局区域之间共享它时,CPU 份额非常有用。

我们有 2 个区域:zone01 和 zone02.
我将按如下方式将 20% 的 CPU 份额分配给 zone01,将 60% 分配给 zone02,将 20% 分配给全局区域。

total shares 100
global zone - 20 shares out of 100 = 20% (this is optional, but in case you want to set this , it requires a reboot of the global zone)
zone01 - 20 shares out of 100 = 20%
zone02 - 60 shares out of 100 = 60%
global # zonecfg -z global
zonecfg:global> add rctl
zonecfg:global:rctl> set name=zone.cpu-shares
zonecfg:global:rctl> add value (priv=privileged,limit=20,action=none)
zonecfg:global:rctl> end
zonecfg:global> verify
zonecfg:global> commit
zonecfg:global> exit
global # zonecfg -z zone01
zonecfg:zone01> add rctl
zonecfg:zone01:rctl> set name=zone.cpu-shares
zonecfg:zone01:rctl> add value (priv=privileged,limit=20,action=none)
zonecfg:zone01:rctl> end
zonecfg:zone01> verify
zonecfg:zone01> commit
zonecfg:zone01> exit
global # zonecfg -z zone02
zonecfg:zone02> add rctl
zonecfg:zone02:rctl> set name=zone.cpu-shares
zonecfg:zone02:rctl> add value (priv=privileged,limit=80,action=none)
zonecfg:zone02:rctl> end
zonecfg:zone02> verify
zonecfg:zone02> commit
zonecfg:zone02> exit

现在我们也可以以更简单的方式完成上述任务:

global # zonecfg -z global
zonecfg:global> set cpu-shares=20
zonecfg:global> exit
global # zonecfg -z zone01
zonecfg:zone01> set cpu-shares=20
zonecfg:zone01> exit
global # zonecfg -z zone02
zonecfg:zone02> set cpu-shares=60
zonecfg:zone02> exit

要列出 solaris OS 中的所有调度程序:

# dispadmin -l
CONFIGURED CLASSES
==================
SYS	(System Class)
TS	(Time Sharing)
SDC	(System Duty-Cycle Class)
FX	(Fixed Priority)
FSS	(Fair Share)

我们需要将全局区域的默认调度类设置为 FSS。

golbal # dispadmin -d FSS

所有新进程现在都将使用 FSS,但要使所有当前进程使用 FSS,我们需要使用:

global # priocntl -s -c FSS -i all
-s -> set the class
-c -> class name
-i -> include individual process or processes using a specific scheduler class

重新启动两个区域以进行更改。

# zoneadm -z zone01 reboot
# zoneadm -z zone02 reboot

从全局区域检查区域的 CPU 份额

global # prctl -n zone.cpu-shares -t privileged -i zone global
zone: 0: global
NAME    PRIVILEGE        VALUE     FLAG   ACTION     RECIPIENT
zone.cpu-shares
        usage               20
        privileged          20      -     none
solaris 区域中的资源管理:CPU 共享、上限 CPU、专用 CPU 分配
日期:2020-09-17 00:15:17 来源:oir作者:oir