Linux 命令之 ulimit

简介

ulimit 是一种 Linux 系统的内建功能,它具有一套参数集,用于为由它生成的 shell 进程及其所创进程的资源使用限制。

ulimit 是临时限制,作用于通过使用其命令登录的 shell 会话,在会话终止时便结束限制,并不影响于其他 shell 会话。

若想实现长期的固定限制,ulimit 命令语句又可以被添加到由登录 shell 读取的配置文件中,作用于特定的 shell 用户。

语法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
ulimit [-SHacdefilmnpqrstuvx] [限制]

参数:
-a:列出系统所有资源限制的值
-c:当某些程序发生错误时,系统可能会将该程序在内存中的信息写成文件(除错用),这种文件就被称为核心文件(core file)。此为限制每个核心文件的最大容量
-d:每个进程数据段的最大值
-f:当前shell可创建的最大文件容量
-l:可以锁定的物理内存的最大值
-m:可以使用的常驻内存的最大值,单位为KB
-n:每个进程可以同时打开的最大文件句柄数
-p:管道的最大值,单位512字节
-s:堆栈的最大值,单位为KB
-t:每个进程可以使用CPU的最大时间,单位为秒
-u:每个用户运行的最大进程并发数
-v:当前shell可使用的最大虚拟内存,单位为KB
-S:表示软限制,超出设定的值会告警
-H:表示硬限制,超出设定的值会报错

示例

查看系统用户所有限制值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[fenglepeng@centos]# ulimit -a
core file size (blocks, -c) 0 # core文件的最大值为100 blocks。
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 # 所能锁住的文件的最大个数没有限制。

软限制和硬限制

ulimit 的限制分为硬限制和软限制,这里并不是硬件的限制和软件的限制的意思,硬限制是可以在任何时候任何进程中设置,但硬限制只能由超级用户,也就是 root 用户进行设置,软限制是内核实际执行的限制,任何进程都可以将软限制设置为任意小于等于对进程限制的硬限制的值,说白了,硬限制是个硬指标,root 用户设置后,其他用户配置的软限制不能超过这个值,硬限制用-H参数,软限制用-S参数,如果不指定参数,会同时把两类限制都改掉,比如 root 用户修改 open files 硬参数

  • 软限制起实际限制作用,但不能超过而硬限制(除非有root权限)【所以,ulimit 默认显示的是软限制的值】
  • 普通用户可以在硬限制范围内,更改自己的软限制。
  • 普通用户都可以缩小硬限制,但不能扩大硬限制。而 root 缩小扩大都可以。

临时修改 ulimit

ulimit [-SHacdefilmnpqrstuvx] [限制]。在命令[限制]处,设置值,即可调整限制值,只对当前shell有效。S表示软限制;H表示硬限制;如果不指明,则表示软硬皆设置。

1
2
3
4
5
[fenglepeng@centos]# ulimit -u
4096
[fenglepeng@centos]# ulimit -u 65535
[fenglepeng@centos]# ulimit -u
65535

临时设置用户 open files(用户可以打开文件的最大数目)

1
ulimit -n 4096

永久生效 ulimit

修改 limits.conf 文件,内容如下

1
2
3
4
5
6
[fenglepeng@centos]# vim /etc/security/limits.conf

* soft nofile 65536
* hard nofile 65536
* soft nproc 65536
* hard nproc 65536
  • * 代表针对所有用户
  • nproc 代表最大进程数
  • nofile 代表单个进程的最大文件打开数。
    • Linux 下一切资源皆文件,普通文件是文件,磁盘打印机是文件,socket 当然也是文件。在 Linux 下创建一个新的socket 连接,实际上就是创建一个新的文件描述符。
    • nginx 如果开启4个进程维持用户链接,那么整个nginx能够同时维持的连接数不会超过4*1024个,也就是说最多只能支持4×1024个用户在线。
  • hard/soft:soft是一个警告值,而hard则是一个真正意义的阀值,超过就会报错

/etc/security/limits.d/*.conf 中的配置会覆盖 /etc/security/limits.conf 中的配置

/etc/security/limits.conf 配置详解

格式:

1
<domain> <type> <item> <value>
  • domain 是指生效实体
    • 用户名
    • 也可以通过@group指定用户组
    • 使用*表示默认值
  • type指限制类型
    • soft软限制
    • hard硬限制
  • item限制资源
    • coreulimit -c
    • dataulimit -d
    • fsizeulimit -f
    • memloculimit -l
    • nofileulimit -n
    • stackulimit -s
    • cpuulimit -t
    • nproculimit -u
    • maxlogins指定用户可以同时登陆的数量
    • maxsyslogins系统可以同时登陆的用户数
    • priority用户进程运行的优先级
    • locks用户可以锁定的文件最大值
    • sigpengdingulimit -i
    • msgqueueulimit -q

Linux 命令之 ulimit
https://flepeng.github.io/002-Linux-21-命令-Linux-命令之-ulimit/
作者
Lepeng
发布于
2021年7月5日
许可协议