13.13. 资源限制

Contributed by Tom Rhodes.

FreeBSD 为管理员提供了一系列限制系统资源调用的方法。磁盘配额可以限制用户的此盘可用空间。配额(Quota)在第 17.11 节 “文件系统配额”中有介绍。

对其他资源的限制,如CPU和内存的限制,可以使用平面文件或命令来配置资源限制数据库。传统的方法是通过编辑/etc/login.conf来定义登录类。虽然这种方法仍然支持,但任何更改都需要编辑此文件、重建资源数据库、对/etc/master.passwd进行必要的更改,以及重建密码数据库。这可能会消耗很多时间,取决于要配置的用户数量。

rctl可提供更细粒度的资源限制。此命令可提供比用户限制更强大的功能,它还可以用于限制进程和 jail 的资源。

本节从传统方法开始,演示两种控制资源的方法。

13.13.1. 设置登入类别

登录的类由 /etc/login.conf 文件定义。 比较精确的描述超出了本章的范围, 但 login.conf(5) 联机手册会有比较详细的描述。 可以说每个用户都分配到一个登录类 (默认是 defalut), 每个登录类都有一套和它相对应的功能。 登录功能是 名字=值 这样的一对值, 其中名字 是一个众所周知的标识符, 是一个根据名字经过处理得到的任意字符串。 设置登录类和功能相当简单, 在 login.conf(5) 联机手册会有比较详细的描述。

注意:

每次修改 /etc/login.conf 之后,必须通过执行以下命令更新 /etc/login.conf.db

# cap_mkdb /etc/login.conf

资源限制与普通登录限制是有区别的。 首先, 对于每种限制, 有软限制 (比较常见) 和硬限制之分。 一个软限制可能被用户调整过, 但不会超过硬限制。 越往后可能越低, 但不会升高。 其次, 绝大多数资源限制会分配特定用户的每个进程, 而不是该用户的全部进程。 注意, 这些区别是资源限制的特殊操作所规定的, 不是登录功能框架的完成 (也就是说, 他们实际上 不是一个登录功能的特例)。

表 13.1 “登入类别限制资源类型” 列出常见资源限制的例子。您可以在 login.conf(5) 找到其它与登录功能相关的内容。

表 13.1. 登入类别限制资源类型
限制资源描述
coredumpsize很明显, 由程序产生的核心文件大小的限制在磁盘使用上是属于其它限制的 (例如, 文件大小, 磁盘配额)。 不过, 由于用户自己无法产生核心文件, 而且通常并不删除它们, 设置这个可以尽量避免由于一个大型应用程序的崩溃所造成的大量磁盘空间的浪费。 (例如, emacs) 崩溃。
cputime用户进程可能消耗的最大CPU时间量。有问题的进程将被内核终止。这是 CPU 消耗时间的限制,而不是topps生成的某些字段中显示的CPU百分比。
filesize这是用户可以处理一个文件的最大值。 不像 磁盘配额, 这个限制是对单个文件强制执行的, 不是用户自己的所有文件。
maxproc这是一个用户可以运行的最大进程数。 这包括前台和后台进程。 很明显, 这不可能比系统指定 kern.maxproc sysctl(8) 的限制要大。 同时也要注意, 设置的过小会妨碍用户的处理能力: 可能需要多次登录或执行多个管道。 一些任务, 例如编译一些大的程序, 也可能会产生很多进程 (例如, make(1)cc(1) 以及其它一些预处理程序)。
memorylocked这是一个进程允许锁到主存中的最大内存容量 (参见 mlock(2))。 大型程序, 例如像 amd(8) 在遇到问题时, 它们得到的巨大交换量无法传递给系统进行处理。
memoryuse这是在给定时间内一个进程可能消耗的最大内存数量。 它包括核心内存和交换内存。 在限制内存消耗方面, 这不是一个完全的限制,但它是一个好的开始。
openfiles这是一个进程可以打开的最大文件数。 在FreeBSD中, 文件可以被表现为套接字和IPC通道; 注意不要把这个数设置的太小。 系统级的限制是由 kern.maxfiles 定义的, 详情参见 sysctl(8)
sbsize这是网络内存数量的限制, 这主要是针对通过创建许多套接字的老式 DoS 攻击的, 但也可以用来限制网络通信。
stacksize这是一个进程堆栈可能达到的最大值。 它不能单独的限制一个程序可能使用的内存数量; 所以, 需要与其它的限制手段配合使用。

在设置资源限制时, 有一些其他的事需要注意。 下面是一些通常的技巧、 建议和注意事项:

  • 系统启动的进程/etc/rc会被指派给 守护程序 的登录类.

  • 虽然 /etc/login.conf 文件是一个对绝大多数限制做合理配置的资源文件, 但只有您也就是系统管理员,才知道什么最适合您的系统。 设置的太高可能会因为过于开放而导致系统被滥用, 而设置过低, 则可能降低效率。

  • 使用 Xorg 的用户可能要比其他用户使用更多的资源。 因为X11本身就使用很多资源, 而且它鼓励用户同时运行更多的程序。

  • 务必注意, 许多限制措施是针对单个进程来实施的, 它们并不限制某一用户所能用到的总量。 例如, 将 openfiles 设置为 50 表示以该用户身份运行的进程最多只能打开 50 个文件。 因而, 用户实际可以打开的文件总数就应该是 maxprocopenfiles 值的乘积。 对内存用量的限额与此类似。

有关资源限制,登录类的更深入信息可以查看相关联机手册: cap_mkdb(1), getrlimit(2), login.conf(5).

13.13.2. 启用和配置资源限制

kern.racct.enable 需要设置成非零值,若需自定义内核请将以下参数加入内核配置文件:

options         RACCT
options         RCTL

重启到新的内核之后 rctl 可用于为系统设置规则。

语法规则:主体:主体 ID:要限制的资源:动作。示例规则如下:

user:trhodes:maxproc:deny=10/user

本例中主体是user;主体 ID 是trhodes;要限制的资源是maxproc,最大进程数;动作是deny,禁止创建新进程。这条规则表示trhodes最多能创建10个进程。其他可用的动作包裹登入控制台,发送通知到devd(8)或向进程发送信号(sigterm)。

创建规则时请注意:因为此用户被限制只能创建10个进程,因此本示例将阻止用户在登录并执行screen会话后执行其他任务 。一旦出发资源限制规则,系统会打印错误,像下面这样:

% man test
    /usr/bin/man: Cannot fork: Resource temporarily unavailable
eval: Cannot fork: Resource temporarily unavailable

另一个例子:限制 jail 的最大使用内存。该规则可以写为:

# rctl -a jail:httpd:memoryuse:deny=2G/jail

如果已将规则添加到/etc/rctl.conf中,则它们在重启后仍然有效。格式是规则,没有前面的命令。例如,上一条规则可以添加为:

# Block jail from using more than 2G memory:
jail:httpd:memoryuse:deny=2G/jail

要删除规则,请使用rctl将其从列表中删除:

# rctl -r user:trhodes:maxproc:deny=10/user

删除所有规则的方法记录在rctl(8)中。但是,如果需要删除单个用户的所有规则,则可以使用以下命令:

# rctl -r user:trhodes

还有许多用于限制主体行为的参数,详情请参阅rctl(8)

本文档和其它文档可从这里下载: ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.

如果对于FreeBSD有问题,请先阅读 文档,如不能解决再联系 <questions@FreeBSD.org>.

关于本文档的问题请发信联系 <doc@FreeBSD.org>.