16.12.资源配额 ============== FreeBSD 为管理员提供了几种方法来限制个人可以使用的系统资源量。磁盘配额限制用户可用的磁盘空间量。\ `磁盘配额 `__ 中讨论了配额。 可以使用平面文件或命令来配置资源限制数据库实现对其他资源(如 CPU 和内存)的限制。传统方法通过编辑 **/etc/login.conf** 来定义登录分级。虽然仍然支持此方法,但任何更改都需要多个步骤过程:编辑此文件、重建资源数据库、对 **/etc/master.passwd** 进行必要的更改以及重建密码数据库。这可能会变得非常耗时,具体取决于要配置的用户数。 ``rctl`` 可用于提供更细粒度的方法来控制资源限制。此命令支持的不仅仅是用户限制,因为它还可用于设置进程和 jail 的资源限制。 本节演示了控制资源的两种方法(从传统方法开始)。 16.12.1.配置登录分级 -------------------- 在传统方法中,登录分级和应用于登录分级的资源限制在 **/etc/login.conf** 中定义。每个用户账户都可以被分配到一个登录分级,其中 ``default`` 是默认的登录分级。每个登录分级都有一组与之相关的登录能力。一个登录能力是一个 ``name=value`` 对,其中 *name* 是一个众所周知的标识符,\ *value* 是一个任意字符串,会根据名称进行相应的处理。 **注意** 每当编辑 **/etc/login.conf** 后,必须通过执行以下命令更新 **/etc/login.conf.db**\ : .. code:: shell-session # cap_mkdb /etc/login.conf 资源限制在两个方面与默认登录功能不同。首先,对于每个限制,都有一个 *软* 限制和 *硬* 限制。软限制可以由用户或应用程序调整,但不能设置为高于硬限制。硬限制可以由用户降低,但只能由超级用户提高。其次,大多数资源限制适用于指定用户的每个进程。 `登录分级资源限制 `__ 列出了最常用的资源限制。所有可用的资源限制和功能都在 `login.conf(5) `__ 中有详细介绍。 ============ ================================================================================================================================================================================================================================================================================================================ 资源配额 说明 ============ ================================================================================================================================================================================================================================================================================================================ coredumpsize 程序生成的核心转储大小限制从属于磁盘使用的其他限制,例如 ``filesize`` 或磁盘配额。此限制通常用作控制磁盘空间消耗的不太严格的方法。由于用户不生成核心转储,并且通常不会删除它们,因此在大型程序崩溃时,此设置可能会使它们免于磁盘空间不足。 cputime 用户进程可能消耗的最大 CPU 时间量。有问题的进程将被内核杀死。这是对所用 CPU *时间* 的限制,而非 ``top`` 和 ``ps`` 生成的某些字段中显示的 CPU 百分比。 filesize 用户可能拥有的文件的最大大小。与磁盘配额(\ `磁盘配额 `__\ )不同,此限制是对单个文件强制执行的,而不是用户拥有的所有文件。 maxproc 用户可以运行的前台和后台进程的最大数目。此限制不得大于 ``kern.maxproc`` 指定的系统限制。将此限制设置得太小可能会妨碍用户的工作效率,因为某些任务(如编译大型程序)会启动许多进程。 memorylocked 使用 `mlock(2) `__ 可以请求将进程锁定到主内存中的最大内存量。一些系统关键型程序,如 `amd(8) `__\ ,锁定到主内存中。这样,如果系统开始交换空间,它们不会导致磁盘抖动。 memoryuse 进程在任何给定时间可能消耗的最大内存量。它包括核心内存和交换空间的使用。这不是限制内存消耗的包罗万象的限制,但这是一个良好的开端。 openfiles 进程可能打开的最大文件数。在 FreeBSD 中,文件用于表示套接字和 IPC 通道。所以要小心不要设置得太低。系统范围的限制由 ``kern.maxfiles`` 定义。 sbsize 对用户可能消耗的网络内存量的限制。这通常可用于限制网络通信。 stacksize 进程堆栈的最大大小。仅凭这一点不足以限制程序可能使用的内存量,因此应将其与其他限制结合使用。 ============ ================================================================================================================================================================================================================================================================================================================ 设置资源限制时,还需要记住其他一些事项: - 在系统启动时由 **/etc/rc** 启动的进程将分配给 ``daemon`` 登录分级。 - 尽管对于大多数限制,默认的 **/etc/login.conf** 是合理值的良好来源,但它们可能并不适合每个系统。将限制设置得太高可能会使系统容易被滥用,而将其设置得太低可能会给生产力带来压力。 - Xorg 占用大量资源,并鼓励用户同时运行更多程序。 - 许多限制适用于单个进程,而不是整个用户。例如,设置 ``openfiles`` 为 ``50`` 意味着用户运行的每个进程最多可以打开 ``50`` 个文件。一个用户可以打开的文件总量是 ``openfiles`` 的值乘以 ``maxproc`` 的值。这也适用于内存消耗。 有关资源限制以及登录分级和功能的更多信息,请参阅 `cap.mkdb(1) `__\ 、\ `getrlimit(2) `__ 和 `login.conf(5) `__\ 。 16.12.2.启用和配置资源限制 -------------------------- 可调参数 ``kern.racct.enable`` 必须设置为非零值。定制内核需要特定配置: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session options RACCT options RCTL 系统重新引导到新内核中以后,\ ``rctl`` 可用于为系统设置规则。 规则的语法是通过使用主体(subject)、主体-ID(subject-id)、资源(resource)和动作(action)来控制的,如本例规则所见: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session user:trhodes:maxproc:deny=10/user 在此规则中,主体是 ``user``\ ,主体-ID 是 ``trhodes``\ ,资源 ``maxproc`` 是最大进程数,动作是 ``deny``\ ,它阻止任何新进程的创建。这意味着,用户 ``trhodes`` 将被限制在不超过 10 个进程的范围内。其他可能的动作包括向控制台记录,向 `devd(8) `__ 传递通知,或者向进程发送一个 sigterm。 在添加规则时必须注意一些问题。由于这个用户被限制为 10 个进程,这个例子将阻止用户在登录和执行 ``screen`` 会话后执行其他任务。一旦达到资源限制,将打印出一个错误,如本例: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session % man test /usr/bin/man: Cannot fork: Resource temporarily unavailable eval: Cannot fork: Resource temporarily unavailable 作为另一个示例,它防止 jail 超过内存限制。此规则可以写为: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session # rctl -a jail:httpd:memoryuse:deny=2G/jail 如果规则已添加到 **/etc/rctl.conf** 中,则这些规则将在重新启动后持续存在。格式是规则,没有前面的命令。例如,可以将前面的规则添加为: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session # Block jail from using more than 2G memory: jail:httpd:memoryuse:deny=2G/jail 要删除规则,请使用 ``rctl`` 将其从列表中删除: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session # rctl -r user:trhodes:maxproc:deny=10/user 删除所有规则的方法记录在 `rctl(8) `__ 中。但是,如果需要删除单个用户的所有规则,则可能会执行以下命令: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session # rctl -r user:trhodes 还有许多其他的资源,可以用来对各种\ ``主体``\ 进行额外的控制。参见 `rctl(8) `__ 来了解它们。