一.ulimit命令用来限制系统用户对 shell 资源的访问(这种限制是临时的,推出shell或者重启系统后失效)

ulimit 的功能
假设有这样一种情况,当一台 Linux 主机上同时登陆了 10 个人,在系统资源无限制的情况下,这 10 个用户同时打开了 500 个文档,而假设每个文档的大小有 10M,这时系统的内存资源就会受到巨大的挑战。而实际应用的环境要比这种假设复杂的多,例如在一个嵌入式开发环境中,各方面的资源都是非常紧缺的,对于 开启文件描述符的数量,分配堆栈的大小,CPU 时间,虚拟内存大小,等等,都有非常严格的要求。资源的合理限制和分配,不仅仅是保证系统可用性的必要条件,也与系统上软件运行的性能有着密不可分的联 系。这时,ulimit 可以起到很大的作用,它是一种简单并且有效的实现资源限制的方式。

ulimit 用于限制 shell 启动进程所占用的资源,支持以下各种类型的限制:所创建的内核文件的大小、进程数据块的大小、Shell 进程创建文件的大小、内存锁住的大小、常驻内存集的大小、打开文件描述符的数量、分配堆栈的最大大小、CPU 时间、单个用户的最大线程数、Shell 进程所能使用的最大虚拟内存。同时,它支持硬资源和软资源的限制。作为临时限制,ulimit 可以作用于通过使用其命令登录的 shell 会话,在会话终止时便结束限制,并不影响于其他 shell 会话。而对于长期的固定限制,ulimit 命令语句又可以被添加到由登录 shell 读取的文件中,作用于特定的 shell 用户。

如何使用 ulimit
ulimit 通过一些参数选项来管理不同种类的系统资源。在本节,我们将讲解这些参数的使用。
ulimit 命令的格式为:

ulimit [options] [limit]

ulimit 参数说明:

-H(硬资源限制是真实的限制)
设置硬资源限制,一旦设置不能增加。
ulimit – Hs 64;限制硬资源,线程栈大小为 64K。

-S(软资源限制只会报警提醒,不会真实限制)
设置软资源限制,设置后可以增加,但是不能超过硬资源设置。
ulimit – Sn 32;限制软资源,32 个文件描述符。

-a
显示当前所有的 limit 信息。
ulimit – a;显示当前所有的 limit 信息。

-c
最大的 core 文件的大小, 以 blocks 为单位。
ulimit – c unlimited; 对生成的 core 文件的大小不进行限制。

-d
进程最大的数据段的大小,以 Kbytes 为单位。
ulimit -d unlimited;对进程的数据段大小不进行限制。

-f
进程可以创建文件的最大值,以 blocks 为单位。
ulimit – f 2048;限制进程可以创建的最大文件大小为 2048 blocks。

-l
最大可加锁内存大小,以 Kbytes 为单位。
ulimit – l 32;限制最大可加锁内存大小为 32 Kbytes。

-m
最大内存大小,以 Kbytes 为单位。
ulimit – m unlimited;对最大内存不进行限制。

-n
可以打开最大文件描述符的数量。
ulimit – n 128;限制最大可以使用 128 个文件描述符。

-p
管道缓冲区的大小,以 Kbytes 为单位。
ulimit – p 512;限制管道缓冲区的大小为 512 Kbytes。

-s
线程栈大小,以 Kbytes 为单位。
ulimit – s 512;限制线程栈的大小为 512 Kbytes。

-t
最大的 CPU 占用时间,以秒为单位。
ulimit – t unlimited;对最大的 CPU 占用时间不进行限制。

-u
用户最大可用的进程数。
ulimit – u 64;限制用户最多可以使用 64 个进程。

-v
进程最大可用的虚拟内存,以 Kbytes 为单位。
ulimit – v 200000;限制最大可用的虚拟内存为 200000 Kbytes。

若想使其ulimit限制变成永久性的,则可以将命令添加到环境变量文件/etc/profile中,但是此种方法比较麻烦,因此可以用下边的方式进行设置

二.资源限制配置文件/etc/security/limits.conf(永久生效)

限制资源使用的配置文件是 /etc/security/limits.conf,和/etc/security/limits.d/目录,/etc/security/limits.d/里面配置会覆盖/etc/security/limits.conf的配置

可以限制的资源类型如下:

