ulimit命令
ulimit用于控制系统内执行资源的限制,如coredump文件大小、文件的最大值、能打开的最大文件数等。
执行ulimit -a可以看到当前的资源限制情况。
[root@localhost ~]# ulimit -a
core file size (blocks, -c) 0 #core文件的最大值为0,即不生成core dump。
data seg size (kbytes, -d) unlimited #进程的数据段可以任意大。
scheduling priority (-e) 0
file size (blocks, -f) unlimited #文件可以任意大。
pending signals (-i) 98304 #最多有98304个待处理的信号。
max locked memory (kbytes, -l) 32 #一个任务锁住的物理内存的最大值为32KB。
max memory size (kbytes, -m) unlimited #一个任务的常驻物理内存的最大值。
open files (-n) 1024 #一个任务最多可以同时打开1024的文件。
pipe size (512 bytes, -p) 8 #管道的最大空间为4096字节。
POSIX message queues (bytes, -q) 819200 #POSIX的消息队列的最大值为819200字节。
real-time priority (-r) 0
stack size (kbytes, -s) 10240 #进程的栈的最大值为10240字节。
cpu time (seconds, -t) unlimited #进程使用的CPU时间。
max user processes (-u) 98304 #当前用户同时打开的进程(包括线程)的最大个数为98304。
virtual memory (kbytes, -v) unlimited #没有限制进程的最大地址空间。
file locks (-x) unlimited #所能锁住的文件的最大个数没有限制。
设置系统限制的方法
一、在initscript下设置(使用sysvinit)
sysvinit介绍
sysvinit是一种init系统,源于system V的Unix系统,负责linux系统的初始化,一直以来被大部分Linux系统所使用。
- /etc/inittab
sysvinit会读取/etc/inittab文件内的内容,获取以下几种信息:
- 系统需要进入默认的 runlevel
- 捕获组合键的定义
- 定义电源 fail/restore 脚本
- 启动 getty 和虚拟控制台
-
/etc/initscript
当系统存在initscript文件时,init会使用该文件来运行inittab内的命令。因此可以在该文件内设置ulimit,通常用来为全部进程设置ulimit及umask的值。
以下是init使用initscript执行inittab内的命令。
/bin/sh /etc/initscript <id> <level> <action> <process>
以下是一个设置了ulimit的initscript例子:
# Set umask to safe level, and enable core dumps. umask 022 ulimit -c 2097151 PATH=/bin:/sbin:/usr/bin:/usr/sbin export PATH # Increase the hard file descriptor limit for all processes # to 8192. The soft limit is still 1024, but any unprivileged # process can increase its soft limit up to the hard limit # with "ulimit -Sn xxx" (needs a 2.2.13 or later Linux kernel). ulimit -Hn 8192 # Execute the program. eval exec "$4"
二、在/etc/security/limits.conf设置
- 将需要限制的资源写进/etc/security/limits.conf,语法格式为:
<domain><type><item><value>
root hard core ulimited
- limits.conf是pam_limits.so的配置文件,必须在pam.d目录下的对应程序的配置文件内reqiure这个库文件才可以生效。
#在登录时限制
vi /etc/pam.d/login
# Sets up user limits according to /etc/security/limits.conf
# (Replaces the use of /etc/limits in old login)
session required pam_limits.so
- 要在用户登录进行限制,最后还需要在sshd的配置文件内配置使用PAM:
vi /etc/ssh/sshd_config
usePAM yes
三、在/etc/profile 或者用户bashrc下设置
针对不同的用户进行不同的限制,也可以将ulimit指令写入bashrc文件内。
# vi /root/.bashrc
ulimit -c unlimited
故障排查
当发现ulimit没有生效,可以从以上三个地方检查是否有配置错误。
initscript是sysvinit特有的文件,如果使用systemd或者upstart,通过initscript配置将会失效。
参考:man limits.conf(5) man initscript(5) man inittab(5) man pam.conf