[Linux]常⽤命令之【ulimit(资源限制)】
0常见问题
[WARN]2018-06-1516:55:20,831--NewI/Orverboss#1([id:0x55007b59,/0.0.0.0:20880])--[verSocketPipelineSink][DUBBO]Failedtoacceptaconnection.,dubboversion:2.8.3.2,currenthost:12
ption:Toomanyopenfiles(打开⽂件数过多)
0(NativeMethod)~[na:1.7.0_09-icedtea]
(:226)~[na:1.7.0_09-icedtea]
verSocketPipelineSink$(:244)~[:na]
ker(:1110)[na:1.7.0_09-icedtea]
PoolExecutor$(:603)[na:1.7.0_09-icedtea]
(:722)[na:1.7.0_09-icedtea]
Toomanyopenfiles这个问题主要指的是进程企图打开⼀个⽂件,或者叫句柄,但是现在进程打开的句柄已经达到了上限,已经⽆法打开新句柄了。
常见的原因:(参考lsof的type属性)
1)⽂件IO流未及时关闭:⽂件夹、【⽂件】等
2)⽹络IO流未及时关闭:【TCP】/UDP/【Socket】/WebSocket/数据库连接等
1ulimit概述
在linux下⼀切皆⽂件,开启⼀个进程就是打开⼀个⽂件,控制ulimit⼤⼩作⽤等同于限制进程及其⼦进程的资源使⽤
1.1概述
系统性能⼀直是⼀个受关注的话题,如何通过最简单的设置来实现最有效的性能调优,如何在有限资源的条件下保证程序的运作?
ulimit是Linux在处理这些问题时,经常使⽤的⼀种简单⼿段。
ulimit是⼀种Linux系统的内建功能,它具有⼀套参数集,⽤于为由它⽣成的shell进程及其⼦进程的资源使⽤设置限制。
ulimit:显⽰(或设置)⽤户可以使⽤的资源的限制(limit),这限制分为【软限制(当前限制)】和【硬限制(上限)】。
其中:硬限制是软限制的上限值,应⽤程序在运⾏过程中使⽤的系统资源不超过相应的软限制,任何的超越都导致进程的终⽌。
ulimit不限制⽤户可以使⽤的资源,但可设置对可打开的最⼤⽂件数(maxopenfiles)和可同时运⾏的最⼤进程数(maxurprocess)等限制。
Exception:Toomanyopenfiles
-bash:fork:retry:没有⼦进程
ulimit⽤于限制shell进程/程序所占⽤的资源,⽀持以下资源类型的限制:
所创建的内核⽂件的⼤⼩
进程数据块的⼤⼩
Shell进程创建⽂件的⼤⼩
内存锁住的⼤⼩
常驻内存集的⼤⼩
打开⽂件描述符的数量(maxopenfiles)
分配堆栈的最⼤⼤⼩
CPU时间
单个⽤户的最⼤线程数
Shell进程所能使⽤的最⼤虚拟内存
同时,它⽀持对【硬资源】和【软资源】的限制
作为临时限制,ulimit可以作⽤于通过使⽤其命令登录的shell会话,在会话终⽌时便结束限制,并不影响于其他shell会话。
⽽对于长期的固定限制,ulimit命令语句⼜可以被添加到由登录shell读取的⽂件中,作⽤于特定的shell⽤户。
1.2语法
ulimit
[-a]#显⽰/设置⽬前设定的所有资源类型的资源限制;显⽰当前的各种⽤户进程限制
[-c
[-H]#指定设置某个给定资源的硬极限。如果⽤户拥有root⽤户权限,可以增⼤硬极限。任何⽤户均可减少硬极限
#设定资源的硬性限制,也就是管理员所设下的限制。
[-d<数据节区/数据段⼤⼩>]#显⽰/设定⼀个进程程序的数据段的最⼤值,单位为KB
Eg:ulimit-dunlimited
[-f<⽂件⼤⼩>]#shell所能创建的⽂件⼤⼩的最⼤值,单位为区块(blocks)
[-m<内存⼤⼩>]#指定可使⽤内存的上限,单位为KB
Eg:ulimit-munlimited
[-l<物理内存⼤⼩>]#设置可锁住的物理内存的最⼤值
[-v<虚拟内存⼤⼩>]#设置Shell可使⽤的虚拟内存的最⼤值,单位:KB
Eg:ulimit-vunlimited
[-n<⽂件数⽬>]#指定每个进程最多可打开的⽂件数,默认值:1024
Eg:ulimit-n4096将每个进程可以打开的⽂件数⽬加⼤到4096,缺省为1024
[-p<缓冲区⼤⼩>]#指定管道缓冲区的⼤⼩,单位:block;1block=512byte
[-s<堆栈⼤⼩>]#指定堆栈的上限,单位为KB
Eg:ulimit-sunlimited
[-S]#设置为给定的资源设置软极限。软极限可增⼤到硬极限的值。如果-H和-S标志均未指定,极限适⽤于以上⼆者
[-t
#ulimit-t:Themaximumamountofcputimeinconds/超过硬CPU限制就简单粗暴的让进程“被⾃杀”了。
Eg:ulimit-tunlimited
[-u<程序数⽬>]#⽤户最多可开启的程序数⽬/设定可以运⾏的最⼤并发进程数
2命令详解
查看:【系统(所有进程、所有⽤户)】所有资源限制项
ulimit-a
#查看系统⽤户所有限制项及其值
查看:【指定进程】的所有资源限制项
查看当前进程的可打开的最⼤资源数(Limit/SoftLimit/HardLimit/Units)
cat/proc/
ulimit-a
设置:【指定⽤户】打开⽂件的【最⼤限制数】
ulimit-n4096
#设置⽤户openfiles
⽤户可以打开⽂件的最⼤数⽬;
执⾏该命令⾮root⽤户只能设置到4096,想要设置到8192需要sudo权限或者root⽤户
查看:【系统(所有进程)】打开⽂件的【最⼤限制数】
cat/proc/sys/fs/file-max
#查看系统(所有进程)打开⽂件的【最⼤限制数】
查看:【系统(所有进程)】【当前实际】的打开⽂件数
lsof|wc-l
#查看系统当前打开的⽂件数量
会动态变化
查看:【各个进程】【当前实际】的打开⽂件数
lsof-n|awk'{print$2}'|sort|uniq-c|sort-nr|more
查看:【指定进程】【当前实际】的打开⽂件数
lsof-p
#查看指定进程的打开⽂件数量【重要命令】
注:lsof只能以root权限执⾏;安装lsof:yuminstall-ylsof
查看:【指定进程】【当前实际】占⽤的⽂件句柄详情
lsof|grep
#进程名称/PID/进程所有者/⽂件描述符/⽂件类型
⽂件类型:
DIR:表⽰⽬录。
CHR:表⽰字符类型。
BLK:块设备类型。
UNIX:UNIX域套接字。
FIFO:先进先出(FIFO)队列。
IPv4:⽹际协议(IP)套接字。
DEVICE:指定磁盘的名称
SIZE:⽂件的⼤⼩
NODE:索引节点(⽂件在磁盘上的标识)
NAME:打开⽂件的确切名称
3场景⽰例
查看当前最终各类资源限制的情况:ulimit-a
暂时地⽣效:适⽤于通过ulimit命令登录shell会话期间。
永久地⽣效:通过将⼀个相应的ulimit语句添加到由登录shell读取的⽂件中,即特定于shell的⽤户资源⽂件
[永久配置⽣效的思路]
/home/urName/.*profile
/home/urName/.bash_profile[下列是样例配置]
ulimit-u10240
/etc/curity/[下列是样例配置]
elasticarchsoftnofile65536
elasticarchhardnofile65536
elasticarchsoftmemlockunlimited
elasticarchhardmemlockunlimited
*softnofile122800
*hardnofile122800
*softnproc122800
*hardnproc122800
/etc/curity/limits.d/
/etc/curity/limits.d/
/etc/curity/limits.d/
/etc/curity/limits.d/
/etc/curity/limits.d/
/etc/curity/limits.d/
/etc/curity/limits.d/
/etc/curity/limits.d/
/etc/curity/limits.d/
场景1:[永久⽣效]解除Linux系统的最⼤进程数/最⼤⽂件打开数限制
*代表针对所有⽤户
noproc代表最⼤进程数
nofile代表最⼤⽂件打开数
-H:hardlimit,严格的设定,必定不能超过这个设定的数值
-S:softlimit,警告的设定,可以超过这个设定值,但是若超过则有警告信息
vi/etc/curity/#新增如下4⾏后,重新登录OS
#*softnoproc11000
*hardnoproc11000
*softnofile4100
*hardnofile4100
场景2:[永久⽣效]配置环境变量=>使ulimit命令配置永久⽣效
[⽅式1-系统环境变量]修改所有linux⽤户的环境变量⽂件
vi/etc/profile
ulimit-u10000
ulimit-n4096
ulimit-dunlimited
ulimit-munlimited
ulimit-sunlimited
ulimit-tunlimited
ulimit-vunlimited
source/etc/profile#使环境变量的配置⽣效
cat/proc/sys/fs/file-max#查看系统句柄⽂件最⼤数
lsof|wc-l#查看现在已占⽤的⽂件句柄数
[⽅式2-(当前)⽤户的环境变量]
vi~/.bash_profile
ulimit-n1024
source~/.bash_profile
重新登陆
场景3:[暂时⽣效]
把Linux中某⽤户的最⼤进程数设为10000个
ulimit-u10240
设置每个进程可打开的⽂件数⽬为4096
default:1024
ulimit-n4096
对于需要做许多socket连接并使它们处于打开状态的Java应⽤程序⽽⾔,最好通过使⽤ulimit-nxx修改每个进程可打开的⽂件数,缺省值是1024。
设置其它资源为⽆限制(unlimited)【推荐】
数据段长度:ulimit-dunlimited
最⼤内存⼤⼩:ulimit-munlimited
堆栈⼤⼩:ulimit-sunlimited
CPU时间:ulimit-tunlimited
虚拟内存:ulimit-vunlimited
场景4:让SSH接受Login程式的登⼊,⽅便在ssh客户端查看ulimit-a资源限制
vi/etc/ssh/sshd_config
把UrLogin的值改为yes,并把#注释去掉
/etc/init.d/sshdrestart#重启sshd服务
X参考/推荐⽂献
本文发布于:2022-12-31 22:49:20,感谢您对本站的认可!
本文链接:http://www.wtabcd.cn/fanwen/fan/90/68314.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |