- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Toomanyopenfiles问题的解决
在Linux下,我们使用ulimit -n 命令可以看到单个进程能够打开的最大文件句柄数量 socket连接也算在里面 。系统默认值1024。 对于一般的应用来说 象Apache、系统进程 1024完全足够使用。但是如何象squid、mysql、java等单进程处理大量请求的应用来说就有点捉襟见肘了。如果单个进程打开的文件句柄数量超过了系统定义的值,就会提到“too many files open”的错误提示。如何知道当前进程打开了多少个文件句柄呢?下面一段小脚本可以帮你查看:
lsof -n |awk print $2 |sort|uniq -c |sort -nr|more 在系统访问高峰时间以root用户执行上面的脚本,可能出现的结果如下:
# lsof -n|awk print $2 |sort|uniq -c |sort -nr|more 131 24204 57 24244 57 24231 56 24264??
其中第一行是打开的文件句柄数量,第二行是进程号。得到进程号后,我们可以通过ps命令得到进程的详细内容。
ps -aef|grep 24204??
mysql????24204 24162 99 16:15 00:24:25 /usr/sbin/mysqld??
哦,原来是mysql进程打开最多文件句柄数量。但是他目前只打开了131个文件句柄数量,远远底于系统默认值1024。
但是如果系统并发特别大,尤其是squid服务器,很有可能会超过1024。这时候就必须要调整系统参数,以适应应用变化。Linux有硬性限制和软性限制。可以通过ulimit来设定这两个参数。方法如下,以root用户运行以下命令:
ulimit -HSn 4096??
以上命令中,H指定了硬性大小,S指定了软性大小,n表示设定单个进程最大的打开文件句柄数量。个人觉得最好不要超过4096,毕竟打开的文件句柄数越多响应时间肯定会越慢。设定句柄数量后,系统重启后,又会恢复默认值。如果想永久保存下来,可以修改.bash_profile文件,可以修改 /etc/profile 把上面命令加到最后。 findsun提出的办法比较合理 Too many open files经常在使用linux的时候出现,大多数情况是您的程序没有正常关闭一些资源引起的,所以出现这种情况,请检查io读写,socket通讯等是否正常关闭。 如果检查程序没有问题,那就有可能是linux默认的open files值太小,不能满足当前程序默认值的要求,比如数据库连接池的个数,tomcat请求连接的个数等。。。 查看当前系统open files的默认值,可执行:
Java代码
[root@pororo script]# ulimit -a core file size blocks, -c 0??
data seg size kbytes, -d unlimited scheduling priority -e 0??
file size blocks, -f unlimited pending signals -i 128161??
max locked memory kbytes, -l 32??
max memory size kbytes, -m unlimited open files -n 800000??
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 128161??
virtual memory kbytes, -v unlimited file locks -x unlimited 如果发现open files项比较小,可以按如下方式更改: 1. 检查/proc/sys/fs/file-max文件来确认最大打开文件数已经被正确设置。
Java代码
# cat /proc/sys/fs/file-max 如果设置值太小,修改文件/etc/sysctl.conf的变量到合适的值。这样会在每次重启之后生效。 如果设置值够大,跳过这一步。
Java代码
# echo 2048 /proc/sys/fs/file-max 编辑文件/etc/sysctl.conf,插入下行:
Java代码
fs.file-max 8192 2. 在/etc/security/limits.conf文件中设置最大打开文件数
原创力文档


文档评论(0)