Linux宿主機(jī)下/容器下如何修改進(jìn)程打開的文件句柄數(shù)(open files)
Linux宿主機(jī)下/容器下修改進(jìn)程打開的文件句柄數(shù)
背景1:平臺(tái)調(diào)用算法出現(xiàn)異常,查看數(shù)據(jù)庫調(diào)用錯(cuò)誤狀態(tài)碼是499
- 499:(客戶端主動(dòng)關(guān)閉請求);客戶端向服務(wù)端發(fā)起請求,服務(wù)器端處理的時(shí)間過長,超出了客戶端的超時(shí)時(shí)間,客戶端主動(dòng)斷開連接。
- ## 這個(gè)報(bào)錯(cuò)表明請求已經(jīng)打到了后端算法,只是后端算法請求太多導(dǎo)致的,遲遲沒有響應(yīng)客戶端并返回結(jié)果而導(dǎo)致斷開連接,此時(shí)可以增加服務(wù)后端節(jié)點(diǎn)數(shù)分?jǐn)倝毫蛘咴黾游募浔鷶?shù)(增加文件句柄數(shù)可以讓算法接收更多的請求)
背景2:錯(cuò)誤日志出現(xiàn)“Too many open files“等文件打開太多等錯(cuò)誤,出現(xiàn)文件描述符耗盡的問題
背景3:容器里面的服務(wù)啟動(dòng)異常,排查發(fā)現(xiàn)容器里面文件句柄數(shù)太少,大概率是容器本身配置的句柄數(shù)過低
max-file
表示系統(tǒng)級(jí)別的能夠打開的文件句柄的數(shù)量。是對(duì)整個(gè)系統(tǒng)的限制,并不是針對(duì)用戶的。ulimit -n
控制進(jìn)程級(jí)別能夠打開的文件句柄的數(shù)量。提供對(duì)shell及其啟動(dòng)的進(jìn)程的可用文件句柄的控制,這是進(jìn)程級(jí)別的
對(duì)于服務(wù)器,一般修改進(jìn)程級(jí)的最大打開文件句柄數(shù)即可(系統(tǒng)默認(rèn)1024,有點(diǎn)?。R话悴恍枰{(diào)整系統(tǒng)級(jí)的最大數(shù)。
如果出現(xiàn)了達(dá)到系統(tǒng)級(jí)別最大限制時(shí),也需要同步調(diào)整系統(tǒng)級(jí)的最大數(shù)的。
一、查看系統(tǒng)最大句柄數(shù)
Linux 中,單個(gè)進(jìn)程能夠打開的最大文件句柄數(shù)量是可以配置的,系統(tǒng)默認(rèn)是 1024。
當(dāng)單個(gè)進(jìn)程打開的文件句柄數(shù)量超過了系統(tǒng)定義的值,就會(huì)出現(xiàn)“Too many files open”的錯(cuò)誤提示。
用戶可以通過以下命令查看系統(tǒng)定義的最大值:
#查看文件句柄 [root@localhost ~]# ulimit -a #查看當(dāng)前進(jìn)程打開了多少句柄數(shù): [root@localhost ~]# lsof -n|awk '{print $2}'|sort|uniq -c|sort -nr|more 131 24204 57 24244 57 24231 ...... ? 其中第一列是打開的句柄數(shù),第二列是進(jìn)程ID??梢愿鶕?jù)ID號(hào)來查看進(jìn)程名: [root@localhost ~]# ps aef|grep 24204 nginx 24204 24162 99 16:15 ? 00:24:25 /usr/local/nginx/sbin/nginx -s
二、修改文件句柄(進(jìn)程級(jí)別)
#對(duì)于一般的應(yīng)用程序而言 1024 已經(jīng)完全夠用了,但是有些進(jìn)程處理大量請求,很有可能 1024 就不夠用了,則需要調(diào)整系統(tǒng)參數(shù),一般可以設(shè)置4096、65535或者102400,設(shè)置的太高會(huì)影響性能,并不是想設(shè)置多高就多高,畢竟打開的文件句柄數(shù)越多響應(yīng)時(shí)間肯定會(huì)越慢
#臨時(shí)生效 [root@localhost ~]# ulimit -n 4096 #永久生效法一:把這個(gè)臨時(shí)生效的命令放在.bashrc或者.bash_profile配置文件里就可以永久生效了 [root@localhost ~]# echo "ulimit -n 4096" >> ~/.bashrc #永久生效法二 [root@localhost ~]# vim /etc/security/limits.conf * soft nofile 65535 * hard nofile 65535 提示:* 表示所用的用戶,但有的系統(tǒng)不認(rèn), 需要具體的用戶名, 比如: root soft nofile 65535 root hard nofile 65535 重新登錄驗(yàn)證,或reboot后驗(yàn)證。
三、修改max user processes進(jìn)程數(shù)
#臨時(shí)生效 [root@localhost ~]# ulimit -u 65536 #永久生效 [root@localhost ~]# vim /etc/security/limits.conf * soft nproc 65536 * hard nproc 65536
四、查看系統(tǒng)最大打開文件描述符數(shù)量(系統(tǒng)級(jí)別)
[root@localhost ~]# cat /proc/sys/fs/file-max #查看系統(tǒng)最大打開文件描述符數(shù)量 180965 [root@localhost ~]# echo "1000000" > /proc/sys/fs/file-max #臨時(shí)設(shè)置該值 ? #永久性設(shè)置,需要在/etc/sysctl.conf中設(shè)置,并讓它生效: [root@localhost ~]# echo "fs.file-max = 1000000" >> /etc/sysctl.conf [root@localhost ~]# sysctl -p fs.file-max = 1000000
注意:
- 所有進(jìn)程打開的文件描述符數(shù)量不能超過/proc/sys/fs/file-max。
- 單個(gè)進(jìn)程打開的文件描述符數(shù)不能超過user limit中nofile的soft limit。
- nofile的soft limit不能超過其hard limit。
五、容器內(nèi)部修改文件句柄
##這是針對(duì)已經(jīng)run起來的容器修改文件句柄 [root@localhost ~]# ps -ef | grep dockerd root 57213 1 0 Jan13 ? 02:49:32 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --icc=false --default-ulimit nproc=1024:2408 --default-ulimit nofile=100:200 root 126923 122986 0 10:44 pts/2 00:00:00 grep --color=auto dockerd [root@localhost ~]# cat /usr/lib/systemd/system/docker.service #把宿主機(jī)本身容器配置文件這一條修改后重啟就會(huì)生效 ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --icc=false --default-ulimit nproc=1024:2408 --default-ulimit nofile=65535:131070 [root@localhost ~]# systemctl restart docker && systemctl daemon-reload
--default-ulimit nofile=100:200,也就是文件句柄容器內(nèi)100,宿主機(jī)200
#沒有run運(yùn)行起來的容器,可以直接在容器啟動(dòng)命令添加限制參數(shù): --ulimit nofile=65535:65535,容器啟動(dòng)完成后,在容器內(nèi)查看java進(jìn)程句柄數(shù)限制(已經(jīng)成功修改為65535) [root@localhost ~]# docker run --ulimit nofile=65535:65535 ...
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
linux系統(tǒng)對(duì)外開放3306、8080等端口,防火墻設(shè)置詳解
這篇文章主要介紹了linux系統(tǒng)對(duì)外開放3306、8080等端口,防火墻設(shè)置,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05詳解如何在Linux系統(tǒng)中監(jiān)控TCP連接
在?Linux?系統(tǒng)中,監(jiān)控?TCP?連接是網(wǎng)絡(luò)管理和故障排查的重要任務(wù)之一,無論是系統(tǒng)管理員還是開發(fā)人員,了解如何查看和分析?TCP?連接狀態(tài)都至關(guān)重要,本文將詳細(xì)介紹如何在?Linux?系統(tǒng)中監(jiān)控?TCP?連接,需要的朋友可以參考下2025-02-02Linux服務(wù)器安裝PHP MongoDB擴(kuò)展的方法
這篇文章主要介紹了Linux服務(wù)器安裝PHP MongoDB擴(kuò)展的方法,需要的朋友可以參考下2016-11-11linux搭建FastDFS文件服務(wù)器的實(shí)現(xiàn)步驟
本文主要介紹在linux服務(wù)器如何搭建FastDFS文件服務(wù)器。文中通過圖文示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08haproxy+keepalived實(shí)現(xiàn)高可用負(fù)載均衡(實(shí)例配置)
上一篇文章以理論介紹居多,這篇文章就以實(shí)際的應(yīng)用配置為主,需要的朋友可以參考下這兩篇文章2013-01-01Apache Shiro 使用手冊(一) Shiro架構(gòu)介紹
Apache Shiro是一個(gè)強(qiáng)大易用的Java安全框架,提供了認(rèn)證、授權(quán)、加密和會(huì)話管理等功能2014-06-06關(guān)于Windows 不能在 本地計(jì)算器 啟動(dòng) Apache2(phpstudy)
今天在自己的本子上準(zhǔn)備放多個(gè)虛擬站點(diǎn)。用的是#phpstudy#。在軟件自身的站點(diǎn)設(shè)置中,根據(jù)提示添加的多站點(diǎn)無效不知道是否和我的系統(tǒng)是Win7有關(guān)2012-09-09