前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >搞懂ulimit资源限制

搞懂ulimit资源限制

作者头像
李俊鹏
发布于 2020-07-07 04:16:41
发布于 2020-07-07 04:16:41
6.7K0
举报
文章被收录于专栏:运维研习社运维研习社

运维系统调优的过程中,必然会遇到的一个问题就是资源限制,在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显示的顺序在下篇文章中介绍。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-07-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 运维研习社 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
limit资源限制ulimit 详解
系统性能一直是一个受关注的话题,如何通过最简单的设置来实现最有效的性能调优,如何在有限资源的条件下保证程序的运作,ulimit 是我们在处理这些问题时,经常使用的一种简单手段。ulimit 是一种 Linux 系统的内键功能,它具有一套参数集,用于为由它生成的 shell进程及其子进程的资源使用设置限制。
黄规速
2022/04/15
7.7K0
limit资源限制ulimit 详解
容器中的ulimit
使用的是公有云,最近要对k8s版本进行升级,在升级之后发发现从我们的web terminal 进入到容器, 拥有sudo权限的用户无法进行sudo命令,即使使用root通过docker exec 进入到容器,依旧无法sudo
有点技术
2020/07/13
6.8K1
容器中的ulimit
故障分析:从Oracle数据库故障到Linux nproc算法
某日,朋友跟我讨论他巡检oracle数据库时遇到的一个情况,在使用root用户切换grid用户时报错-bash: fork: retry: Resource temporarily unavailable,一般这个报错都是因为/etc/security/limits.conf或/etc/security/limits.d/下相关用户nproc设置过小导致,但是定位一波三折,最终了解清楚了nproc参数生成、限制,将案例详细分享,供大家参考。
数据和云
2021/03/09
1.2K0
故障分析:从Oracle数据库故障到Linux nproc算法
使用ulimit 命令、/etc/security/limits.conf、proc 调整系统参数
Linux是有文件句柄限制的,而且Linux默认不是很高,一般都是1024,生产服务器用其实很容易就达到这个数量 系统总限制是在这里,/proc/sys/fs/file-max.可以通过cat查看目前的值,修改/etc/sysctl.conf 中也可以控制. /proc/sys/fs/file-nr,可以看到整个系统目前使用的文件句柄数量 linux 中数据的含义 /proc/sys/fs/file-nr [root@localhost logs]# cat /proc/sys/fs/fi
sunsky
2020/08/20
2K0
ulimit命令详解
ulimit用来限制每个用户可使用的资源,如CPU、内存、句柄等。下面以CentOS 6.5为例进行总结。
用户5807183
2019/10/10
2.3K0
ulimit命令详解
linux修改limits.conf不生效
为了优化linux性能,可能需要修改这个最大值。临时修改的话ulimit -n 204800就可以了,重启后失效。
误入歧途
2024/05/08
1.3K0
C语言: ---Linux下ulimit是什么鬼
其实ulimit的讲解不属于C或者C++ 语言范畴,他只是在我们日常开发或者线上linux运行环境不可缺少的工具。
用户3479834
2021/02/03
4.1K0
查看修改Linux最大进程数和最大文件数的方法
执行命令:ulimit -a即可查看当前Linux操作系统的最大进程数、最大文件数 示例:
用户1685462
2021/08/27
5.9K0
ulimit: open files: cannot modify limit: Operation not permitted
      在从root用户切换到oracle用户时,碰到了ulimit: open files: cannot modify limit: Operation not permitte的提示信息。字面意思来看即是打开文件受到了限制。同一服务器上,如仅有一个Oracle单实例且数据文件较少的情形应该不会出现该情形。多实例可能会碰到这个情况。由于多个实例都为Oracle用户所有,因此Oracle用户可操作的文件数为所有实例文件数的总和,超出了限制就收到错误提示。
