系统管理指南:Oracle Solaris Containers-资源管理和 Oracle Solaris Zones

第 8 章 公平份额调度器(概述)

对工作负荷数据进行分析可以指明特定工作负荷或工作负荷组是否在独占 CPU 资源。如果这些工作负荷没有违反 CPU 资源使用约束,则可以修改系统上 CPU 时间的分配策略。使用本章所述的公平份额调度类,您可以基于份额而不是分时 (timesharing, TS) 调度类的优先级方案来分配 CPU 时间。

本章包含以下主题:

要开始使用公平份额调度器,请参见第 9 章

调度程序介绍

操作系统的基本工作是仲裁哪些进程可以访问系统资源。进程调度程序,也称为分发程序,是控制为进程分配 CPU 的内核部分。调度程序支持调度类的概念。每个类都定义了调度策略,用于调度类中的进程。Solaris 操作系统中的缺省调度程序(即 TS 调度程序)尝试为每个进程提供相对均等的访问可用 CPU 的权限。但是,您可能要指定为特定进程提供的资源多于为其他进程提供的资源。

可以使用公平份额调度器 (fair share scheduler, FSS),根据工作负荷的重要性控制可用 CPU 资源在工作负荷之间的分配。这种重要性通过您为每个工作负荷指定的 CPU 资源份额来表示。

您为每个项目指定 CPU 份额,以控制该项目访问 CPU 资源的权利。FSS 保证为各项目公平地分配 CPU 资源,这种公平分配基于已分配的份额,而与附加到项目的进程数无关。FSS 通过将某个项目与其他项目比较后,减少此项目对 CPU 的大量使用的权利,同时增加少量使用的权利来达到公平。

FSS 由一个内核调度类模块以及类特定版本的 dispadmin(1M)priocntl(1) 命令组成。FSS 使用的项目份额通过 project(4) 数据库中的 project.cpu-shares 属性指定。


注 –

如果您要在安装了区域的系统上使用 project.cpu-shares 资源控制,请参见区域配置数据在非全局区域中使用的资源控制在安装了区域的 Solaris 系统上使用公平份额调度器


CPU 份额定义

术语“份额”用于定义系统 CPU 资源中分配给某一项目的部分。如果您为某个项目指定的 CPU 份额数多于为其他项目指定的份额数,则此项目将从公平份额调度器中接收更多的 CPU 资源。

CPU 份额并不等同于 CPU 资源的百分比。份额用于定义工作负荷相对于其他工作负荷的相对重要性。为项目指定 CPU 份额时,主要的关注对象并不是项目具有的份额数,更重要的是要知道此项目与其他项目相比具有多少份额。您还必须考虑有多少其他项目与此项目争用 CPU 资源。


注 –

零份额项目中的进程始终以最低的系统优先级 (0) 运行。这些进程仅在非零份额项目不使用 CPU 资源时运行。


CPU 份额和进程状态

在 Solaris 系统中,项目工作负荷通常由多个进程组成。从公平份额调度器的角度来看,每个项目工作负荷可以处于空闲活动状态。如果某个项目的所有进程都没有使用 CPU 资源,则将此项目视为空闲项目。这通常表示此类进程处于休眠状态(等待 I/O 完成)或已停止。如果某个项目中至少有一个进程正在使用 CPU 资源,则将此项目视为活动项目。在计算为项目指定多少 CPU 资源时,将使用所有活动项目的份额总数。

活动项目增多时,为每个项目分配的 CPU 将减少,但是不同项目之间的分配比例并没有更改。

CPU 份额与使用率

份额分配并不等同于使用率。如果将 50% 的 CPU 资源分配给某个项目,它可能平均只使用 20% 的 CPU 资源。此外,仅当与其他项目争用资源时,份额才会限制对 CPU 的使用。如果某个项目在系统上单独运行,则无论为此项目分配多么低的资源百分比,它也始终能使用 100% 的处理能力。可用的 CPU 周期永远不会浪费,它们会分布在项目之间。

为处于忙碌状态的工作负荷分配少量份额可能会降低其性能。但是,只要系统没有过载,就不会阻止工作负荷完成其工作。

CPU 份额示例

假设您的系统具有两个 CPU,并且运行两个并行的计算密集型 (CPU-bound) 工作负荷,分别称为 AB。每个工作负荷都正在作为单独的项目运行。已对这些项目进行了配置,从而为项目 A 指定了 SA 个份额,为项目 B 指定了 S B 个份额。

在传统的 TS 调度程序下,会为系统上正在运行的各个工作负荷平均地提供相同的 CPU 资源量。每个工作负荷将使用 50% 的系统容量。

如果在 FSS 调度程序的控制之下运行,并且 S A=SB ,也会为这些项目提供大致等量的 CPU 资源。但是,如果为项目提供了不同的份额数,则它们的 CPU 资源分配量也就不同。

以下三个示例说明了份额在不同的配置中如何起作用。这些示例显示在可用资源能够满足或无法满足需求的情况下,从使用情况的角度来说,份额仅在算术意义上是精确的。

