Linux报too many open files的解决方案及 lsof、sysctl 命令介绍

这篇具有很好参考价值的文章主要介绍了Linux报too many open files的解决方案及 lsof、sysctl 命令介绍。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Too many open files in system 问题处理

服务器异常:
一串的etc下的shell文件报
/etc/profile.d/bash_completion.sh: Too many open files in system

查看当前操作系统允许打开的文件数

# 用户级查看:
ulimit -n
# 系统级查看:
cat /proc/sys/fs/file-max

发现设置为655360,执行lsof|wc -l命令为871031,和设定的值还有很大差距,为什么还会报too many open files呢,突然想起还有一个地方设置最大文件数

使用命令

cat /proc/sys/fs/file-max
65536

这个时候大概知道为啥出现异常了

echo 655360 > /proc/sys/fs/file-max

直接增大一倍,这样可以马上生效,但是如果操作系统重启,又会失效
如果需要永久生效,修改

vim /etc/sysctl.conf
fs.file-max = 655360
sysctl -p

修改文件句柄数方法:
1、用户级修改

# 1、临时生效方式
ulimit -SHn 65535
# -H:硬限制(就是实际真正的限制阈值),-S:软限制(警告限制,它只会给出警告),
# 如果运行ulimit命令没有加-H和-S,就是两个参数一起变,soft的限制不能比hard限制高。
# 2、永久生效方式
#(1)
vim /etc/security/limits.conf
#(2)添加如下配置:
# *号代表任何用户,soft:软限制,hard:硬限制
* hard nofile 655360 #任何用户可以打开的最大句柄数(超过会报错)
* soft nofile 655360 #任何用户可以打开的最大句柄数(超过会警告)

* hard nproc 655360 #任何用户可用的最大进程数量(超过会报错)
* soft nproc 655360 #任何用户可用的最大进程数量(超过会警告)
hxapp hard nofile 655360
hxapp soft nofile 655360
hxapp hard nproc 655360
hxapp soft nproc 655360
#(3)重启服务器 
reboot
#(4)查看是否生效:
ulimit -a

2、系统级修改

# 1、临时生效方式
vim /proc/sys/fs/file-max
# 2、永久生效方式
#(1)
vim /etc/sysctl.conf
#(2)
fs.file-max = 655360
#(3)
重启服务器 reboot
#(4)
查看系统级文件句柄数是否生效 sudo sysctl -p

lsof 命令介绍

lsof 是 linux 下的一个非常实用的系统级的监控、诊断工具。
它的意思是 List Open Files,很容易你就记住了它是 “ls + of”的组合,它可以用来列出被各种进程打开的文件信息,记住:linux 下 “一切皆文件”,包括但不限于 pipes, sockets, directories, devices, 等等。
因此,使用 lsof,你可以获取任何被打开文件的各种信息,只需输入 lsof 就可以生成大量的信息,因为 lsof 需要访问核心内存和各种文件,所以必须以 root 用户的身份运行它才能够充分地发挥其功能。
适应条件:lsof访问的是核心文件和各种文件,所以必须以root用户的身份运行才能充分发挥其功能。

lsof /path/to/file 找出谁在使用某个文件

只需要执行文件的绝对路径,lsof就会列出所有使用这个文件的进程,你也可以列出多个文件,lsof会列出所有使用这些文件的进程。

lsof /home/hxapp/logs/onlApp/sys/ltts_slowSql.log
COMMAND   PID  USER   FD   TYPE DEVICE SIZE/OFF    NODE NAME
java    56255 hxapp  223w   REG  253,0    40218 3418082 /home/hxapp/logs/onlApp/sys/ltts_slowSql.log

