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

2023-12-04 17:28

本文主要是介绍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
执行:

sysctl -p

这篇关于Linux报too many open files的解决方案及 lsof、sysctl 命令介绍的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/454287

相关文章

redis过期key的删除策略介绍

《redis过期key的删除策略介绍》:本文主要介绍redis过期key的删除策略,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录第一种策略:被动删除第二种策略:定期删除第三种策略:强制删除关于big key的清理UNLINK命令FLUSHALL/FLUSHDB命

usb接口驱动异常问题常用解决方案

《usb接口驱动异常问题常用解决方案》当遇到USB接口驱动异常时,可以通过多种方法来解决,其中主要就包括重装USB控制器、禁用USB选择性暂停设置、更新或安装新的主板驱动等... usb接口驱动异常怎么办,USB接口驱动异常是常见问题,通常由驱动损坏、系统更新冲突、硬件故障或电源管理设置导致。以下是常用解决

Linux命令之firewalld的用法

《Linux命令之firewalld的用法》:本文主要介绍Linux命令之firewalld的用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux命令之firewalld1、程序包2、启动firewalld3、配置文件4、firewalld规则定义的九大

Windows Docker端口占用错误及解决方案总结

《WindowsDocker端口占用错误及解决方案总结》在Windows环境下使用Docker容器时,端口占用错误是开发和运维中常见且棘手的问题,本文将深入剖析该问题的成因,介绍如何通过查看端口分配... 目录引言Windows docker 端口占用错误及解决方案汇总端口冲突形成原因解析诊断当前端口情况解

Linux之计划任务和调度命令at/cron详解

《Linux之计划任务和调度命令at/cron详解》:本文主要介绍Linux之计划任务和调度命令at/cron的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux计划任务和调度命令at/cron一、计划任务二、命令{at}介绍三、命令语法及功能 :at

Linux下如何使用C++获取硬件信息

《Linux下如何使用C++获取硬件信息》这篇文章主要为大家详细介绍了如何使用C++实现获取CPU,主板,磁盘,BIOS信息等硬件信息,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录方法获取CPU信息:读取"/proc/cpuinfo"文件获取磁盘信息:读取"/proc/diskstats"文

Linux内核参数配置与验证详细指南

《Linux内核参数配置与验证详细指南》在Linux系统运维和性能优化中,内核参数(sysctl)的配置至关重要,本文主要来聊聊如何配置与验证这些Linux内核参数,希望对大家有一定的帮助... 目录1. 引言2. 内核参数的作用3. 如何设置内核参数3.1 临时设置(重启失效)3.2 永久设置(重启仍生效

Vue3组件中getCurrentInstance()获取App实例,但是返回null的解决方案

《Vue3组件中getCurrentInstance()获取App实例,但是返回null的解决方案》:本文主要介绍Vue3组件中getCurrentInstance()获取App实例,但是返回nu... 目录vue3组件中getCurrentInstajavascriptnce()获取App实例,但是返回n

Spring Boot循环依赖原理、解决方案与最佳实践(全解析)

《SpringBoot循环依赖原理、解决方案与最佳实践(全解析)》循环依赖指两个或多个Bean相互直接或间接引用,形成闭环依赖关系,:本文主要介绍SpringBoot循环依赖原理、解决方案与最... 目录一、循环依赖的本质与危害1.1 什么是循环依赖?1.2 核心危害二、Spring的三级缓存机制2.1 三

Node.js 数据库 CRUD 项目示例详解(完美解决方案)

《Node.js数据库CRUD项目示例详解(完美解决方案)》:本文主要介绍Node.js数据库CRUD项目示例详解(完美解决方案),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考... 目录项目结构1. 初始化项目2. 配置数据库连接 (config/db.js)3. 创建模型 (models/