linux资源限制命令 - ulimit

2018-07-04 22:41:05

ulimit 可以修改当前bash环境的资源限制,这样在当前会话下运行的程序都会继承这些资源限制,默认情况下即设置 软限制,也设置 硬限制,软限制与硬限制的区别读者可以参考 linux c进程资源

资源限制的目的是为了合理分配系统资源,避免某一进程因占用过多资源而导致其他进程因资源枯竭而终止或无法启动。尤其用于多用户环境。

-H 硬限制
-S 软限制

-a     打印所有限制
-b     最大 socket 缓冲区大小
-c     最大 core 文件大小
-d     最大进程数据段大小
-e     最大cpu调度值(nice)
-f     最大文件写入大小
-i     最大数量pending signals
-l     最大上锁内存大小

-n     最大打开文件描述符数量
-p     最大管道块数量(512-byte)
-q     最大posix消息队列数量
-r     最大实时调度优先级
-s     最大栈大小
-t     最大cpu时间(s)
-u     最大单用户进程数
-v     最大数量虚拟内存
-x     最大文件上锁数
-T     最大线程数
[root@localhost lua]# ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 3828
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 65535
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 3828
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited
#设置当前 bash 进程的软硬限制
#打开文件描述符最大为1024
ulimit -n 1024

#只设置软限制
ulimit -S -n 1024

注意:ulimit 只会设置当前会话环境,也就是只有在当 ulimit 设置之后在当前会话运行的程序才会继承,在别的会话,或者重启电脑后都会无效。

要想永久有效,需设置 /etc/security/limits.conf,里面的描述性文字如下。当然也可以设置在 /etc/security/limits.d 目录下,按照字母顺序加载,后面的设置会覆盖前面的设置。

这里的设置只会对由 PAM 登录的用户生效,系统服务不会生效。

#<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
#
#<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 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
# *代表所有用户
* hard nofile 1024
* soft nofile 1024

#只是对nobody用户设置
nobody hard nofile 1024

设置之后,所有重启的会话都会生效。

在centos7 之后系统使用 systemd 代替了之前的 sysV,因此 上述的设置对由 systemd 启动的程序无效。那么该如何配置呢?

全局的配置,放在文件 /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。

下面是 /etc/systemd/system.conf 文件的部分描述说明,想要设置,取消注释加上限制值即可,修改后需要重启电脑才能生效。

[Manager]
#DefaultLimitCPU=
#DefaultLimitFSIZE=
#DefaultLimitDATA=
#DefaultLimitSTACK=
#DefaultLimitCORE=
#DefaultLimitRSS=
#DefaultLimitNOFILE=
#DefaultLimitAS=
#DefaultLimitNPROC=
#DefaultLimitMEMLOCK=
#DefaultLimitLOCKS=
#DefaultLimitSIGPENDING=
#DefaultLimitMSGQUEUE=
#DefaultLimitNICE=
#DefaultLimitRTPRIO=
#DefaultLimitRTTIME=
#设置打开文件描述符限制为1000
DefaultLimitNOFILE=1000

针对单个service也可以设置,以 mysqld 为例。 编辑 /usr/lib/systemd/system/mysqld.service 文件,做如下配置。

[Service]
LimitCORE=infinity
LimitNOFILE=100000
LimitNPROC=100000

然后重启。

systemctl daemon-reload
systemctl restart mysqld

然后通过 /proc/pid/limits 文件来查询特定进程的资源限制,同样以后可以通过这个内存虚拟文件来确定进程的资源限制是否生效。

[root@192 ~]# ps -ef | grep mysqld
mysql      2431      1  0 10:35 ?        00:00:00 /bin/sh /usr/bin/mysqld_safe --basedir=/usr
mysql      2597   2431  0 10:35 ?        00:00:00 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib64/mysql/plugin --log-error=/var/log/mysqld.log --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/lib/mysql/mysql.sock
root       2626   2153  0 10:38 pts/0    00:00:00 grep --color=auto mysqld
#可以看出已经生效
[root@192 ~]# cat /proc/2597/limits 
Limit                     Soft Limit           Hard Limit           Units     
...  
Max core file size        unlimited            unlimited            bytes     
Max resident set          unlimited            unlimited            bytes     
Max processes             100000               100000               processes 
Max open files            100000               100000               files     
...

有C语言基础的朋友可以结合 linux c进程资源 这篇文章阅读。


备注:
1.本系列命令都在centos7里测试,其他发行版如ubuntu、debian、fedora、opensuse等可能略微不同
2.本文只讲解常用用法,详细用法请自行利用 man 命令查看
3.原文地址http://www.freecls.com/a/2712/84

 

©著作权归作者所有
收藏
推荐阅读
简介
天降大任于斯人也,必先苦其心志。