TCP的状态转换及生产问题实操
当然,也可以通过shell脚本实现复杂的查询,比如下面用于统计ESTABLISHED状态的数量。
netstat命令功能非常强大,由于篇幅问题,本文只能抛砖引玉,更多功能可以man一下看看,这里就不过多解释。 三、实际生产环境的意义 前面啰嗦了一大堆,我们回到正题,了解这些状态到底有什么用呢?我们知道Linux操作系统对文件句柄的总量是有限制的,套接字也属于文件句柄,因此也是有限制的。了解套接字的状态有助于我们了解服务器是否有隐患或者性能瓶颈。 说到这,可能有的同学还是不明白,我们举个简单的例子。假设一台服务器最多有6万个句柄,如果由于某种业务场景,在服务器端出现大量的TIME_WAIT,此时这些套接字是无法马上释放,也就是无法马上被重复使用,但仍然占用6万句柄的名额。这块,随着时间的推移,可能会耗尽所有句柄,从而导致有新的连接请求是服务器端无法响应的问题。 为了让大家更形象的理解这些状态在实际生产中的意义,我们举几个实际生产中遇到问题的例子。 1. 服务器端大量TIME_WAIT (1) 现象描述 某对象存储服务,在监控系统发现有大量的TIME_WAIT。经确认该服务器是一台新上架接入的服务器。经反复确认,具备相同功能的同集群的其它服务器工作都正常,并不存在大量TIME_WAIT的情况。 (2) 问题分析 结合协议我们知道主动关闭方会处于该状态,而且TIME_WAIT状态下的TCP连接会等待2*MSL。因此我们查看系统配置cat /proc/sys/net/ipv4/tcp_fin_timeout,发现是默认值。因此,确定是等待时间太长,导致套接字无法被利用所致。 (3) 问题解决 通过调整内核参数解决,打开文件/etc/sysctl.conf,编辑文件,加入以下内容:
然后执行/sbin/sysctl -p让参数生效。 上述内容的含义具体如下:
2. 服务器端大量ESTABLISHED (1) 问题描述 某Tomcat服务器出现大量ESTABLISHED连接。 (2) 问题分析 根据协议状态转换情况,初步推断是tomcat服务器回收session时出了问题,这个一般都跟服务器的Timeout设置有联系。 查看tomcat的配置文件 server.xml
我们重点关注一下connectionTimeout,这个配置导致建立一个socket连接后,如果一直没有收到客户端的FIN,也没有数据过来,那么此连接也必须等到10s后,才能被超时释放。由于服务器并发量大,而该超时时间有长,导致连接释放严重滞后,因此出现大量的ESTABLISHED连接。 (3) 问题解决 分析上述问题后,我们有针对性的作出如下修改。
修改后问题解决。 实际的例子还很多,但万变不离其宗,需要我们熟悉TCP协议和状态转换,这样在实际生产中遇到问题就可以有理有据的进行分析,然后轻松解决。 【编辑推荐】
点赞 0 (编辑:晋中站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |