Too many open files in system 問(wèn)題處理
服務(wù)器異常:
一串的etc下的shell文件報(bào)
/etc/profile.d/bash_completion.sh: Too many open files in system
查看當(dāng)前操作系統(tǒng)允許打開的文件數(shù)
# 用戶級(jí)查看:
ulimit -n
# 系統(tǒng)級(jí)查看:
cat /proc/sys/fs/file-max
發(fā)現(xiàn)設(shè)置為655360,執(zhí)行l(wèi)sof|wc -l命令為871031,和設(shè)定的值還有很大差距,為什么還會(huì)報(bào)too many open files呢,突然想起還有一個(gè)地方設(shè)置最大文件數(shù)
使用命令
cat /proc/sys/fs/file-max
65536
這個(gè)時(shí)候大概知道為啥出現(xiàn)異常了
echo 655360 > /proc/sys/fs/file-max
直接增大一倍,這樣可以馬上生效,但是如果操作系統(tǒng)重啟,又會(huì)失效
如果需要永久生效,修改
vim /etc/sysctl.conf
fs.file-max = 655360
sysctl -p
修改文件句柄數(shù)方法:
1、用戶級(jí)修改
# 1、臨時(shí)生效方式
ulimit -SHn 65535
# -H:硬限制(就是實(shí)際真正的限制閾值),-S:軟限制(警告限制,它只會(huì)給出警告),
# 如果運(yùn)行ulimit命令沒(méi)有加-H和-S,就是兩個(gè)參數(shù)一起變,soft的限制不能比hard限制高。
# 2、永久生效方式
#(1)
vim /etc/security/limits.conf
#(2)添加如下配置:
# *號(hào)代表任何用戶,soft:軟限制,hard:硬限制
* hard nofile 655360 #任何用戶可以打開的最大句柄數(shù)(超過(guò)會(huì)報(bào)錯(cuò))
* soft nofile 655360 #任何用戶可以打開的最大句柄數(shù)(超過(guò)會(huì)警告)
* hard nproc 655360 #任何用戶可用的最大進(jìn)程數(shù)量(超過(guò)會(huì)報(bào)錯(cuò))
* soft nproc 655360 #任何用戶可用的最大進(jìn)程數(shù)量(超過(guò)會(huì)警告)
hxapp hard nofile 655360
hxapp soft nofile 655360
hxapp hard nproc 655360
hxapp soft nproc 655360
#(3)重啟服務(wù)器
reboot
#(4)查看是否生效:
ulimit -a
2、系統(tǒng)級(jí)修改
# 1、臨時(shí)生效方式
vim /proc/sys/fs/file-max
# 2、永久生效方式
#(1)
vim /etc/sysctl.conf
#(2)
fs.file-max = 655360
#(3)
重啟服務(wù)器 reboot
#(4)
查看系統(tǒng)級(jí)文件句柄數(shù)是否生效 sudo sysctl -p
lsof 命令介紹
lsof 是 linux 下的一個(gè)非常實(shí)用的系統(tǒng)級(jí)的監(jiān)控、診斷工具。
它的意思是 List Open Files,很容易你就記住了它是 “l(fā)s + of”的組合,它可以用來(lái)列出被各種進(jìn)程打開的文件信息,記?。簂inux 下 “一切皆文件”,包括但不限于 pipes, sockets, directories, devices, 等等。
因此,使用 lsof,你可以獲取任何被打開文件的各種信息,只需輸入 lsof 就可以生成大量的信息,因?yàn)?lsof 需要訪問(wèn)核心內(nèi)存和各種文件,所以必須以 root 用戶的身份運(yùn)行它才能夠充分地發(fā)揮其功能。
適應(yīng)條件:lsof訪問(wèn)的是核心文件和各種文件,所以必須以root用戶的身份運(yùn)行才能充分發(fā)揮其功能。
lsof /path/to/file 找出誰(shuí)在使用某個(gè)文件
只需要執(zhí)行文件的絕對(duì)路徑,lsof就會(huì)列出所有使用這個(gè)文件的進(jìn)程,你也可以列出多個(gè)文件,lsof會(huì)列出所有使用這些文件的進(jìn)程。
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 :進(jìn)程名稱
PID:進(jìn)程標(biāo)識(shí)符
USER:進(jìn)程所有者
FD:文件描述符,應(yīng)用程序通過(guò)文件描述符識(shí)別到該文件。如cwd、txt等
TYPE:文件類型,如DIR,REG
DEVICE:指定磁盤名稱
SIZE:文件大小
NODE:索引節(jié)點(diǎn)(文件在磁盤上的標(biāo)識(shí))
NAME:打開文件的確切名稱
補(bǔ)充:FD列中的文件描述cwd值表示應(yīng)用程序的當(dāng)前工作目錄,這是該程序啟動(dòng)的目錄,除非它本身對(duì)這個(gè)目錄進(jìn)行更改。txt類型的是程序代碼,如應(yīng)用程序二進(jìn)制文件本身或者共享庫(kù)。其次數(shù)值表示應(yīng)用程序的文件描述符,這是打開文件時(shí)一個(gè)返回的一個(gè)整數(shù)。
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表示該應(yīng)用程序具有對(duì)整個(gè)文件的寫鎖(確保每次只能打開一次應(yīng)用程序?qū)嵗?。初始打開每個(gè)應(yīng)用程序時(shí),都具有三個(gè)文件描述符,從0到2,分別表示標(biāo)準(zhǔn)輸入、輸出和錯(cuò)誤流。因此,大多數(shù)應(yīng)用程序所打開的FD都是從3開始!
TYPE:REG、DIR、CHR、BLK、UNIX、FIFO、IPV
lsof -h 查看命令詳解
lsof 列出所有打開的文件
不帶任何參數(shù)運(yùn)行l(wèi)sof會(huì)列出所有進(jìn)程打開的所有文件
lsof +D /usr/lib 遞歸查找某個(gè)目錄中所有打開的文件
加上+D參數(shù),lsof會(huì)對(duì)指定目錄進(jìn)行遞歸查找,注意這個(gè)參數(shù)要比grep版本慢:
lsof -u pkrumins 列出某個(gè)用戶打開的所有文件
-u選項(xiàng)限定只列出所有被用戶pkrumins打開的文件,你可以通過(guò)逗號(hào)指定多個(gè)用戶
lsof -u gwds,esbagent
lsof -c apache 查找某個(gè)程序打開的所有文件
-c選項(xiàng)限定只列出以apache開頭的進(jìn)程打開的文件:
所以你可以不用像下面這樣寫:
lsof | grep foo
而使用下面這個(gè)更簡(jiǎn)短的版本:
lsof -c foo
事實(shí)上,你可以只制定進(jìn)程名稱的開頭:
lsof -c apa
這會(huì)列出所有以apa開頭的進(jìn)程打開的文件
你同樣可以制定多個(gè)-c參數(shù):
lsof -c apache -c python
這會(huì)列出所有由apache和python打開的文件
lsof -u pkrumins -c apache 列出所有由某個(gè)用戶或某個(gè)進(jìn)程打開的文件
lsof -a -u pkrumins -c bash列出所有由一個(gè)用戶與某個(gè)進(jìn)程打開的文件
-a參數(shù)可以將多個(gè)選項(xiàng)的組合條件由或變?yōu)榕c,上面的命令會(huì)顯示所有由pkrumins用戶以及bash進(jìn)程打開的文件
lsof -u ^root 列出除root用戶外的所有用戶打開的文件
lsof -p 1 列出所有由某個(gè)PID對(duì)應(yīng)的進(jìn)程打開的文件
-p選項(xiàng)讓你可以使用進(jìn)程id來(lái)過(guò)濾輸出。記住你也可以用逗號(hào)來(lái)分離多個(gè)pid。
lsof -i 列出所有網(wǎng)絡(luò)連接
lsof的-i選項(xiàng)可以列出所有打開了網(wǎng)絡(luò)套接字(TCP和UDP)的進(jìn)程
lsof -i tcp 列出所有TCP網(wǎng)絡(luò)連接
也可以為-i選項(xiàng)加上參數(shù),比如tcp、udp,tcp選項(xiàng)會(huì)強(qiáng)制lsof只列出打開TCP sockets的進(jìn)程,同樣udp讓lsof只列出使用UDP socket的進(jìn)程
lsof -i :25 找到使用某個(gè)端口的進(jìn)程
:25和-i選項(xiàng)組合可以讓lsof列出占用TCP或UDP的25端口的進(jìn)程。
你也可以使用/etc/services中制定的端口名稱來(lái)代替端口號(hào),比如:
lsof -i :smtp
找到使用某個(gè)udp端口號(hào)的進(jìn)程
lsof -i udp:53
同樣的,也可以找到使用某個(gè)tcp端口的進(jìn)程:
lsof -i tcp:80
lsof -a -u hacker -i 找到某個(gè)用戶的所有網(wǎng)絡(luò)連接
使用-a將-u和-i選項(xiàng)組合可以讓lsof列出某個(gè)用戶的所有網(wǎng)絡(luò)行為
lsof -N 列出所有NFS(網(wǎng)絡(luò)文件系統(tǒng))文件
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 列出所有對(duì)應(yīng)某個(gè)組id的進(jìn)程
進(jìn)程組用來(lái)來(lái)邏輯上對(duì)進(jìn)程進(jìn)行分組,這個(gè)例子查找所有PGID為1234的進(jìn)程打開的文件。
lsof -d 2 列出所有與某個(gè)描述符關(guān)聯(lián)的文件
這個(gè)命令會(huì)列出所有以描述符2打開的文件。
你也可以為描述符指定一個(gè)范圍:
lsof -d 0-2
這會(huì)列出所有描述符為0,1,2的文件。
-d選項(xiàng)還支持其它很多特殊值,下面的命令列出所有內(nèi)存映射文件:
lsof -d mem
txt則列出所有加載在內(nèi)存中并正在執(zhí)行的進(jìn)程:
lsof -d txt
lsof -t -i 輸出使用某些資源的進(jìn)程pid
-t選項(xiàng)輸出進(jìn)程的PID,你可以將它和-i選項(xiàng)組合輸出使用某個(gè)端口的進(jìn)程的PID,下面的命令將會(huì)殺掉所有使用網(wǎng)絡(luò)的進(jìn)程:
kill -9 'lsof -t -i'
lsof -r 1 循環(huán)列出文件
-r選項(xiàng)讓lsof可以循環(huán)列出文件直到被中斷,參數(shù)1的意思是每秒鐘重復(fù)打印一次,這個(gè)選項(xiàng)最好同某個(gè)范圍比較小的查詢組合使用,比如用來(lái)監(jiān)測(cè)網(wǎng)絡(luò)活動(dòng):
lsof -r 1 -u john -i -a
sysctl 命令介紹
# sysctl(選項(xiàng))(參數(shù))
## 獲取某個(gè)變量
sysctl fs.file-max
## 設(shè)置某個(gè)變量
sysctl -w fs.file-max=655360
sysctl -w net.ipv4.ip_forward=1 #(布爾型用 1 來(lái)表示’yes’,用 0 來(lái)表示’no’)
-n:打印值時(shí)不打印關(guān)鍵字;
-e:忽略未知關(guān)鍵字錯(cuò)誤;
-N:僅打印名稱;
-w:當(dāng)改變sysctl設(shè)置時(shí)使用此項(xiàng);
-p:從配置文件“/etc/sysctl.conf”加載內(nèi)核參數(shù)設(shè)置;
-a:打印當(dāng)前所有可用的內(nèi)核參數(shù)變量和值;
-A:以表格方式打印當(dāng)前所有可用的內(nèi)核參數(shù)變量和值。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-834173.html
配置sysctl
編輯此文件:/etc/sysctl.conf
執(zhí)行:文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-834173.html
sysctl -p
到了這里,關(guān)于Linux報(bào)too many open files的解決方案及 lsof、sysctl 命令介紹的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!