Linux ulimit 资源限制

简介

ulimit 是 Linux 的内建命令,用来限制 shell 及 shell 启动的进程所使用的资源。支持硬限制和软限制,硬限制是绝对限制,一旦设置后,非 root 用户就不能提高,而软限制能最多提高到硬限制的值,超过软限制会产生警告。使用 -H 选项指定硬限制,使用 -S 选项指定软限制。

支持多种资源限制,如常用的有:能打开的文件数量,线程栈大小,进程数量等。

使用

查询限制

查询所有限制。打印时如果不指定硬限制或软限制,则打印软限制。

ulimit -a

在这里插入图片描述

查询某一个限制或者组合查询多个。

# 查询用户可以打开的最大文件数(软限制)
ulimit -n
# 同 ulimit -n -S
# 查询用户可以打开的最大文件数(硬限制)
ulimit -n -H

在这里插入图片描述

限制参数如下所示:

  • -c:最大 core 文件大小,单位是 blocks
  • -d:进程最大的数据段的大小,单位是 KB
  • -e:最大调度优先级
  • -f:进程及其子进程能够创建的文件的最大值,单位是 blocks
  • -i:待处理信号的最大数量
  • -l:可加锁内存的最大数量,单位是 KB
  • -m:最大驻留内存大小(许多系统不遵守此限制),单位是 KB
  • -n:能打开的文件描述符的最大数量
  • -p:管道缓冲区的大小,以 512 byte 为单位
  • -q:POSIX 报文队列的最大字节数,单位是 byte
  • -r:最大实时调度优先级
  • -s:最大线程栈大小,单位是 KB
  • -t:最大 CPU 占用时间,单位是秒
  • -u:单个用户的最大可用进程数
  • -v:进程可用的最大虚拟内存,单位是 KB
  • -x:文件锁的最大数量

设置限制

在命令后面加上限制的值即可设置限制,设置时如果不指定硬限制或软限制,则同时设置硬限制和软限制。

# 同时设置硬限制和软限制
ulimit -n 65535
# 设置软限制
ulimit -S -n 65535
# 可以在一个命令中设置多个值
ulimit -d 1000 -m 1000 -v 1000
# 可以使用 unlimited 修改为无限制
ulimit -t unlimited

命令设置只对当前 shell 生效。要想长期对 shell 生效,可以将相关命令加入启动脚本中,或者修改系统配置文件 /etc/security/limits.conf

文件内容大致如下所示:

在这里插入图片描述
文件为表格形式,格式为

<domain>      <type>      <item>         <value>
  • domain 可以为
    • 用户名
    • 用户组名,使用 @group 语法
    • 通配符 * 作为默认值
    • 通配符 % 也可与 %group 语法一起使用,表示最大登录限制
  • type 可以为
    • soft:软限制
    • hard:硬限制
  • item 可以是下列资源
    • core:core 文件大小,单位是 KB
    • data:最大数据大小,单位是 KB
    • fsize:最大文件大小,单位是 KB
    • memlock:可加锁内存,同 -l
    • nofile:能打开的文件描述符数量,同 -n
    • rss:驻留内存大小,同 -m
    • stack:线程栈大小,同 -s
    • cpu:CPU 占用时间,同 -t
    • nproc:进程数,同 -u
    • as:地址空间限制,单位是 KB
    • maxlogins:用户最大登陆数量
    • maxsyslogins:系统最大登陆数量
    • priority:进程运行优先级
    • locks:用户可持有的最大文件锁数量,同 -x
    • sigpending:待处理信号数量,同 -i
    • msgqueue:POSIX 报文队列的最大字节数,同 -q
    • nice:最大可提升的优先级,同 -e
    • rtprio:最大实时调度优先级,同 -r
  • value 为设置的值

修改配置文件后需要重启 shell,可使用 -a 查看是否生效。

案例

Elasticsearch 启动后会同时打开多个数据文件以加速搜索,需要设置 nofile 及 nproc,如果不设置,会产生诸如 “max file descriptors [4096] for elasticsearch process is too low” 这样的错误。需要将 nofile 至少调到 65535,nproc 至少调到 4096。

由于 Linux 下建立 Socket 连接也需要创建文件描述符,因此如果系统有建立了大量连接,也可能因为 nofile 限制过低导致无法建立新的连接,而导致网络请求失败。

  • 17
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值