示例 1:每个项目中有两个计算密集型 (CPU-bound) 进程

如果 AB 各具有两个计算密集型 (CPU-bound) 进程,并且 S A = 1S B = 3,那么份额总数为 1 + 3 = 4。在该配置中,如果 CPU 请求充足,则分别向项目 AB 分配 25% 和 75% 的 CPU 资源。

图例。文中对该图形进行了说明。

示例 2:项目之间没有争用

如果 AB 各自仅有一个计算密集型 (CPU-bound) 进程,并且 S A = 1S B = 100,那么份额的总数为 101。因为每个项目只有一个运行的进程,所以每个项目都不能使用一个以上的 CPU。由于在此配置中项目之间没有争用 CPU 资源,因此,为项目 AB 各分配了全部 CPU 资源的 50%。在此配置中,CPU 份额值无关紧要。即使为两个项目都指定了零份额,项目的资源分配量也相同 (50/50)。

图例。文中对该图形进行了说明。

示例 3:一个项目无法运行

如果 AB 各有两个计算密集型 (CPU-bound) 进程,并且为项目 A 提供 1 个份额,为项目 B 提供 0 个份额,则不会为项目 B 分配任何 CPU 资源,而为项目 A 分配所有 CPU 资源。B 中的进程始终以系统优先级 0 运行,因此它们永远不能运行,这是因为项目 A 中的进程始终具有较高的优先级。

图例。文中对该图形进行了说明。

FSS 设置

项目和用户

项目是指 FSS 调度程序中的工作负荷容器。为项目指定的用户组被视为单个可控制块。请注意,您可以为单个用户创建具有自身份额数的项目。

用户可以是多个指定了不同份额数的项目的成员。通过将进程从一个项目移动到另一个项目,可以为进程指定不同的 CPU 资源量。

有关 project(4) 数据库和名称服务的更多信息,请参见project 数据库

CPU 份额配置

CPU 份额配置作为 project 数据库的一个属性由名称服务来管理。

当通过 setproject(3PROJECT) 库函数创建与项目关联的第一个任务(或进程)时,会将在 project 数据库中定义为资源控制 project.cpu-shares 的 CPU 份额数传递给内核。尚未定义 project.cpu-shares 资源控制的项目将被指定一个份额。

在以下示例中,/etc/project 文件中的这一条目将项目 x-files 的份额数设置为 5


x-files:100::::project.cpu-shares=(privileged,5,none)

如果在进程运行时改变了分配给数据库中某个项目的 CPU 份额数,则此时将不会修改此项目的份额数。为使更改生效,必须重新启动项目。

如果您要临时更改为项目指定的份额数而不在 project 数据库中改变此项目的属性,请使用 prctl 命令。例如,要在与项目 x-files 关联的进程运行时将此项目的 project.cpu-shares 资源控制值更改为 3,请键入以下命令:


# prctl -r -n project.cpu-shares -v 3 -i project x-files

有关更多信息,请参见 prctl(1) 手册页。

-r

替换命名资源控制的当前值。

-n name

指定资源控制的名称。

-v val

指定资源控制的值。

-i idtype

指定下一个参数的 ID 类型。

x-files

指定更改的对象。在此实例中,对象为项目 x-files

项目 ID 为 0 的项目 system 中包括所有由引导时初始化脚本启动的系统守护进程。可以将 system 视为具有无限多个份额的项目。这意味着,无论为其他项目提供多少份额,始终先调度 system。如果您不希望 system 项目具有无限的份额,则可以在 project 数据库中为此项目指定一个份额数。

如前所述,属于零份额项目的进程的系统优先级始终为 0。具有一个或多个份额的项目以 1 或更高的优先级运行。这样,仅当 CPU 资源可用(即非零份额项目没有请求 CPU 资源)时,才会调度零份额项目。

可以为一个项目指定的最大份额数为 65535。

FSS 和处理器集

FSS 可以与处理器集一起使用,与单独使用处理器集相比,这样可更精细地控制 CPU 资源在运行于每个处理器集中的项目之间的分配。FSS 调度程序将处理器集视为完全独立的分区,每个处理器集都单独控制 CPU 的分配。

运行于一个处理器集中的项目的 CPU 分配不会受到运行于另一个处理器集中的项目的 CPU 份额或活动的影响,因为这两个项目没有争用相同的资源。仅当项目在相同的处理器集中运行时,它们才会相互争用资源。

分配给项目的份额数是整个系统范围的份额数。无论项目在哪个处理器集中运行,此项目的每一部分都具有等量份额。

如果使用处理器集,则会针对每个处理器集中运行的活动项目来计算项目的 CPU 分配。

在不同处理器集中运行的项目分区可能具有不同的 CPU 分配。处理器集中每个项目分区的 CPU 分配仅依赖于在同一处理器集中运行的其他项目的分配。

在处理器集边界内运行的应用程序的性能和可用性不会受到新处理器集引入的影响。应用程序也不会受到对其他处理器集中运行的项目的份额分配所做更改的影响。