所创建的内核文件的大小
进程数据块的大小
Shell 进程创建文件的大小
内存锁住的大小
常驻内存集的大小
打开文件描述符的数量
分配堆栈的最大大小
CPU 时间
单个用户的最大线程数
Shell 进程所能使用的最大虚拟内存
(同时,它支持硬资源和软资源的限制。)
  • hard和soft的区别: soft是一个警告值,而hard则是一个真正意义的阀值,超过就会报错,一般情况下都是设为同一个值。

  • 第一列表示用户和组(@开头)。第二列表示软限制还是硬限制,第三列表示限制的资源类型,第四列表示限制的最大值

  • core是内核文件,nofile是文件描述符,noproc是进程,一般情况下只限制文件描述符数和进程数就够了

    # <domain>      <type>  <item>         <value>
    
    
    #*               soft    core            0
    #root            hard    core            100000
    #*               hard    rss             10000
    #@student        hard    nproc           20
    #@faculty        soft    nproc           20
    #@faculty        hard    nproc           50
    #ftp             hard    nproc           0
    #ftp             -       chroot          /ftp
    #@student        -       maxlogins       4
    
    # End of file
    
    -----------分割线,上面是配置文件的模板,下面是自己添加的------------------------
    
    * 			    soft 	nofile         655350      #表示任何一个用户可以打开的最大的文件描述符数量
    *	 		    hard    nofile         655350
    
    * 			    soft    nproc          655350      #表示任何一个用户可以打开的最大的进程数
    *		        hard    nproc          655350
    
    
    @student        hard    nofile          65535       #student组中的任何人最多能打开文件描述符数量是65535,并且会在打开65000个时发出警告
    @student        soft    nofile          65000
    
    @student        hard    nproc           50	        #student组中的任何人不能拥有超过50个进程,并且会在拥有30个进程时发出警告
    @student        soft    nproc           30
    

其他可以设置参数

core - 限制内核文件的大小(KB)

date - 最大数据大小(KB)

fsize - 最大文件大小(KB)

memlock - 最大锁定内存地址空间(KB)

nofile - 打开的文件描述符的最大数目**(经常设置)**

rss - 最大持久设置大小(KB)

stack - 最大堆栈大小(KB)

cpu - 最大CPU时间(min)

noproc - 过程最大数量

as - 地址空间限制(KB)

maxlogins - 此用户的最大登录数量

maxsyslogins - 在系统上登录的最大数目

priority - 优先级运行用户进程

locks -  文件的最大数量锁定用户可容纳

sigpending - 最大挂起信号的数量

msgqueue - 通过POSIX消息队列使用的最大内存(字节)

nice - 最大不错优先允许提高到值:[-20,19]

rtprio - 最大实时优先

修改完重新连接即可生效!

系统级别
1、查看

$ cat /proc/sys/fs/file-max
186405

2、设置

临时性

$ echo 1000000 > /proc/sys/fs/file-max

永久性
在/etc/sysctl.conf中设置,应该设什么值是最佳实践?比如8G的内存,设为8192/2 * 256 = 524288

fs.file-max = 1000000

进程级别
1、查看,-n默认查看的是soft limit,这个值是从/etc/security/limits.conf文件的* soft nofile 655350来的

$ ulimit -n
170000

查看hard limit

$ ulimit -Hn
170000

2、设置

临时性:
通过ulimit -Sn设置最soft limit,注意soft limit必须小于hard limit

$ ulimit -Sn 160000

通过ulimit -Hn设置最Hard limit

$ ulimit -Hn 160000

同时设置soft limit和hard limit。对于非root用户只能设置比原来小的hard limit。

 ulimit -n 180000

永久性:
root权限下,在/etc/security/limits.conf中添加如下两行,*表示所有用户,重启生效

* soft nofile 102400

* hard nofile 104800

注意:设置nofile的hard limit还有一点要注意的就是hard limit不能大于/proc/sys/fs/nr_open,假如hard limit大于nr_open,注销后将无法正常登录。

查看系统当前打开的文件描述符数量
其中第一个数表示当前系统分配后已使用的文件描述符数,第二个数表示分配后为使用的(内核2.6版本中这个值总是为0,这并不是一个错误,它意味着已经分配的文件描述符总会被使用),第三个数等于file-max。

$ sudo cat /proc/sys/fs/file-nr 
2176	0	2048000

查看某个进程打开的文件描述符数量

$ lsof -p 20262 |wc -l
5

根据用户创建的进程数排序

ps h -Led -o user | sort | uniq -c | sort -n

  1 chrony
  1 dbus
  1 hanli
  1 hanli2
  1 nginx
  2 postfix
  4 named
  4 puppet
  6 polkitd
  6 redis
 21 mysql
125 root

总结

 1. /proc/sys/fs/file-max限制不了/etc/security/limits.conftem
 2. 只有root用户才有权限修改/etc/security/limits.conf
 3.  对于非root用户, /etc/security/limits.conf会限制ulimit -n,但是限制不了root用户
 4. 对于非root用户,ulimit -n只能越设置越小,root用户则无限制
 5. 任何用户对ulimit -n的修改只在当前环境有效,退出后失效,重新登录新来  后,ulimit -n由limits.conf决定
 6. 如果limits.conf没有做设定,则默认值是1024
 7. 当前环境的用户所有进程能打开的最大问价数量由ulimit -n决定

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