控制进程资源的变量

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命令获取和设置)

  1. 任何一个进程都可将一个软限制值更改为小于或等于其硬限制值
  2. 任何一个进程都可降低其硬限制值,但它必须大于或等于其软限制值,这种降低对普通用户是不可逆的
  3. 只有超级用户进程可以提高硬限制值

查看配置

当前会话
    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