空处理器集(无处理器的集合)或者没有绑定进程的处理器集不会对 FSS 调度程序行为产生任何影响。

FSS 和处理器集示例

假设配有八个 CPU 的服务器正在项目 ABC 中运行若干个计算密集型 (CPU-bound) 应用程序。项目 A 分配有一个份额,项目 B 分配有两个份额,项目 C 分配有三个份额。

项目 A 只在处理器集 1 上运行。项目 B 在处理器集 1 和 2 上运行。项目 C 在处理器集 1、2 和 3 上运行。假设每个项目都有足够的进程来利用所有可用的 CPU 资源。这样,每个处理器集中始终存在对 CPU 资源的争用。

图显示了在具有八个 CPU 并且在三个项目中运行若干个计算密集型 (CPU-bound) 应用程序的服务器上,系统范围内总的项目 CPU 分配。

下表显示了此类系统上系统范围内总的项目 CPU 分配。

项目 

分配 

项目 A 

4% = (1/6 X 2/8)pset1

项目 B 

28% = (2/6 X 2/8)pset1+ (2/5 * 4/8)pset2

项目 C 

67% = (3/6 X 2/8)pset1+ (3/5 X 4/8)pset2+ (3/3 X 2/8)pset3

这些百分比并没有与为项目提供的相应 CPU 份额量相匹配。但是,在每个处理器集中,每个项目的 CPU 分配率与各自的份额成比例。

没有处理器集的同一系统上,CPU 资源的分配将有所不同,如下表所示。

项目 

分配 

项目 A 

16.66% = (1/6) 

项目 B 

33.33% = (2/6) 

项目 C 

50% = (3/6) 

将 FSS 与其他调度类组合

缺省情况下,FSS 调度类与分时 (timesharing, TS) 调度类、交互式 (interactive, IA) 调度类和固定优先级 (fixed priority, FX) 调度类使用相同的优先级范围(0 到 59)。因此,您应该避免这些调度类中的进程共享同一处理器集。FSS、TS、IA 和 FX 类中的混合进程可能会引起意外的调度行为。

使用处理器集时,您可以将 TS、IA、FX 和 FSS 纳入一个系统中。但是,在每个处理器集中运行的所有进程都必须属于一个调度类,这样它们就不会争用相同的 CPU。特别是,FX 调度程序不应与 FSS 调度类一起使用,除非使用处理器集。此操作防止 FX 类中的应用程序使用过高的优先级运行以至 FSS 类中的应用程序不能运行。

您可以将 TS 和 IA 类中的进程纳入同一处理器集中,也可纳入同一无处理器集的系统中。

Solaris 系统还为拥有超级用户权限的用户提供了实时 (real-time, RT) 调度程序。缺省情况下,RT 调度类使用与 FSS 不同的系统优先级范围(通常从 100 到 159)。由于 RT 和 FSS 使用不相交或不重叠的优先级范围,因此,FSS 可以与 RT 调度类共存于同一处理器集中。但是,FSS 调度类不对运行于 RT 类中的进程进行任何控制。

例如,在具有四个处理器的系统上,如果单线程 RT 进程具有 CPU 限制,则此进程便可占用整个处理器。如果系统也运行 FSS,则常规用户进程便会争用 RT 进程未使用的其余三个 CPU。请注意,RT 进程可能不会持续占用 CPU。当 RT 进程空闲时,FSS 便会使用所有四个处理器。

您可以键入以下命令来查看处理器集在哪些调度类中运行,并确保将每个处理器集配置为运行 TS、IA、FX 或 FSS 进程。


$ ps -ef -o pset,class | grep -v CLS | sort | uniq
1 FSS
1 SYS
2 TS
2 RT
3 FX

设置系统的调度类

要为系统设置缺省调度类,请参见如何将 FSS 设置为缺省调度程序类区域中的调度类dispadmin(1M)。要将正在运行的进程移至其他调度类,请参见配置 FSSpriocntl(1)

安装了区域的系统上的调度类

非全局区域使用系统的缺省调度类。如果使用新的缺省调度类设置更新了系统,则在引导或重新引导后非全局区域会获取新的设置。

在此情况下,使用 FSS 的首选方法是通过 dispadmin 命令将 FSS 设置为系统缺省调度类。这样,所有区域都将从获取系统 CPU 资源的公平份额中受益。有关使用区域时调度类的更多信息,请参见区域中的调度类

有关在不更改缺省调度类和不重新引导的情况下将正在运行的进程移至其他调度类的信息,请参见表 27–5priocntl(1) 手册页。

用于 FSS 的命令

下表中所示的命令提供了公平份额调度器的主要管理接口。

命令参考 

说明 

priocntl(1)

显示或设置指定进程的调度参数,将正在运行的进程移至其他调度类。 

ps(1)

列出有关正在运行的进程的信息,识别运行处理器集所用的调度类。 

dispadmin(1M)

设置系统的缺省调度程序。还用于检查和调整 FSS 调度程序的时间量程值。 

FSS(7)

介绍公平份额调度器 (fair share scheduler, FSS)。