专栏首页运维研习社搞懂ulimit资源限制

搞懂ulimit资源限制

运维系统调优的过程中,必然会遇到的一个问题就是资源限制,在linux中,ulimit命令是用于控制shell程序的资源限制,它是linux的shell内建指令(可以用type命令查看命令是内建还是外部)

今天详细介绍下ulimit,通过对各参数的配置实验,详细了解ulimit的每条限制参数的意义及作用

配置及生效

配置及生效问题是最常遇到的,所以放在前面

对于ulimit的配置,配置文件在/etc/security/limits.conf以及limits.d下面的文件,CentOS6中,limits.d下面通常默认是90-nproc.conf,CentOS7中,通常是20-nproc.conf,nproc是限制每个用户创建进程数的,所以这部分配置通常是限制用户创建进程数的,至于前面的数字,我们通过源码查看

从源码中可以看到,是先读取limits.conf,接着如果limits.d目录下有配置文件的话,也会读取,所以意味着limits.d下面的配置会覆盖limits.conf中相同的配置,比如我们在limits.conf中设置root用户的nproc,然后在limits.d下面的配置文件中同样设置root用户的nproc,看下效果,nproc对应的是-u,也就是max user processes

首先看下当前root用户的nproc设置

root用户的nproc是没限制的,至于为什么是3616,我们待会儿最后说,现在分别在limits.conf和20-nproc.conf中对root用户的nproc进行修改

重新登录后,查看

可以看到,是20-nproc.conf文件中的生效

所以上面的数字,没有特殊的意义,多个配置文件的时候,就是起到了顺序的作用

我们都知道,linux下limit的限制是由pam_limits.so来执行的,PAM下次有机会再讲,我们通过查找/etc/pam.d下面模块中对pam_limits.so的调用,看下有哪些模块调用了该库

pam中的配置分四列:

第一列代表模块类型

第二列代表控制标记

第三列代表模块路径

第四列代表模块参数

从上面可以看到,调用pam_limits.so都是session的管理方式,session的管理方式代表这个模块用来定义用户登陆前,及用户退出后所要进行的操作,如登录连接信息,用户数据的打开与关闭,挂载文件系统等

这也就是为什么通过ulimit命令修改的配置,只对当前session生效,而如果是通过配置文件修改的ulimit,则需要重新登录会话才能生效,后面实验我们会看到

硬限制和软限制

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

接着切换到nginx用户,修改open files参数,指定的值超过硬限制,提示不允许操作

指定不超过硬限制的值,则可以正常修改

接着修改软限制值小于硬限制

同样root用户也没办法将软限制设置为大于硬限制

有些文章中说,普通用户可以缩小硬限制,但是不能扩大硬限制,这边尝试了下

似乎行不通,接着直接不指定参数测试

不指定-H参数的话,可以将参数值改为小于root设置的硬参数值,但是大于的话,就会提示不允许修改

然后测试的过程中你会发现,在普通用户下,修改了不管是硬参数还是软参数,退出当前session,之后,重新切换到该用户之后,ulimit参数又变回到配置文件中的设定,这里就又回到上面说的pam_limits.so的调用中,sudo模块中有调用pam_limits.so模块,关于用户登录session,可以看一下之前的一篇文章"我的服务器被登录了吗?"

unlimited是多少

通过ulimit -a可以看到当前session的所有ulimit配置中

可以看到很多unlimited,这些unlimited表示就是不限制的意思,这里要说的ulimited是多少,指的是上面提到的,nproc的不限制

上面配置root的nproc为unlimited的时候,我们看到ulimit -a查看显示3616

这个3616到底是怎么来的,我们通过分析内核参数,可以发现在fork.c中有这么一段定义RLIMIT_NPROC的

可以看到默认的值是max_threads/2,接着分析下max_threads,其中mempages是机器的物理页面个数,THREAD_SIZE是8K,通过ulimit -s查看,PAGE_SIZE是4k,通过getconf PAGESIZE查看

我们算下

max_threads=mempages(2592368 kB)/(8/4)/8=162023

而nproc需要max_threads/2,这样算下来和3616相差有点远

最后发现,可以通过查看/proc/sys/kernel/thread-max的值来作为max_threads的话,正好符合nproc的值

查了另外一个系统,同样

所以这里没太查明白fork.c中定义的这个max_threads值到底是怎么计算的,反正目前看是有threads-max来确定nproc大小的,如果设置为不限制的情况下

如果有了解的同学,欢迎下面留言讨论

接着就是介绍各参数的作用,其实通过help ulimit,可以很清楚的看到里面对于每个参数的解释

所以这里就只是对每个参数进行一个实验性的修改测试,看下具体会影响到哪些情况,我们就以ulimit -a显示的顺序在下篇文章中介绍。

本文分享自微信公众号 - 运维研习社(gh_4135e2716ad3),作者:运维研习社

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-07-04

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 实例详解ulimit每个参数

    core file size是限制core文件的大小,默认情况下是0,就是没有打开的,ulimit -c参数代表core file size,单位是blocks...

    李俊鹏
  • Linux历史命令的记录与隐藏

    linux下历史命令通常有两大用处,一个是快速复用,另外是审计,快速复用在之前的文章linux命令行技巧中提过,有兴趣的可以去看看,今天主要说审计部分,分两部分...

    李俊鹏
  • 记一次linux远程登录导致的CPU100%

    刚开始远程工作,就接到短信告警,系统CPU占用过高,立即登录系统查看,登录的过程异常缓慢,不过总算登录了

    李俊鹏
  • CentOS 7系统中安装Eclipse

    版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/...

    魏晓蕾
  • 武大赏樱预约不到名额?YouVisit AR旅游应用,带你重回校园

    VRPinea
  • Linux的usermod命令,用户密码管理,mkpasswd命令

    usermod命令是用于更改用户属性的一个命令,usermod和useradd的用法相似,此命令的几种用法:

    端碗吹水
  • 富人越富,穷人越穷,我为什么反对PoS

    很多人都在大力倡导使用权益证明,笔者看来,权益证明并不是什么灵丹妙药,从多个角度都能发现它的缺点。

    区块链大本营
  • 【小家java】java5新特性(简述十大新特性) 重要一跃

    所谓类型擦除指的就是Java源码中的范型信息只允许停留在编译前期,而编译后的字节码文件中将不再保留任何的范型信息。也就是说,范型信息在编译时将会被全部删除,其中...

    YourBatman
  • POS 权益证明究竟是什么

    翻译/校对: Mika 本文为 CDA 数据分析师原创作品,转载需授权 观看更多国外公开课,点击"阅读原文" 权益证明(POS)与工作量证明(POW)都有些什么...

    CDA数据分析师
  • 如何用数学知识提升情商?数学学霸们的6大思维习惯

    大数据文摘

扫码关注云+社区

领取腾讯云代金券