全部博文(18)
2008年(18)
分类: BSD
2008-06-26 11:34:55
4.2 系统资源限制
如果您的 FreeBSD 系统允许多位使用者同时使用,每个使用者可能同时执行许多工作,例如 Alex 可能会执行庞大的数学运作程序,而 Tom 在系统中执行占用海量存储器的数据库程序。如此一来,我们的系统资源将全部被几个使用者耗尽,其它正常的系统服务便无法拥有较高的效能。我们不能单纯的假设系统中所有使用者都会乖乖的使用单纯的服务,因此,在一个多重使用者的环境中,系统管理者有必要针对每个使用者限于他们所可以使用的系统资源,例如 CPU、内存、磁盘空间的使用量等。
4.2.1 登入类别
我们在新增使用者时会设定使用者的 login class,所谓的 login class 就是将使用者分类管理,以限制不同类别的使用者对于系统资源的使用。
/etc/login.conf 定义了不同的 login class。这个档案中所有对于使用者限制的设定都是以 key=value 的方式来表示。这些限制大部份是针对某个使用者所执行的某一个行程 (process) 所能占用的资源,而非该使用者全部执行的行程所占用的资源总合。因此,除了每个行程所能占用的资源外,我们还会设定使用者最多可以执行多少个行程。
以下为 /etc/login.conf 中关于 default class 的设定:
# defaults # These settings are used by login(1) by default for classless users # Note that entries like "cputime" set both "cputime-cur" and "cputime-max" default:\ :passwd_format=md5:\ :copyright=/etc/COPYRIGHT:\ :welcome=/etc/motd:\ :setenv=MAIL=/var/mail/$,BLOCKSIZE=K,FTP_PASSIVE_MODE=YES:\ :path=/sbin /bin /usr/sbin /usr/bin /usr/games /usr/local/sbin :nologin=/var/run/nologin:\ :cputime=unlimited:\ :datasize=unlimited:\ :stacksize=unlimited:\ :memorylocked=unlimited:\ :memoryuse=unlimited:\ :filesize=unlimited:\ :coredumpsize=unlimited:\ :openfiles=unlimited:\ :maxproc=unlimited:\ :sbsize=unlimited:\ :vmemoryuse=unlimited:\ :priority=0:\ :ignoretime@:\ :umask=022: |
以下为关于系统资源限制的字段说明,每一个字段都有可使用的数值类型,例如 size、time 等,让我们来看看每个字段的说明:
字段名称 | 数值类型 | 说明 |
coredumpsize | Size | 当使用者所执行的程序出了问题 (coredump),系统会将该程序的执行状况从内存中写到硬盘上,这个值就是在限制 core file 的档案大小。如果使用者所执行的程序是需要消耗许多内存的程序,则所产生的 core file 也会很大。这个值不应该比使用者的磁盘配额限制大。 |
cputime | Time | 这是一个行程所能使用的最长 CPU 时间,这个时间指的不是我们在 top 或 ps 中看到的 CPU usage 百分比,而是一个行程所使用的 CPU 时间。当超过时间,系统核心会自动停止该行程。 |
filesize | Size | 使用者单一档案的最大容量。我们对于使用者磁盘配额只能限制使用者对于硬盘的使用总额,而这个设定可以限制单一档案的大小。 |
maxproc | Number | 限制使用者最多可以执行的行程总量。这个限制包含所有以该使用者名称所执行的程序,有的程序在执行时,会自动产生许多子行程,如果这个值设定的太小,可能会造成使用者的困扰。 |
memorylocked | Size | FreeBSD 系统中有所谓的虚拟内存空间,当物理内存不足时,系统会将某部份的内存数据放到虚拟内存中。而有的程序会使用 mlock() 这个系统呼叫要求系统将它所占用的内存空间全部放在物理内存中,memorylocked 就是限制使用 mlock() 的内存大小。 |
memoryuse | Size | 限制行程最大的内存使用量,包含物理内存及虚拟内存。 |
openfiles | Number | 限制使用者同一时间最多可以开启的档案数量。所谓的档案数量包含了一般的档案及 socket。 |
sbsize | Size | 用以限制最大的网络缓冲区的使用量。 |
stacksize | Size | 行程可使用的最大堆栈 (stack) 空间。 |
以下为上表中数值类型的说明:
类型 | 说明 |
Size | 我们可以单纯的以数字来表示 Size,预设的单位是 byte。例如 1234 表示 1234 bytes。除此之外,我们也可以在数字之后加上单位。例如: b: 表示 512-byte block (1b = 512bytes)。 k: 表示 kilobytes,即 KB (1k=1024 bytes)。 m: 表示 megabytes,即 MB (1m=1048576 bytes)。 g: 表示 gigabytes,即 GB。 t: 表示 terabytes,即 TB。 |
Time | 当我们只写数字时,预设的单位是秒。或者我们也可以在数字后加上单位 y (年)、w (周)、d (天)、h (时)、m (分)、s (秒)。
例如,三小时四十分可以表示为:13200s、220m、或是 3h40m。 |
Number | 您可以使用 0 到 9 的数字,预设为十进制。您也可以使用开头为 0x 的数字来表示十六进制。 |
当要修改类别时,我们以将 default class 复制一份,并更名为其它类别,最后再进行编辑。类别新增完毕后,我们必须执行下列指令以重建系统数据库。
# cap_mkdb /etc/login.conf
接下来我们就可以执行 vipw 在想要限制的使用者的 class 的字段填入我们新增的类别了。
除了限制系统资源的使用外,我们也可以使用 login.conf 来客制化每个使用者的登入环境、所使用的语言等,请 man login.conf 以得到更多的说明。
|
4.2.2 磁盘配额
当系统中有多位使用者时,如果其中一个人拥有大量档案,那么其它使用者便无法有足够的空间来使用。如果系统有许多使用者,而又不限制他们对磁盘的使用量,那么磁盘很容易就会爆掉,因此我们必须对使用者加以限制。您可以限制系统中每个使用者可使用的硬盘大小(quota)。步骤如下:
# Device Mountpoint FStype Options Dump Pass# /dev/ad0s1b none swap sw 0 0 /dev/ad0s1a / ufs rw 1 1 /dev/ad1s1f /home ufs rw,userquota 2 2 /dev/ad0s1e /usr ufs rw 2 2 /dev/ad1s1e /var ufs rw 2 2
完成了上述的步骤并重新开机之后,我们就可以使用指令 edquota 来编辑磁盘配额。首先,以指令 edquota -u tom 进入文书编辑,我们通常会加入二行,一行限制档案大小,一行限制档案数:
Quotas for user tom: /home: blocks in use: 65, limits (soft = 50000, hard =55000) inodes in use: 7, limits (soft = 5000, hard = 6000) |
共中 blocks 代表使用者使用档案大小总合,而 inodes 代表档案数目。soft limits 代表使用量达到多少时提出警告,而 hard limits 代表使用量达多少时立刻禁止写入。
上面的范例中,使用者 tom 目前使用的档案大小为 65K,在档案大小总合为 50000K 时提出警告,55000K 时禁止写入。目前该使用者有7个档案,在档案数达 5000 个时提出警告,达 6000 个时禁止写入。
我们也可以使用 edquota -p tom 2000-3000 来以使用者 tom 的设定为范例,将 UID 为 2000 到 3000 的使用者设定为和 tom 一样。或者使用指令 edquota -p tom jack rose 来以使用者 tom 为范例,将 jack 及 rose 的设定变成和 tom 一样。
您可以使用 quota -v tom 来看使用者 tom 目前的使用情形,或使用 repquota 来查看所有使用者目前的使用情形。
在 FreeBSD 3.2 以后的版本,系统开机后预设会检查所有使用者的 quota,但这必须要花上一段时间,如果您不想在开机时自动检查 quota 的话,请在 /etc/rc.conf 中加入下列设定:
check_quotas="NO" |
在 FreeBSD 3.2 版以前,开机内定是不检查 quota 的,如果你想在开机时即检查的话,请在 /etc/rc.conf 中加入下列设定:
check_quotas="YES" |