Leshami
2018/08/14
4.2K0
Linux 性能调优之资源限制(ulimit&Cgroup)
对每个人而言,真正的职责只有一个:找到自我。然后在心中坚守其一生,全心全意,永不停息。所有其它的路都是不完整的,是人的逃避方式,是对大众理想的懦弱回归,是随波逐流,是对内心的恐惧 ——赫尔曼·黑塞《德米安》
山河已无恙
2023/11/07
1.5K0
Linux 性能调优之资源限制(ulimit&Cgroup)
Ubuntu /etc/security/limits.conf 不生效问题
注意:修改了/etc/security/limits.conf ,必须要重启,才能生效。
py3study
2020/02/26
3.4K0
Linux下安装Oracle的过程和涉及的知识点-系列3
binutils-2.20.51.0.2-5.11.el6 (x86_64) compat-libcap1-1.10-1 (x86_64) compat-libstdc++-33-3.2.3-69.el6 (x86_64) compat-libstdc++-33-3.2.3-69.el6.i686 gcc-4.4.4-13.el6 (x86_64) gcc-c++-4.4.4-13.el6 (x86_64) glibc-2.12-1.7.el6 (i686) glibc-2.12-1.7.el6 (x86_64) glibc-devel-2.12-1.7.el6 (x86_64) glibc-devel-2.12-1.7.el6.i686 ksh libgcc-4.4.4-13.el6 (i686) libgcc-4.4.4-13.el6 (x86_64) libstdc++-4.4.4-13.el6 (x86_64) libstdc++-4.4.4-13.el6.i686 libstdc++-devel-4.4.4-13.el6 (x86_64) libstdc++-devel-4.4.4-13.el6.i686 libaio-0.3.107-10.el6 (x86_64) libaio-0.3.107-10.el6.i686 libaio-devel-0.3.107-10.el6 (x86_64) libaio-devel-0.3.107-10.el6.i686 make-3.81-19.el6 sysstat-9.0.4-11.el6 (x86_64)
bisal
2019/01/29
5860
说来惭愧,我被ulimit摔了一跤...
自接触 linux 后,大家所受的教育就是 ulimit是最便捷的内核优化途径,事实也确实如此。
运维部落
2020/08/28
1.2K0
说来惭愧,我被ulimit摔了一跤...
高并发下linux ulimit优化
系统性能一直是一个受关注的话题,如何通过最简单的设置来实现最有效的性能调优,如何在有限资源的条件下保证程序的运作,ulimit 是我们在处理这些问题时,经常使用的一种简单手段。ulimit 是一种 linux 系统的内键功能,它具有一套参数集,用于为由它生成的 shell 进程及其子进程的资源使用设置限制。
用户7639835
2021/11/19
2.7K0
经典错误——使用/etc/security/limits.conf配置文件 和 ulimit -n命令
很多以讹传讹的半桶水文章,都教人修改/etc/security/limits.conf配置文件来放宽“打开的文件数量”限制,如果可以再多一滴水的话,还会加一句“重启后生效”。
julyclyde
2023/12/18
1.9K0
linux 系统 ulimit 对系统资源限制
文件系统及程序的限制关系: ulimit ulimit 限制用户的某些系统资源 包括可以开启的档案数量 可以使用的 CPU 时间 可以使用的内存总量等。 [root@www ~]# ulimit [-acdfHlmnpsStvw] [size] 选项与参数: -H : hard limit ,严格的设定,必定不能超过这个设定的数值 -S : soft limit ,警告的设定,可以超过这个设定值,但是若超过则有警告讯息 -a : 后面不接任何选项与参数,可列出所有的限制额度 -c : 当某些程序发生错误时,系统可能会将该程序在内存中的信息写成档案,这种档案就被称为核心档案(core file)。 -f : 此 shell 可以建立的最大档案容量(一般可能设定为 2GB)单位为 Kbytes -d : 程序可使用的最大断裂内存(segment)容量 -l : 可用于锁定 (lock) 的内存量 -m : 设置可以使用的常驻内存的最大值.单位:kbytes -n : 设置内核可以同时打开的文件描述符的最大值.单位:n -p : 设置管道缓冲区的最大值.单位:kbytes -s : 设置堆栈的最大值.单位:kbytes -v : 设置虚拟内存的最大值.单位:kbytes -t : 可使用的最大 CPU 时间 (单位为秒) -u : 单一用户可以使用的最大程序(process)数量 一般简单设置:ulimit -SHn 65535 让其永久生效: [root@www ~]# vi /etc/security/limits.conf * soft noproc 65535 * hard noproc 65535 * soft nofile 409600 * hard nofile 409600 * 代表针对所有用户 noproc 是代表最大进程数 nofile 是代表最大文件打开数 生产环境的案例: [root@www ~]# vi /etc/security/limits.conf # End of file * soft core unlimit * hard core unlimit * soft fsize unlimited * hard fsize unlimited * soft data unlimited * hard data unlimited * soft nproc 65535 * hard nproc 63535 * soft stack unlimited * hard stack unlimited * soft nofile 409600 * hard nofile 409600
heidsoft
2018/10/16
2.6K0
Elasticsearch启动常见问题
分析: 默认分配的JVM内存为2g,所以当小内存的机器,默认启动的话,会报如上错误。
后场技术
2021/03/24
1.3K0
ulimits不生效导致数据库启动失败和相关设置说明
上面的错误日志非常清晰的指向了 open files 相关设置,于是查看 ulimit 信息
GreatSQL社区
2023/02/23
1.1K0
Linux 下安装 Elasticsearch
Elasticsearch 就不过多介绍了,可以自行百度或者查看上一篇文章《windows10安装ElasticSearch》
王图思睿
2021/06/15
4230
资源限制问题
ulimit 是一个 shell 内置命令,用于设置当前 shell 会话的资源限制。
是山河呀
2025/02/03
990
相关推荐
limit资源限制ulimit 详解
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档