首先普及幾個(gè)知識(shí):
- Linux下一切都是文件锻梳,包括輸入輸出設(shè)備俏橘、網(wǎng)絡(luò)連接、socket井联、管道等
- 與文件打開數(shù)最相關(guān)的是文件描述符(有的人喜歡稱作文件標(biāo)識(shí)符卜壕,英文為file descriptor),文件打開數(shù)的實(shí)質(zhì)就是文件描述符的數(shù)量
- 文件打開數(shù)的多少取決于系統(tǒng)種類烙常、內(nèi)存大小印叁,int(語言關(guān)鍵字,如C99的int)長度(非負(fù)整數(shù))军掂,以及系統(tǒng)管理員的設(shè)定
- 最大文件打開數(shù)是針對(duì)一個(gè)進(jìn)程而言,即一個(gè)進(jìn)程能打開的文件句柄數(shù)目是有限的昨悼,不能超過最大文件打開數(shù)
- ulimit命令只對(duì)當(dāng)前shell有效蝗锥,因此在編寫Shell腳本時(shí),如果需要并能控制文件最大打開數(shù)率触,則先執(zhí)行“ulimit -n 文件打開數(shù)”命令终议,在去執(zhí)行下面的內(nèi)容
- 在Linux中被打開的文件描述符存放在/proc/PID/fd/,其中PID就是process identifier。
除了需要注意穴张,還需要注意ulimit -v unlimited细燎,最大可用的虛擬內(nèi)存(The maximum amount of virtual memory available to the shell and, on some systems, to its children)
大多數(shù)原因是因?yàn)槌绦驔]有關(guān)閉打開的資源連接, 如RMI皂甘、數(shù)據(jù)庫等連接才導(dǎo)致的玻驻。 當(dāng)然也有可能能同時(shí)有超過Linux本身默認(rèn)的文件打開數(shù)。
一偿枕、 先從Linux設(shè)置入手
(1) ulimit -a (查看資源設(shè)置情況
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 30525
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 10240
cpu time (seconds, -t) unlimited
max user processes (-u) 1024
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
open files默認(rèn)是1024
為了使服務(wù)器重啟設(shè)置還能生效璧瞬, 采取永久改變的方法。
vim /etc/security/limits.conf
在文檔最后添加
* soft nofile 65535
* hard nofile 65535
(2) vim /etc/pam.d/login
在文檔最后添加
session required /lib/security/pam_limits.so
二渐夸、 程序
記得在finally語句塊里面關(guān)閉資源連接嗤锉, 如:
finally{
if (connector != null) {
connector.close();
}
}
一些與文件打開數(shù)相關(guān)的命令以及其他相關(guān)命令:
- 查看當(dāng)前系統(tǒng)的文件打開總數(shù)(Maximum number of opened files):cat /proc/sys/fs/file-max
- 查看當(dāng)前進(jìn)程的文件打開數(shù):lsof -p 16075 | wc –l
- 查看當(dāng)前端口的文件打開數(shù):lsof -i:80 | wc -l
- 在使用lsof之前需要注意,lsof不適合查看一個(gè)連接數(shù)很高或者數(shù)量動(dòng)態(tài)變化過快的進(jìn)程或端口
- 查看某個(gè)進(jìn)程使用的文件:lsof -p 16075
- 查看某個(gè)端口使用的文件:lsof -i:80
- 查看使用某個(gè)文件的用戶和程序:fuser -v /bin/bash
- 如果需要查看所有進(jìn)程的文件打開數(shù)墓塌,如下圖命令lsof |wc -l
- Markup一個(gè)有用的分類知識(shí)的網(wǎng)站:https://en.wikipedia.org/wiki/Category:Unix_file_system_technology
【參考資料】
http://blog.csdn.net/wenniuwuren/article/details/45039449
http://dgd2010.blog.51cto.com/1539422/1676843
http://www.cnblogs.com/405845829qq/p/5919495.html
http://blog.itpub.net/220284/viewspace-1024475/