COMMAND :进程名称
PID:进程标识符
USER:进程所有者
FD:文件描述符,应用程序通过文件描述符识别到该文件。如cwd、txt等
TYPE:文件类型,如DIR,REG
DEVICE:指定磁盘名称
SIZE:文件大小
NODE:索引节点(文件在磁盘上的标识)
NAME:打开文件的确切名称
补充:FD列中的文件描述cwd值表示应用程序的当前工作目录,这是该程序启动的目录,除非它本身对这个目录进行更改。txt类型的是程序代码,如应用程序二进制文件本身或者共享库。其次数值表示应用程序的文件描述符,这是打开文件时一个返回的一个整数。

COMMAND   PID  USER   FD   TYPE DEVICE SIZE/OFF    NODE NAME
java    22266 hxapp  cwd       DIR              253,0        4096 1046562 /home/hxapp/logs/jobSrv2/sys
java    22266 hxapp  mem       REG              253,0       96221 1308284 /home/hxapp/frw/lib/2.4.17-RELEASE/third/commons-pool-1.5.4.jar
java    22266 hxapp    0r      CHR                1,3         0t0    1028 /dev/null
java    22266 hxapp    1u      REG              253,0       37168 1046570 /home/hxapp/logs/jobSrv2/sys/ltts-app.out
java    22266 hxapp    2u      REG              253,0       37168 1046570 /home/hxapp/logs/jobSrv2/sys/ltts-app.out
java    22266 hxapp    3w      REG              253,0      592700 1050251 /home/hxapp/logs/jobSrv2/sys/gc-jobSrv2.log2023-12-04
bash    85671 hxapp    0u      CHR              136,0         0t0       3 /dev/pts/0
bash    85671 hxapp    1u      CHR              136,0         0t0       3 /dev/pts/0
bash    85671 hxapp    2u      CHR              136,0         0t0       3 /dev/pts/0
java    22266 hxapp  241u     IPv6             112696         0t0     TCP cbsuatapp1:62313->3.1.11.8:ncube-lm (ESTABLISHED)
java    22266 hxapp  242u     IPv6              83345         0t0     TCP cbsuatapp1:62317->3.1.11.8:ncube-lm (ESTABLISHED)
lsof    86283 hxapp    4r     FIFO                0,9         0t0 1914234 pipe

其中u表示该文件被打开处于读取\写入模式,而不是只读或只写模式;r 只读 ; w 只写 ;W表示该应用程序具有对整个文件的写锁(确保每次只能打开一次应用程序实例)。初始打开每个应用程序时,都具有三个文件描述符,从0到2,分别表示标准输入、输出和错误流。因此,大多数应用程序所打开的FD都是从3开始!
TYPE:REG、DIR、CHR、BLK、UNIX、FIFO、IPV

lsof -h 查看命令详解

lsof 列出所有打开的文件

不带任何参数运行lsof会列出所有进程打开的所有文件

lsof +D /usr/lib 递归查找某个目录中所有打开的文件

加上+D参数,lsof会对指定目录进行递归查找,注意这个参数要比grep版本慢:

lsof -u pkrumins 列出某个用户打开的所有文件

-u选项限定只列出所有被用户pkrumins打开的文件,你可以通过逗号指定多个用户

lsof -u gwds,esbagent

lsof -c apache 查找某个程序打开的所有文件

-c选项限定只列出以apache开头的进程打开的文件:
所以你可以不用像下面这样写:

lsof | grep foo

而使用下面这个更简短的版本:

lsof -c foo

事实上,你可以只制定进程名称的开头:

lsof -c apa

这会列出所有以apa开头的进程打开的文件
你同样可以制定多个-c参数:

lsof -c apache -c python

这会列出所有由apache和python打开的文件

lsof -u pkrumins -c apache 列出所有由某个用户或某个进程打开的文件

lsof -a -u pkrumins -c bash列出所有由一个用户与某个进程打开的文件

-a参数可以将多个选项的组合条件由或变为与,上面的命令会显示所有由pkrumins用户以及bash进程打开的文件

lsof -u ^root 列出除root用户外的所有用户打开的文件

lsof -p 1 列出所有由某个PID对应的进程打开的文件

-p选项让你可以使用进程id来过滤输出。记住你也可以用逗号来分离多个pid。

