0 常见问题

[WARN ] 2018-06-15 16:55:20,831 --New I/O server boss #1 ([id: 0x55007b59, /0.0.0.0:20880])-- [org.jboss.netty.channel.socket.nio.NioServerSocketPipelineSink]  [DUBBO] Failed to accept a connection., dubbo version: 2.8.3.2, current host: 127.0.0.1
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.jboss.netty.channel.socket.nio.NioServerSocketPipelineSink$Boss.run(NioServerSocketPipelineSink.java:244) ~[netty-3.2.5.Final.jar:na]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) [na:1.7.0_09-icedtea]
at java.util.concurrent.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.net.SocketException: Too many open files

-bash: fork: retry: 没有子进程

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/security/limits.conf [下列是样例配置]
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.d/20-nproc.conf
/etc/security/limits.d/90-nofile.conf
/etc/security/limits.d/90-nproc.conf /etc/security/limits.d/elasticsearch.conf
/etc/security/limits.d/hbase.conf
/etc/security/limits.d/hdfs.conf
/etc/security/limits.d/hive.conf
/etc/security/limits.d/mapreduce.conf
/etc/security/limits.d/yarn.conf

场景1: [永久生效] 解除 Linux 系统的最大进程数/最大文件打开数限制

* 代表 针对所有用户

noproc 代表 最大进程数

nofile 代表 最大文件打开数

-H :hard limit ,严格的设定,必定不能超过这个设定的数值

-S :soft limit ,警告的设定,可以超过这个设定值,但是若超过则有警告信息

vi /etc/security/limits.conf #新增如下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 参考/推荐文献

[Linux]常用命令之【ulimit(资源限制)】的更多相关文章

  1. linux 常用命令及技巧

    linux 常用命令及技巧 linux 常用命令及技巧:linux 常用命令总结: 一. 通用命令: 1. date :print or set the system date and time 2. ...

  2. linux常用命令的介绍

    本文主要介绍Linux常用命令工具,比如用户创建,删除,文件管理,常见的网络命令等 如何创建账号: 1. 创建用户 useradd -m username -m 表示会在/home 路径下添加创建用户 ...

  3. Linux 常用命令使用方法大搜刮

    Linux 常用命令使用方法大搜刮 1.# 表示权限用户(如:root),$ 表示普通用户  开机提示:Login:输入用户名  password:输入口令   用户是系统注册用户成功登陆后,可以进入 ...

  4. linux常用命令 、查看日志、web排查

    linux常用命令 ps aux|grep xxx (比如 ps aux|grep tomcat ps aux|grep tomcat-portalvip ps aux|grep nginx 等) r ...

  5. linux 常用命令 和 nginx(反响代理、负载均衡)安装和配置

    (1)linux常用命令 [1]在光标前输入内容:i [2]删除输入方式下所输入的文本:Ctrl+u  [3]文件保存退出:wq [4]文件不保存退出:q [5]文件强制退出:q! [6]常规删除文件 ...

  6. linux常用命令和关闭防火墙

    linux常用命令和关闭防火墙   2.        linux常用命令 Mkdir 创建 Rm -rf 删除 Chmod -R 777 权限 Mysql -uroot -r quit退出 find ...

  7. 【Linux】Linux 常用命令汇总

    查看软件xxx安装内容:dpkg -L xxx 查找软件库中的软件:apt-cache search 正则表达式 查找软件库中的软件:aptitude search 软件包 查找文件属于哪个包:dpk ...

  8. Linux常用命令大全(全面)

    笔者在这篇文章中跟大家分享一下接近 100 个 Linux 常用命令大全,希望可以帮助到大家. 1.ls [选项] [目录名 | 列出相关目录下的所有目录和文件 1 2 3 4 5 6 7 8 9 1 ...

  9. Linux常用命令语法+示例

    原文出自:https://blog.csdn.net/seesun2012 Linux常用命令:Linux查看日志命令总结:Tomcat相关:Linux配置网卡,连接外网:Linux下安装JDK:Li ...

  10. linux常用命令 ps

    linux常用命令 ps Linux中的ps命令是Process Status的缩写.ps命令用来列出系统中当前运行的那些进程.ps命令列出的是当前那些线程的快照,就是执行ps命令的那个时刻的那些进程 ...

随机推荐

  1. Python数据分析第七周作业-MySQL的安装及应用

    项目 MySQL 博客名称 2003031126-石升福-Python数据分析第七周作业 班级链接 20级数据班(本) 作业链接 第七周作业 要求 每道题要有题目,代码(使用插入代码,不会插入代码的自 ...

  2. 【.NET】Swagger 允许接口重名

    问题: Swagger Failed to load API definition. 相信用过swagger的小伙伴 一定经历过这样的错误,问题点很简单,是接口重名了. 我百度了一下,找不到答案. 谷 ...

  3. dubbo相关面试题

    1.说说Dubbo的分层? 从大的范围来说,dubbo分为三层,business业务逻辑层由我们自己来提供接口和实现还有一些配置信息,RPC层就是真正的RPC调用的核心层,封装整个RPC的调用过程.负 ...

  4. SDN实验1

    (一)基本要求 使用Mininet可视化工具,生成下图所示的拓扑,并保存拓扑文件名为学号.py. 使用Mininet的命令行生成如下拓扑: a) 3台交换机,每个交换机连接1台主机,3台交换机连接成一 ...

  5. 探究Tomcat

    一.什么是Tomcat? 用来装载javaWeb程序,可以称它为Web容器.是一个运行java的网络服务器,底层是Sochet的一个程序,他也是JSP和Servlet的一个容器. 二.什么要用Tomc ...

  6. 二、pycharm的安装

    1.python安装教程在上一篇已描述,详情查看: 2.安装pycharm 首先从网站下载pycharm:链接为:http://www.jetbrains.com/pycharm/download/# ...

  7. c# 数组 集合 属性访问 设置

    当只修改数组或者集合的某一个特定值时不会经过CLR属性封装器

  8. DataTable 导出到TXT

    public static string cExportTXT(DataView dv) { try { SaveFileDialog saveFileDialog1 = new SaveFileDi ...

  9. HAL层分析

    1. 安卓HAL模块基本 2. 定义hal层代码的5个特性 1)硬件抽象层具有与硬件的密切相关性. 2) 硬件抽象层具有与操作系统无关性. 3) 接口定义的功能应该包含硬件或者系统所需硬件支持的所有功 ...

  10. Python gdal读取MODIS遥感影像并结合质量控制QC波段掩膜数据

      本文介绍基于Python中GDAL模块,实现MODIS遥感影像数据的读取.计算,并基于质量控制QC波段进行图像掩膜的方法.   前期的文章Python GDAL读取栅格数据并基于质量评估波段QA对 ...