[Linux]常⽤命令之【ulimit(资源限制)】
0 常见问题
[WARN ] 2018-06-15 16:55:20,831 --New I/O server boss #1 ([id: 0x55007b59, /0.0.0.0:20880])-- [org.jbossty.channel.socket.nio.NioServerSocketPipelineSink] [DUBBO] Failed to accept a connection., dubbo version: 2.8.3.2, current host: 12 java.io.IOException: Too many open files (打开⽂件数过多)
at sun.nio.ch.ServerSocketChannelImpl.accept0(Native Method) ~[na:1.7.0_09-icedtea]
at sun.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.java:226) ~[na:1.7.0_09-icedtea]
at org.jbossty.channel.socket.nio.NioServerSocketPipelineSink$Boss.run(NioServerSocketPipelineSink.java:244) ~[netty-3.2.5.Final.jar:na]
at urrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) [na:1.7.0_09-icedtea]
at urrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) [na:1.7.0_09-icedtea]
at java.lang.Thread.run(Thread.java:722) [na:1.7.0_09-icedtea]
Too many open files这个问题主要指的是进程企图打开⼀个⽂件,或者叫句柄,但是现在进程打开的句柄已经达到了上限,已经⽆法打开新句柄了。
常见的原因: (参考 lsof 的 type 属性)
1)⽂件IO流未及时关闭:⽂件夹、【⽂件】等
2)⽹络IO流未及时关闭:【TCP】 / UDP / 【Socket】 / WebSocket / 数据库连接等
1 ulimit 概述
在linux下⼀切皆⽂件,开启⼀个进程就是打开⼀个⽂件,控制ulimit⼤⼩作⽤等同于限制进程及其⼦进程的资源使⽤
1.1 概述
系统性能⼀直是⼀个受关注的话题,如何通过最简单的设置来实现最有效的性能调优,如何在有限资源的条件下保证程序的运作?
ulimit 是Linux在处理这些问题时,经常使⽤的⼀种简单⼿段。
ulimit 是⼀种 Linux 系统的内建功能,它具有⼀套参数集,⽤于为由它⽣成的 shell进程及其⼦进程的资源使⽤设置限制。
ulimit: 显⽰(或设置)⽤户可以使⽤的资源的限制(limit),这限制分为【软限制(当前限制)】和【硬限制(上限)】。
其中:硬限制是软限制的上限值,应⽤程序在运⾏过程中使⽤的系统资源不超过相应的软限制,任何的超越都导致进程的终⽌。
ulimit 不限制⽤户可以使⽤的资源,但可设置对可打开的最⼤⽂件数(max open files)和可同时运⾏的最⼤进程数(max user processes)等限制。
java.SocketException: Too many open files
-bash: fork: retry: 没有⼦进程
linux vi命令详解菜鸟教学ulimit ⽤于限制 shell 进程/程序所占⽤的资源,⽀持以下资源类型的限制:
所创建的内核⽂件的⼤⼩
进程数据块的⼤⼩
Shell进程创建⽂件的⼤⼩
内存锁住的⼤⼩
常驻内存集的⼤⼩
打开⽂件描述符的数量 (max open files)
分配堆栈的最⼤⼤⼩
CPU 时间
单个⽤户的最⼤线程数
Shell 进程所能使⽤的最⼤虚拟内存
同时,它⽀持对【硬资源】和【软资源】的限制
作为临时限制,ulimit 可以作⽤于通过使⽤其命令登录的 shell 会话,在会话终⽌时便结束限制,并不影响于其他 shell 会话。
⽽对于长期的固定限制,ulimit 命令语句⼜可以被添加到由登录 shell 读取的⽂件中,作⽤于特定的 shell ⽤户。
1.2 语法
ulimit
[-a] # 显⽰/设置⽬前设定的所有资源类型的资源限制; 显⽰当前的各种⽤户进程限制
[-c <core⽂件上限>] # 显⽰/设定 core⽂件的最⼤值,单位为区块(blocks)
[-H] # 指定设置某个给定资源的硬极限。如果⽤户拥有 root ⽤户权限,可以增⼤硬极限。任何⽤户均可减少硬极限
# 设定资源的硬性限制,也就是管理员所设下的限制。
[-d <;数据节区/数据段⼤⼩>] # 显⽰/设定⼀个进程程序的数据段的最⼤值,单位为 KB
Eg: ulimit -d unlimited
[-f <⽂件⼤⼩>] # shell所能创建的⽂件⼤⼩的最⼤值,单位为区块(blocks)
[-m <;内存⼤⼩>] # 指定可使⽤内存的上限,单位为KB
Eg: ulimit -m unlimited
[-l <;物理内存⼤⼩>] # 设置可锁住的物理内存的最⼤值
[-v <;虚拟内存⼤⼩>] # 设置 Shell可使⽤的虚拟内存的最⼤值,单位:KB
Eg: ulimit -v unlimited
[-n <⽂件数⽬>] # 指定每个进程最多可打开的⽂件数,默认值: 1024
Eg: ulimit -n 4096 将每个进程可以打开的⽂件数⽬加⼤到4096,缺省为1024
[-p <;缓冲区⼤⼩>] # 指定管道缓冲区的⼤⼩,单位:block; 1block = 512byte
[-s <;堆栈⼤⼩>] # 指定堆栈的上限,单位为KB
Eg: ulimit -s unlimited
[-S] # 设置为给定的资源设置软极限。软极限可增⼤到硬极限的值。如果 -H 和 -S 标志均未指定,极限适⽤于以上⼆者
[-t <CPU时间>] # 限制CPU运⾏时间; 指定每个进程所使⽤的秒数, 单位:seconds
# ulimit -t : The maximum amount of cpu time in seconds / 超过硬CPU限制就简单粗暴的让进程“被⾃杀”了。
Eg: ulimit -t unlimited
[-u <;程序数⽬>] # ⽤户最多可开启的程序数⽬ / 设定可以运⾏的最⼤并发进程数
2 命令详解
查看:【系统(所有进程、所有⽤户)】所有资源限制项
ulimit -a
# 查看系统⽤户所有限制项及其值
查看:【指定进程】的所有资源限制项
查看当前进程的可打开的最⼤资源数(Limit / Soft Limit / Hard Limit / Units)
cat /proc/<PID>/limits
ulimit -a <PID>
设置:【指定⽤户】打开⽂件的【最⼤限制数】
ulimit -n 4096
# 设置⽤户open files
⽤户可以打开⽂件的最⼤数⽬;
执⾏该命令⾮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 <pid> | wc -l
# 查看指定进程的打开⽂件数量【重要命令】
注: lsof只能以root权限执⾏; 安装lsof: yum install -y lsof
查看:【指定进程】【当前实际】占⽤的⽂件句柄详情
lsof | grep <pid>
# 进程名称 / PID / 进程所有者 / ⽂件描述符 / ⽂件类型
⽂件类型:
DIR:表⽰⽬录。
CHR:表⽰字符类型。
BLK:块设备类型。
UNIX: UNIX 域套接字。
FIFO:先进先出 (FIFO) 队列。
IPv4:⽹际协议 (IP) 套接字。
DEVICE:指定磁盘的名称
SIZE:⽂件的⼤⼩
NODE:索引节点(⽂件在磁盘上的标识)
NAME:打开⽂件的确切名称
3 场景⽰例
查看当前最终各类资源限制的情况:ulimit -a
暂时地⽣效:适⽤于通过 ulimit 命令登录 shell 会话期间。
永久地⽣效:通过将⼀个相应的 ulimit 语句添加到由登录 shell 读取的⽂件中,即特定于 shell 的⽤户资源⽂件[永久配置⽣效的思路]
/home/userName/.*profile
/home/userName/.bash_profile [下列是样例配置]
ulimit -u 10240
/etc/f [下列是样例配置]
elasticsearch soft nofile 65536
elasticsearch hard nofile 65536
elasticsearch soft memlock unlimited
elasticsearch hard memlock unlimited
* soft nofile 122800
* hard nofile 122800
* soft nproc 122800
* hard nproc 122800
/etc/security/limits.f
/etc/security/limits.f
/
etc/security/limits.f
/etc/security/limits.f
/etc/security/limits.f
/etc/security/limits.f
/etc/security/limits.f
/etc/security/limits.f
/etc/security/limits.f
场景1: [永久⽣效] 解除 Linux 系统的最⼤进程数/最⼤⽂件打开数限制*代表针对所有⽤户
noproc 代表最⼤进程数
nofile 代表最⼤⽂件打开数
-H :hard limit ,严格的设定,必定不能超过这个设定的数值
-
S :soft limit ,警告的设定,可以超过这个设定值,但是若超过则有警告信息
vi /etc/f #新增如下4⾏后,重新登录OS#
* soft noproc 11000
* hard noproc 11000
* soft nofile 4100
* hard nofile 4100
场景2: [永久⽣效] 配置环境变量 => 使ulimit命令配置永久⽣效[⽅式1 - 系统环境变量] 修改所有 linux ⽤户的环境变量⽂件
vi /etc/profile
ulimit -u 10000
ulimit -n 4096
ulimit -d unlimited
ulimit -m unlimited
ulimit -s unlimited
ulimit -t unlimited
ulimit -v unlimited
source /etc/profile # 使环境变量的配置⽣效
cat /proc/sys/fs/file-max # 查看系统句柄⽂件最⼤数
lsof |wc -l # 查看现在已占⽤的⽂件句柄数
[⽅式2 - (当前)⽤户的环境变量]
vi ~/.bash_profile
ulimit -n 1024
source ~/.bash_profile
重新登陆
场景3: [暂时⽣效]
把Linux中某⽤户的最⼤进程数设为10000个
ulimit -u 10240
设置每个进程可打开的⽂件数⽬为4096
default: 1024
ulimit -n 4096
对于需要做许多 socket 连接并使它们处于打开状态的 Java 应⽤程序⽽⾔,最好通过使⽤ ulimit -n xx 修改每个进程可打开的⽂件数,缺省值是 1024。
设置其它资源为⽆限制(unlimited)【推荐】
数据段长度: ulimit -d unlimited
最⼤内存⼤⼩: ulimit -m unlimited
堆栈⼤⼩: ulimit -s unlimited
CPU 时间: ulimit -t unlimited
虚拟内存: ulimit -v unlimited
场景4: 让 SSH 接受 Login 程式的登⼊,⽅便在 ssh 客户端查看 ulimit -a 资源限制
vi /etc/ssh/sshd_config
把 UserLogin 的值改为 yes,并把 # 注释去掉
/etc/init.d/sshd restart # 重启 sshd 服务
X 参考/推荐⽂献
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论