控制进程资源的变量
RLIMIT_AS 进程总的可用存储空间的最大长度(字节),这影响到sbrk函数和mmap函数
RLIMIT_CORE core文件的最大字节数,若其值为0则阻止创建core文件
RLIMIT_CPU CPU时间的最大量值(秒),当超过此软限制时,向该进程发送SIGXCPU信号
RLIMIT_DATA 数据段的最大字节长度,以字节计算,不包括程序分配的动态存储空间
RLIMIT_FSIZE 可以创建的文件的最大字节长度,当超过此软限制时,则向该进程发送SIGXFSZ信号
RLIMIT_MEMLOCK 一个进程使用mlock能够锁定在存储空间中的最大字节长度
RLIMIT_NOFILE 每个进程能打开的最多文件数,更改此限制将影响到sysconf函数在参数
RLIMIT_NPROC 每个实际用户ID可拥有的最大子进程数,更改此限制将影响到sysconf函数在参数
RLIMIT_RSS 最大驻内存集字节长度(resident set size in bytes RSS)如果可用的物理存储器非常少,则内核将从进程处取回超过RSS的部分
RLIMIT_STACK 栈的最大字节长度
系统调用
可以通过 getrlimit 来获取当前进程某一指定资源的限制
可以通过 setrlimit 来设置当前进程某一指定资源的限制
硬限制与软限制
在更改资源限制时,必须遵守下列三条规则(使用ulimit命令获取和设置)
- 任何一个进程都可将一个软限制值更改为小于或等于其硬限制值
- 任何一个进程都可降低其硬限制值,但它必须大于或等于其软限制值,这种降低对普通用户是不可逆的
- 只有超级用户进程可以提高硬限制值
查看配置
当前会话
ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
file size (blocks, -f) unlimited
pending signals (-i) 1024
max locked memory (kbytes, -l) 32
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
stack size (kbytes, -s) 10240
cpu time (seconds, -t) unlimited
max user processes (-u) 4096
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
查看当前进程的最大可以打开的文件数
cat /proc/进程ID/limits
查看当前进程实时打开的文件数
lsof -p PID |wc -l
查看系统总限制打开文件的最大数量
cat /proc/sys/fs/file-max
静态配置
- CentOS 5/6 等版本中
资源限制的配置可以在 /etc/security/limits.conf 设置,针对root/user等各个用户或者*代表所有用户来设置。 当然,/etc/security/limits.d/ 中可以配置,系统是先加载limits.conf然后按照英文字母顺序加载limits.d目录下的配置文件,后加载配置覆盖之前的配置。 - CentOS 7/RHEL 7的系统中
使用Systemd替代了之前的SysV,/etc/security/limits.conf 文件的配置作用域对systemd的service的资源限制不生效。
limits.conf这里的配置,只适用于通过PAM认证登录用户的资源限制(需要在/etc/pam.d/login中 添加pam_limits.so),通过 /etc/security/limits.conf 和 limits.d 来配置即可。 - 对于systemd service的资源限制的配置:
全局的配置,放在文件 /etc/systemd/system.conf 和 /etc/systemd/user.conf。 同时,也会加载两个对应的目录中的所有.conf文件 /etc/systemd/system.conf.d/.conf 和 /etc/systemd/user.conf.d/.conf。其中,system.conf 是系统实例使用的,user.conf用户实例使用的。一般的sevice,使用system.conf中的配置即可。systemd.conf.d/*.conf中配置会覆盖system.conf。
limit.conf的配置
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 file descriptors
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
systemd配置
指令 | 等价的ulimit 命令 | limit.conf username|@groupname type limit 如* soft nofile 65536 | 单位 |
LimitCPU | ulimit -t | cpu | 秒 |
LimitFSIZE | ulimit -f | fsize | 字节 |
LimitDATA | ulimit -d | data | 字节 |
LimitSTACK | ulimit -s | stack | 字节 |
LimitCORE | ulimit -c | core | 字节 |
LimitRSS | ulimit -m | rss | 字节 |
LimitNOFILE | ulimit -n | nofile | 文件描述符的数量 |
LimitAS | ulimit -v | as | 字节 |
LimitNPROC | ulimit -u | nproc | 进程的数量 |
LimitMEMLOCK | ulimit -l | memlock | 字节 |
LimitLOCKS | ulimit -x | locks | 锁的数量 |
LimitSIGPENDING | ulimit -i | sigpending | 信号队列的长度(排队的信号数量) |
LimitMSGQUEUE | ulimit -q | msgqueue | 字节 |
LimitNICE | ulimit -e | nice | 谦让度[-20,19] |
LimitRTPRIO | ulimit -r | rtprio | 实时优先级 |
LimitRTTIME | 不存在 | 微秒 |
动态配置(当前会话进程生效)
ulimit <选项>
-c <core文件上限> 设定core文件的最大值,单位为区块。
-d <数据节区大小> 程序数据节区的最大值,单位为KB。
-f <文件大小> shell所能建立的最大文件,单位为区块。
-H 设定资源的硬性限制,也就是管理员所设下的限制。
-m <内存大小> 指定可使用内存的上限,单位为KB。
-n <文件数目> 指定同一时间最多可开启的文件数。
-p <缓冲区大小> 指定管道缓冲区的大小,单位512字节。
-s <堆叠大小> 指定堆叠的上限,单位为KB。
-S 设定资源的弹性限制。
-t <CPU时间> 指定CPU使用时间的上限,单位为秒。
-u <程序数目> 用户最多可开启的程序数目。
-v <虚拟内存大小> 指定可使用的虚拟内存上限,单位为KB。
指定PID配置(立刻生效)
方法一:prlimit工具修改
#安装新版本的util-linux,由于util-linux版本需要大于等于2.21以上才支持prlimit命令(如果系统有此命令请忽略安装步骤)。
cd /usr/local/src
wget https://mirrors.edge.kernel.org/pub/linux/utils/util-linux/v2.27/util-linux-2.27.1.tar.gz
tar -zxvf util-linux-2.27.1.tar.gz
cd util-linux-2.27.1
./configure --prefix=/usr/share/doc/util-linux-2.27
make && make install
cd /usr/share/doc/util-linux-2.27/bin && cp prlimit /usr/bin/
#找出nginx进程
root@VM-131-5-ubuntu:/etc/security# ps -ef |grep nginx |grep -v grep
root 6034 1 0 17:16 ? 00:00:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
nginx 6037 6034 0 17:16 ? 00:00:00 nginx: worker process
#找到进程的core文件大小限制
root@VM-131-5-ubuntu:/etc/security# cat /proc/6034/limits |grep core
Max core file size 0 unlimited bytes
#使用prlimit命令修改core文件大小限制
root@VM-131-5-ubuntu:/etc/security# prlimit -p 6034 --core=unlimited:
#再次查看该nginx进程的core文件大小限制
root@VM-131-5-ubuntu:/etc/security# cat /proc/6034/limits |grep core
Max core file size unlimited unlimited bytes
方法二:python3+ resource模块
#找出nginx进程
root@VM-131-5-ubuntu:/etc/security# ps -ef |grep nginx |grep -v grep
root 16436 1 0 13:01 ? 00:00:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
nginx 16439 16436 0 13:01 ? 00:00:00 nginx: worker process
#找到进程的core文件大小限制
root@VM-131-5-ubuntu:/etc/security# cat /proc/16436/limits |grep core
Max core file size 0 unlimited bytes
#利用python3 resource模块修改core文件大小限制
root@VM-131-5-ubuntu:/etc/security# python3
Python 3.4.3 (default, Nov 12 2018, 22:25:49)
[GCC 4.8.4] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import resource
>>> resource.prlimit(16436,resource.RLIMIT_CORE,(-1,-1))
(0, -1)
>>> exit()
#再次查看该nginx进程的core文件大小限制
root@VM-131-5-ubuntu:/etc/security# cat /proc/16436/limits |grep core
Max core file size unlimited unlimited bytes
#调整句柄
resource.RLIMIT_NOFILE