情景描述:系统产生大量“Too many open files”
原因分析:在服务器与客户端通信过程中,因服务器发生了socket未关导致的closed_wait发生,致使监听port打开的句柄数到了1024个,且均处于close_wait的状态,最终造成配置的port被占满出现“Too many open files”,无法再进行通信。
close_wait状态出现的原因是被动关闭方未关闭socket造成,如附件图所示:
解决办法:有两种措施可行
一、解决:
原因是因为调用ServerSocket类的accept()方法和Socket输入流的read()方法时会引起线程阻塞,所以应该用setSoTimeout()方法设置超时(缺省的设置是0,即超时永远不会发生);超时的判断是累计式的,一次设置后,每次调用引起的阻塞时间都从该值中扣除,直至另一次超时设置或有超时异常抛出。
比如,某种服务需要三次调用read(),超时设置为1分钟,那么如果某次服务三次read()调用的总时间超过1分钟就会有异常抛出,如果要在同一个Socket上反复进行这种服务,就要在每次服务之前设置一次超时。
二、规避:
调整系统参数,包括句柄相关参数和TCP/IP的参数;
注意:
/proc/sys/fs/file-max 是整个系统可以打开的文件数的限制,由sysctl.conf控制;
ulimit修改的是当前shell和它的子进程可以打开的文件数的限制,由limits.conf控制;
lsof是列出系统所占用的资源,但是这些资源不一定会占用打开文件号的;比如:共享内存,信号量,消息队列,内存映射等,虽然占用了这些资源,但不占用打开文件号;
因此,需要调整的是当前用户的子进程打开的文件数的限制,即limits.conf文件的配置;
如果cat /proc/sys/fs/file-max值为65536或甚至更大,不需要修改该值;
若ulimit -a ;其open files参数的值小于4096(默认是1024), 则采用如下方法修改open files参数值为8192;方法如下:
1.使用root登陆,修改文件/etc/security/limits.conf
vi /etc/security/limits.conf 添加
xxx - nofile 8192
xxx 是一个用户,如果是想所有用户生效的话换成 * ,设置的数值与硬件配置有关,别设置太大了。
#<domain> <type> <item> <value>
* soft nofile 8192
* hard nofile 8192
#所有的用户每个进程可以使用8192个文件描述符。
2.使这些限制生效
确定文件/etc/pam.d/login 和/etc/pam.d/sshd包含如下行:
session required pam_limits.so
然后用户重新登陆一下即可生效。
3. 在bash下可以使用ulimit -a 参看是否已经修改:
一、 修改方法:(暂时生效,重新启动服务器后,会还原成默认值)
sysctl -w net.ipv4.tcp_keepalive_time=600
sysctl -w net.ipv4.tcp_keepalive_probes=2
sysctl -w net.ipv4.tcp_keepalive_intvl=2
注意:Linux的内核参数调整的是否合理要注意观察,看业务高峰时候效果如何。
二、 若做如上修改后,可起作用;则做如下修改以便永久生效。
vi /etc/sysctl.conf
若配置文件中不存在如下信息,则添加:
net.ipv4.tcp_keepalive_time = 1800
net.ipv4.tcp_keepalive_probes = 3
net.ipv4.tcp_keepalive_intvl = 15
编辑完 /etc/sysctl.conf,要重启network 才会生效
/etc/rc.d/init.d/network restart
然后,执行sysctl命令使修改生效,基本上就算完成了。
------------------------------------------------------------
修改原因:
当客户端因为某种原因先于服务端发出了FIN信号,就会导致服务端被动关闭,若服务端不主动关闭socket发FIN给Client,此时服务端Socket会处于CLOSE_WAIT状态(而不是LAST_ACK状态)。通常来说,一个CLOSE_WAIT会维持至少2个小时的时间(系统默认超时时间的是7200秒,也就是2小时)。如果服务端程序因某个原因导致系统造成一堆CLOSE_WAIT消耗资源,那么通常是等不到释放那一刻,系统就已崩溃。因此,解决这个问题的方法还可以通过修改TCP/IP的参数来缩短这个时间,于是修改tcp_keepalive_*系列参数:
tcp_keepalive_time:
/proc/sys/net/ipv4/tcp_keepalive_time
INTEGER,默认值是7200(2小时)
当keepalive打开的情况下,TCP发送keepalive消息的频率。建议修改值为1800秒。
tcp_keepalive_probes:INTEGER
/proc/sys/net/ipv4/tcp_keepalive_probes
INTEGER,默认值是9
TCP发送keepalive探测以确定该连接已经断开的次数。(注意:保持连接仅在SO_KEEPALIVE套接字选项被打开是才发送.次数默认不需要修改,当然根据情形也可以适当地缩短此值.设置为5比较合适)
tcp_keepalive_intvl:INTEGER
/proc/sys/net/ipv4/tcp_keepalive_intvl
INTEGER,默认值为75
当探测没有确认时,重新发送探测的频度。探测消息发送的频率(在认定连接失效之前,发送多少个TCP的keepalive探测包)。乘以tcp_keepalive_probes就得到对于从开始探测以来没有响应的连接杀除的时间。默认值为75秒,也就是没有活动的连接将在大约11分钟以后将被丢弃。(对于普通应用来说,这个值有一些偏大,可以根据需要改小.特别是web类服务器需要改小该值,15是个比较合适的值)
【检测办法】
1. 系统不再出现“Too many open files”报错现象。
2. 处于TIME_WAIT状态的sockets不会激长。
在 Linux 上可用以下语句看了一下服务器的TCP状态(连接状态数量统计):
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
返回结果范例如下:
ESTABLISHED 1423
FIN_WAIT1 1
FIN_WAIT2 262
SYN_SENT 1
TIME_WAIT 962
- 浏览: 326815 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (140)
- oracle (2)
- j2se (18)
- 应用服务器 (2)
- 操作系统 (21)
- j2ee (3)
- web (9)
- Junit (0)
- 项目 (0)
- IDE (0)
- 五花八门 (1)
- excel导入导出 (0)
- DWR (0)
- display标签总结 (0)
- JS (7)
- FCKeditor (0)
- Spring (3)
- webservice (1)
- JVM (14)
- 传输协议 (6)
- maven (3)
- 服务器 (2)
- 数据结构 (11)
- HTTPClient (2)
- JQUERY (9)
- 设计模式 (4)
- 数据库 (6)
- 看书笔记 (0)
- 工具 (4)
- MINA (3)
- mysql (5)
- jetty (1)
- JAVA网络编程 (7)
- Hessian (1)
- ibatis (1)
- socket (4)
- Native (1)
- http (2)
- nosql (2)
- linux (1)
- hadoop (1)
最新评论
-
applezjv:
可以...
maven常见问题 -
andyboy_bin:
p
Jetty -
ye_wx:
...
TableSpace -
ye_wx:
TableSpace -
极限_裁决:
引用第二:不要把“好像”;“有人会……”;“大概”;“晚些时候 ...
可以让你少奋斗10年的工作经验
发表评论
-
CLOSE_WAIT状态的原因与解决方法
2013-09-02 13:49 19266这个问题之前没有怎 ... -
close_wait状态和time_wait状态
2012-12-26 23:21 1319close_wait状态和time_wait状态 ... -
CLOSE_WAIT状态说明
2012-12-26 22:19 1664CLOSE_WAIT出现的原因: 就是某一方在网络连接断 ... -
集中通讯方式的比较
2012-04-08 01:50 810一、综述 本文比较了RMI,Hessian,Burla ... -
hessian
2012-04-04 18:32 0组长说要大家一起学习下Hessian,于是开始各个网站搜寻相关 ... -
javanio连接池
2012-03-22 15:23 0用java的nio技术实现的异步连接池 2009-06 ... -
何为nio
2012-03-22 12:07 0很早就听说tomcat6 ... -
javanio例子
2012-03-22 11:54 0用java.nio.*进行网络编程 作者:网管整理 ... -
JAVA NIO
2012-03-21 18:06 0Java NIO非堵塞应 ... -
java nio
2012-03-21 17:30 01. 基本 概念 IO 是主存和外部设备 ( ... -
基于事件的NIO多线程服务器
2012-03-20 19:11 0基于事件的NIO多线程 ... -
Java的NIO以及线程并发
2012-03-20 19:09 0NIO出现后,好像让 ... -
java.nio.buffer
2012-03-20 17:34 903缓冲区分为直接缓冲区和间接缓冲区,直接缓冲区的创 ... -
javaNio原理解读
2012-03-20 11:57 0本文简介: JDK 1.4 中引入的新输入输出 (NIO) 库 ... -
什么事javanio
2012-03-20 11:04 0这次次我们要为大家介绍的是Java NIO的相关知识 ... -
Java NIO原理和使用
2012-03-20 10:59 1097Java NIO非堵塞应用通常适用用在I ... -
JAVA NIO
2012-03-18 12:50 868java NIO非堵塞应用通常 ... -
HTTP协议详解
2009-09-07 17:57 1452根据网上资料做一个整理 引言 ...
相关推荐
关于系统端口出现CLOSE_WAIT状态的解决方案,讲解明确清晰,值得参考
近期服务器出现大量time_wait的TCP连接造成服务器连接数过多而最终导致tomcat假死状态。连接服务器查看连接数的时候提示如下。 [root@test apache-tomcat-7.0.53]# netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a...
减少Linux服务器过多的TIME_WAIT TIME_WAIT状态的意义: 客户端与服务器端建立TCP/IP连接后关闭SOCKET后,服务器端连接的端口 状态为TIME_WAIT 是不是所有执行主动关闭的socket都会进入TIME_WAIT状态呢? 有...
windows 2008 R2解决socket连接不释放补丁包_time-wait过多注册表修改, Windows time_wait过多解决办法解决办法: 修改注册表中的tcpip的TIMEWAIT回收时间属性值,需要重启后生效 在HKEY_LOCAL_MACHINE\SYSTEM...
适用于windows/linux/aix通用的 端口转发小程序!!!!
ubuntu系统 linux环境下的socat实现端口转发功能 包括客户端和服务端
代理_端口转发_端口映射_NAT_概念释疑2.31
端口映射_Rinetd v0.62 For Linux_Windows,本版本主要用于在Linux中映射,功能太强大.Windows也支持.整理一下上传上来于大家分享.内有说明教程.昆虫发布.
网络安全技术-TP端口状态_RSTP(4种端口)_VLAN_Trunk(ISL_802.1Q).mp3
linux下查看端口命令及服务linux下查看端口命令及服务
驱动隐藏端口,端口隐藏后无法通过系统命令查看。
利用rootkit技术实现的端口隐藏,感觉还不错哟。。
Linux对IO端口资源的管理,出自詹荣开,对Linux下IO端口资源的管理讲的深入浅出,非常透彻
Linux 开启端口方法,Linux 开启端口方法,Linux 开启端口方法
linux下查看端口是否被占用以及查看所有端口 linux下查看端口是否被占用以及查看所有端口
端口转发,用线程池技术,自己写的,可以参考
非常好用的linux下端口重定向工具。配置简单,使用方便,功能强大稳定
linux系统下端口复用技术,介绍Linux系统端口复用的教程
资源名称:RouterOS_端口映射_(远程桌面)资源截图: 资源太大,传百度网盘了,链接在附件中,有需要的同学自取。
串行端口大全_0.pdf.