简介
Linux 对于每个用户,系统是会默认限制一个最大使用资源值。为提高性能,可根据设备资源情况,设置各 Linux 用户的最大进程数等可调用资源上限。
下面介绍一个命令:ulimit,可以查看 & 控制 Linux 的系统资源。
原文链接:https://blog.csdn.net/FreeApe/article/details/101058393
ulimit
该命令用于控制 shell 程序的资源,支持一下各种类型的资源限制:
- 创建的内核文件大小
- 进程数据块大小
- Shell 进程创建文件大小
- 内存锁锁住的大小
- 常驻内存集的大小
- 打开文件描述符的长度
- 分配堆栈的最大使用大小
- CPU 使用总时间
- 单个用户的最大开启线程数
- Shell 进程所能使用的最大虚拟内存
- EX:硬资源 & 软资源限制
常用参数:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
-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 输出解释:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
[amax@localhost ~]$ ulimit -a # 显示目前资源限制的设定 core file size (blocks, -c) 0 # core文件的最大值 data seg size (kbytes, -d) unlimited # 进程的数据段 scheduling priority (-e) 0 # 指定用户调度的优先级 file size (blocks, -f) unlimited # 文件总长度 pending signals (-i) 1030589 # 最大待处理信号数量 max locked memory (kbytes, -l) 64 # 每个任务锁锁住的物理内存大小 max memory size (kbytes, -m) unlimited # 最大使用内存量 open files (-n) 1024 # 最大文件打开数量 pipe size (512 bytes, -p) 8 # 管道的最大空间(这里是512*8) POSIX message queues (bytes, -q) 819200 # POSIX消息队列最大值 real-time priority (-r) 0 # 实时优先级 stack size (kbytes, -s) 8192 # 堆栈最大使用大小 cpu time (seconds, -t) unlimited # CPU使用时间 max user processes (-u) 4096 # 当前用户同时打开进程&线程数 virtual memory (kbytes, -v) unlimited # 虚拟内存使用空间大小 file locks (-x) unlimited # 能锁住的文件最大个数 |
可以直接在 /etc/security/limits.conf 文件中设置配置 & 参数,并 reboot 重启生效。
实际应用&讲解
ulimit 可以限制使用系统资源的范围,是一个系统内置的 bash 命令。
ulimit 设置项仅在当前 shell 作用(类似 export,想永久生效可以写入相关配置文件中),即是 Shell Session 级别的作用。
写入 ~/.profile 或 ~/.bashrc 只对当前用户持久性生效。
写入 /etc/security/limits.conf 可针对性配置,系统级持久性生效。
调整相关硬限制值(Hard Limit),设置一次后,以后的值只能小于上一次设置的值。
如果不加 S 或 H 修饰,则默认同时修改 Soft Limit 和 Hard Limit 值。
(1)hard limit 和 soft limit
软限制是内核对相应资源强制执行的值,硬限制作为软限制的上限,软限制值无法超过硬限制的值。
如果没有相应的设置权限(sudo/root),只能将其软限制设置为 0 ~ 硬限制范围内的值,并且降低其硬限制,即硬限制值修改了,后面再修改只能降低不能升高,当然软限制值只要在硬限制值范围内都可以多次修改。而拥有设置权限的用户可以对任一限制的值进行任意更改。
(2)修改默认 limit 值
2.1 持久性更改
2.1.1 多用户级更改
通过配置 /etc/security/limits.conf 文件,可以更改 ulimit 的默认资源限制值。包括对指定用户使用资源的限制配置。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
# /etc/security/limits.conf # #Each line describes a limit for a user in the form: # #<domain> <type> <item> <value> # #Where: #<domain> can be: # - a user name # - a group name, with @group syntax # - the wildcard *, for default entry # - the wildcard %, can be also used with %group syntax, # for maxlogin limit # - NOTE: group and wildcard limits are not applied to root. # To apply a limit to the root user, <domain> must be # the literal username root. # #<type> can have the two values: # - "soft" for enforcing the soft limits # - "hard" for enforcing hard limits # #<item> can be one of the following: # - core - limits the core file size (KB) # - data - max data size (KB) # - fsize - maximum filesize (KB) # - memlock - max locked-in-memory address space (KB) # - nofile - max number of open files # - rss - max resident set size (KB) # - stack - max stack size (KB) # - cpu - max CPU time (MIN) # - nproc - max number of processes # - as - address space limit (KB) # - maxlogins - max number of logins for this user # - maxsyslogins - max number of logins on the system # - priority - the priority to run user process with # - locks - max number of file locks the user can hold # - sigpending - max number of pending signals # - msgqueue - max memory used by POSIX message queues (bytes) # - nice - max nice priority allowed to raise to values: [-20, 19] # - rtprio - max realtime priority # - chroot - change root to directory (Debian-specific) # #<domain> <type> <item> <value> # # examples: #* soft core 0 #root hard core 100000 #* hard rss 10000 #@student hard nproc 20 #@faculty soft nproc 20 #@faculty hard nproc 50 #ftp hard nproc 0 #ftp - chroot /ftp #@student - maxlogins 4 # End of file |
通过设置 domain 来指定生效范围,也可以指定用户名、用户组名等。
注意:修改后 reboot 重启生效
2.1.2 单用户级更改
可以将 ulimit 配置写入到相关配置文件中。一般来说 profile 是与环境变量相关的配置,如 PATH,而 bashrc 与 shell 相关的配置。因此可以写入到 bashrc 文件中。
注意:根据上述原理解释,单用户级更改因没有权限,更也只会在 (0 ~ 硬限制上限)之间设置才能生效,否则会出现错误。
例如:Error:ulimit core file size cannot modify limit operation not permitted
2.2 临时性更改
同理,直接在终端中执行 ulimit,就是临时性更改,类似 export 命令。由于权限原因,硬限制修改出错,软限制修改范围内 OK,范围外修改出错。
2.3 系统级更改(内核级别修改,慎重)
举例:file-max 是可以在整个系统(内核)中打开的最大文件数。这是在内核级别强制执行的。该值可以临时调整,无需重启生效:
1 2 3 4 5 6 7 8 9 10 |
# Method 1 $ echo 100000 > /proc/sys/fs/file-max # Method 2 $ vim /etc/sysctl.conf fs.file-max = 100000 $ sysctl -p # Method 3 $ sysctl -w fs.file-max = 100000 |