lsof -i 列出所有网络连接

lsof的-i选项可以列出所有打开了网络套接字(TCP和UDP)的进程

lsof -i tcp 列出所有TCP网络连接

也可以为-i选项加上参数,比如tcp、udp,tcp选项会强制lsof只列出打开TCP sockets的进程,同样udp让lsof只列出使用UDP socket的进程

lsof -i :25 找到使用某个端口的进程

:25和-i选项组合可以让lsof列出占用TCP或UDP的25端口的进程。
你也可以使用/etc/services中制定的端口名称来代替端口号,比如:

lsof -i :smtp

找到使用某个udp端口号的进程

lsof -i udp:53

同样的,也可以找到使用某个tcp端口的进程:

lsof -i tcp:80

lsof -a -u hacker -i 找到某个用户的所有网络连接

使用-a将-u和-i选项组合可以让lsof列出某个用户的所有网络行为

lsof -N 列出所有NFS(网络文件系统)文件

COMMAND   PID  USER   FD   TYPE DEVICE SIZE/OFF    NODE NAME
bash    71716 hxapp  cwd    DIR   0,42     4096 1576048 /aft_files/CBS/loan/ln_data/20231108 (3.1.12.154:/data2)

lsof -U 列出所有UNIX域Socket文件

lsof -g 1234 列出所有对应某个组id的进程

进程组用来来逻辑上对进程进行分组,这个例子查找所有PGID为1234的进程打开的文件。

lsof -d 2 列出所有与某个描述符关联的文件

这个命令会列出所有以描述符2打开的文件。
你也可以为描述符指定一个范围:

lsof -d 0-2

这会列出所有描述符为0,1,2的文件。
-d选项还支持其它很多特殊值,下面的命令列出所有内存映射文件:

lsof -d mem

txt则列出所有加载在内存中并正在执行的进程:

lsof -d txt

lsof -t -i 输出使用某些资源的进程pid

-t选项输出进程的PID,你可以将它和-i选项组合输出使用某个端口的进程的PID,下面的命令将会杀掉所有使用网络的进程:

kill -9 'lsof -t -i'

lsof -r 1 循环列出文件

-r选项让lsof可以循环列出文件直到被中断,参数1的意思是每秒钟重复打印一次,这个选项最好同某个范围比较小的查询组合使用,比如用来监测网络活动:

lsof -r 1 -u john -i -a

sysctl 命令介绍

# sysctl(选项)(参数)
## 获取某个变量
sysctl fs.file-max
## 设置某个变量
sysctl -w fs.file-max=655360
sysctl -w net.ipv4.ip_forward=1 #(布尔型用 1 来表示’yes’,用 0 来表示’no’)

-n:打印值时不打印关键字;
-e:忽略未知关键字错误;
-N:仅打印名称;
-w:当改变sysctl设置时使用此项;
-p:从配置文件“/etc/sysctl.conf”加载内核参数设置;
-a:打印当前所有可用的内核参数变量和值;
-A:以表格方式打印当前所有可用的内核参数变量和值。

配置sysctl
编辑此文件:/etc/sysctl.conf
执行:文章来源地址https://www.toymoban.com/news/detail-834173.html

sysctl -p

