問(wèn)題描述
Tomcat日志中報(bào)too many open files導(dǎo)致程序無(wú)法讀取文件錯(cuò)誤。
報(bào)錯(cuò)原因
出現(xiàn)這句提示的原因是程序打開的文件/socket連接數(shù)量超過(guò)系統(tǒng)設(shè)定值。
JAVA.IOException:打開的文件過(guò)多
經(jīng)搜索,發(fā)現(xiàn)是由于linux默認(rèn)設(shè)置的句柄數(shù)為1024,當(dāng)并發(fā)量過(guò)大,就不夠用了;
原因:
操作系統(tǒng)的中打開文件的最大句柄數(shù)受限所致,常常發(fā)生在很多個(gè)并發(fā)用戶訪問(wèn)服務(wù)器的時(shí)候.因?yàn)闉榱藞?zhí)行每個(gè)用戶的應(yīng)用服務(wù)器都要加載很多文件(new一個(gè)socket就需要一個(gè)文件句柄),這就會(huì)導(dǎo)致打開文件的句柄的缺乏.
解決:
- 盡量把類打成jar包,因?yàn)橐粋€(gè)jar包只消耗一個(gè)文件句柄,如果不打包,一個(gè)類就消耗一個(gè)文件句柄.
- java的垃圾回收不能關(guān)閉網(wǎng)絡(luò)連接打開的文件句柄,如果沒(méi)有執(zhí)行close()(例如:java.net.Socket.close())則文件句柄將一直存在,而不能被關(guān)閉.你也可以考慮設(shè)置socket的最大打開數(shù)來(lái)控制這個(gè)問(wèn)題.
- 對(duì)操作系統(tǒng)做相關(guān)的設(shè)置,增加最大文件句柄數(shù)量。
增加最大文件句柄數(shù)量:
nofile(可打開的文件描述符的最大數(shù))和nproc(單個(gè)用戶可用的最大進(jìn)程數(shù)量)
cp /etc/security/limits.conf /etc/security/limits.conf_bak
echo "### add by css ### " >>/etc/security/limits.conf
echo "* soft nofile 65536" >>/etc/security/limits.conf
echo "* hard nofile 65536" >>/etc/security/limits.conf
echo "* soft nproc 65536" >>/etc/security/limits.conf
echo "* hard nproc 65536" >>/etc/security/limits.conf
重啟系統(tǒng),才能生效.
ulimit -a 查看所有設(shè)置
ulimit -u 65535(新的open files 值)修改設(shè)置
ulimit -n 65536 設(shè)置用戶可以同時(shí)打開的最大文件數(shù)(max open files) 默認(rèn)是2048
如果本參數(shù)設(shè)置過(guò)小,對(duì)于并發(fā)訪問(wèn)量大的網(wǎng)站,可能會(huì)出現(xiàn)too many open files的錯(cuò)誤 。
使用lsof -p pid [httpd進(jìn)程的 pid、java的pid]來(lái)查看系統(tǒng)中Apache進(jìn)程和java運(yùn)行時(shí)進(jìn)程當(dāng)前打開的文件資源:
lsof -p `ps -ef|grep tomcat|grep -v "grep --color=auto tomcat"|awk '{print $2}'` | wc -l






