Linux 系统对于每个用户都有其默认的限制规则,对于这些限制规则的管理可使用 ulimit
命令来完成。
ulimit
命令的使用规则如下:
ulimit [-aHS][-c <core文件上限>][-d <数据节区大小>][-f <文件大小>][-m <内存大小>][-n <文件数目>][-p <缓冲区大小>][-s <堆叠大小>][-t <CPU时间>][-u <程序数目>][-v <虚拟内存大小>]
-a 显示目前资源限制的设定。
-c <core文件上限> 设定core文件的最大值,单位为区块。
-d <数据节区大小> 程序数据节区的最大值,单位为KB。
-f <文件大小> shell所能建立的最大文件,单位为区块。
-H 设定资源的硬性限制,也就是管理员所设下的限制。
-m <内存大小> 指定可使用内存的上限,单位为KB。
-n <文件数目> 指定同一时间最多可开启的文件数。
-p <缓冲区大小> 指定管道缓冲区的大小,单位512字节。
-s <栈大小> 指定堆栈大小的上限,单位为KB。
-S 设定资源的弹性限制。
-t <CPU时间> 指定CPU使用时间的上限,单位为秒。
-u <程序数目> 用户最多可开启的程序数目。
-v <虚拟内存大小> 指定可使用的虚拟内存上限,单位为KB。
我们可以通过 ulimit -a
查看默认的限制:
$ ulimit -a
# 内核文件最大值
core file size (blocks, -c) 0
# 进程数据块的大小
data seg size (kbytes, -d) unlimited
# 调度优先级
scheduling priority (-e) 0
# Shell 所能建立的最大文件
file size (blocks, -f) unlimited
# 等待信号
pending signals (-i) 1796
# 可加锁内存大小
max locked memory (kbytes, -l) 64
# 可使用内存的上限
max memory size (kbytes, -m) unlimited
# 最大打开文件描述符数
open files (-n) 1024
# 管道缓冲区的大小
pipe size (512 bytes, -p) 8
# POSIX 消息队列
POSIX message queues (bytes, -q) 819200
# 实时优先级
real-time priority (-r) 0
# 栈大小
stack size (kbytes, -s) 8192
# CPU 使用时间的上限
cpu time (seconds, -t) unlimited
# 最多可开启的程序数目
max user processes (-u) 1796
# 可使用的虚拟内存上限
virtual memory (kbytes, -v) unlimited
# 文件锁
file locks (-x) unlimited
这里我们常修改的一项是 open files
,即每个用户最大打开文件句柄数,它的默认值是 1024,最大值为 1024^2 即 1048576。
因为任何设备在 Linux 下都是文件,通信的接口也有专门的接口文件负责,所以 Linux 下进程 TCP 链接的最大并发量也受限于该值。
这个值可用 ulimit -n
命令来修改,但 ulimit
命令修改的数值只对当前登录用户的目前使用环境有效,系统重启或者用户退出后就会失效。
如果我们希望对某些限制的设定永久生效,则可以统一将限制规则定义在 /etc/security/limits.conf
中,该文件不但能对指定用户的资源进行限制,还能对指定组的资源进行限制。该文件的使用规则如下:
<domain> <type> <item> <value>
domain:表示用户或者组的名字,还可以使用 * 作为通配符,表示任何用户或用户组;
type:表示限制的类型,可以有两个值,soft 和 hard,分别表示软、硬资源限制。
item:表示需要限定的资源名称,常用的有 nofile、cpu、stack 等。分别表示最大打开句柄数、占用的 CPU 时间、最大的堆栈大小;
value:表示限制各种资源的具体数值;
各项可有如下取值:
<domain>:
可以是一个用户名;
可以是使用 @group 语法的组名,这不应与网络组混淆;
可以使用 * 作为通配符,表示任何用户或用户组;
通配符 %(仅用于 maxlogins 限制)也可以与 %group 语法一起使用。如果单独使用 % 通配符,则与在 maxsyslogins 限制中使用 * 是相同的。通过在 % 之后指定一个组,它限制所有成员用户的登录总数;
指定为 <min_uid>:<max_uid> 的uid范围。如果省略 min_uid,则对 max_uid 进行精确匹配。如果省略 max_uid,所有大于或等于 min_uid 的 uid 都匹配;
指定为 @<min_gid>:<max_gid> 的范围,如果省略 min_gid,则与 max_gid 完全匹配。如果省略了 max_gid,则匹配所有大于或等于 min_gid 的组。对于完全匹配,包括用户附加组在内的所有组都是检查。对于范围匹配,仅检查用户的主要组;
指定为 %:<gid> 的 gid 仅适用于 maxlogins 限制。它限制了作为成员的所有用户的登录总数;
<type>:
hard:用于执行硬资源限制。这些限制由管理员设置,并由内核实施。用户不能使用超过这些值的系统资源;
soft:用于执行软资源限制。用户可以在任何范围内向上或向下移动的限制,预先存在的硬性限制,对于正常的系统使用情况,可以将此令牌指定的值视为默认值;
-:同时执行软硬限制,请注意,如果您指定类型为“-”,但忽略提供 item 和 value 字段,则该模块将永远不会实施任何限制在指定的用户/组等上;
<item>:
core:内核文件最大值 (KB);
data:进程数据块的大小(KB);
fsize:Shell 所能建立的最大文件(KB);
memlock:可加锁内存大小 (KB);
nofile:可打开最大打开文件描述符数;
rss:最大居民集大小(KB)(在Linux 2.4.30及更高版本中被忽略);
stack:栈大小(KB);
cpu:CPU 使用时间的上限;
nproc:最多可开启的程序数目;
as:地址空间限制(KB);
maxlogins:该用户的最大登录次数(此限制不适用于uid = 0的用户);
maxsyslogins:系统上所有登录的最大数量,如果所有用户的登录总数大于,则不允许用户登录,指定的数字(此限制不适用于 uid=0 的用户);
priority:运行用户进程的优先级(负值可提高进程优先级);
locks:锁文件最大数量(Linux 2.4及更高版本);
sigpending:待处理信号的最大数量(Linux 2.6及更高版本);
msgqueue:POSIX消息队列使用的最大内存(bytes)(Linux 2.6和更高版本);
nice:允许最多提高到的优先级:[-20,19](Linux 2.6.12 及更高版本);
rtprio:非特权进程允许的最大实时优先级(Linux 2.6.12和更高版本);
该文件的使用规则可以使用
man limits.conf
查看。
除了 /etc/security/limits.conf
文件之外,还有一个 /etc/security/limits.d
目录,可以将资源限制创建一个文件放到这个目录中,默认系统会首先去读取这个目录下的所有文件,然后才去读取 limits.conf
文件。所有资源限制设置完成后,退出 Shell 终端,再次登录 Shell 终端后,ulimit
设置即可自动生效。
评论区