到了这里,关于Linux报too many open files的解决方案及 lsof、sysctl 命令介绍的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • GATK BaseRecalibratorSpark 过程中因Too many open files终止

    Error: GATK BaseRecalibratorSpark 过程中因Too many open files终止 执行命令: 日志信息: 错误分析: GATK 集成的Spark运行过程中会打开多个文件,而我使用的服务器版RStudio的Terminal限制了打开的文件数量最多为4096 可以通过命令 ulimit -n 查看当前用户能打开的最多文件数量。 解决方法

    2024年02月13日
    浏览(39)
  • 使用 python multiprocessing.Queue 出现 too many open files 错误

    问题描述 使用 python 子进程 multiprocessing.Process 执行任务,并使用 multiprocessing.Queue 回传任务执行结果。程序执行时间长以后,出现 Too many open files 错误。使用 lsof -p 进程号 能看到有很多未关闭的 pipe。后经排查发现大概率是 multiprocessing.Queue的问题,为了验证想法,写了一个测

    2024年02月09日
    浏览(37)
  • 【LaTeX 问题解决方案】I couldn‘t open file name `.aux‘

    最近用 vscode 的 latex 插件编译论文的时候发现,编译 bibtex 时总会报错:I couldn’t open file name “.aux”。但是在编译 xelatex 时发现已经产生了一个 aux 文件,那么为什么 latex 插件无法找到 aux 文件呢? 经过一番摸索,我发现问题出现在设置文件中。 可以发现,设置中默认会清

    2023年04月18日
    浏览(75)
  • 解决TortoiseGit软件Git Show log时显示Too many files to display的问题

    有时代码提交修改的文件比较多,当查看log时无法显示出来修改的文件列表,如下所示: 将LogTooManyItemsThreshold尽可能配置得大一些。 https://gitlab.com/tortoisegit/tortoisegit/-/issues/3878

    2024年04月12日
    浏览(44)
  • 报错:java: 读取D:\XX\XXX.jar时出错; error in opening zip file[有效解决方案]

    一般是在idea构建项目时报的错误。 原因:1、在构建项目时中止构建,导致jar下载失败或者下载的jar包残缺无法打开使用。     2、构建好项目后,更换idea的maven版本,导致maven的本地仓库改变,无法加载之前构建好的环境,或者打不开之前下载的jar包     3、依赖的jar因为某

    2024年02月11日
    浏览(70)
  • 1.Linux开机卡在/dev/sda1:clean,***files,***blocks解决方案

    ##1. 出现原因 linux开机时显示器卡在卡在/dev/sda1:clean,***files,***blocks无法进入系统的原因可能是显卡驱动的问题或者系统升级的原因(近期内没有修改文件大概率是系统升级导致的驱动问题),也可能是磁盘空间问题。 linux开机时显示器卡在卡在/dev/sda1:clean,***files,***blo

    2024年02月15日
    浏览(60)
  • SparkSQL列数量比较多引发的Too many arguments in method signature in class file问题

    我在写一个Spark程序的时候,做两个表的关联,其中一个表为feature表,一共有96个特征,我使用下面的 代码片 的时候 在运行的时候会报错 在运行日志里面还有下面的错误提示 增加一行: .config(\\\"spark.sql.codegen.wholeStage\\\", value = false) 这个错误一般是由于 JVM 的方法参数限制所导

    2024年02月08日
    浏览(39)
  • Nginx报错 HTTP 413 Request Entity Too Large(Payload Too Large)解决方案

    上传文件时,请求参数过大,导致超出服务端限制。 客户端发送的实体主体部分比服务器能够或者希望处理的要大。  Nginx默认最大能够上传1MB文件,打开nginx.conf在http{}中,找到server{}设置: client_max_body_size 30m;(配置客户端请求实体最大值) client_body_buffer_size 128k;(配置请

    2024年02月07日
    浏览(66)
  • nginx报413 Request Entity Too Large错误解决方案

    原因:使用nginx进行文件操作,该错误表示请求体过大,更改一下nginx的请求体大小就可以了 解决: 在nginx的配置文件中新增: client_max_body_size 1024m; 根据需求设置大小,1024m只是示例; 重新启动 nginx ! 重启方法: 进入sbin目录下启动方式: 配置systemctl的启动方式: * 找不到配置文件的情况

    2024年02月15日
    浏览(37)
  • 解决mysql报错:1406, Data too long for column(多种方案)

    传送 centosAI 适用于linux系统 一般1406, Data too long for column错误大部分会是因为某一列表的数据长度受限,最好的办法是进入数据库,找到表结构中对应的表头,修改数据库类型,这里以vod_first_letter为例,如果直接修改数据类型,可能会因为文本内容不兼容而导致失败,如将V

    2024年01月21日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包