在linux环境中,有一个叫句柄的东西,每一个进程都有自己最大句柄数,当超过最大值的时候,程序会报错:Too many open files。所以我们在部署环境的时候需要设置自己的最大值,防止该值过小导致环境问题影响程序运行。句柄的最大值可以通过命令:ulimit -n来查询,该命令是系统的全局配置环境,进程的最大句柄查询如下:
通过获取进程的进程id进行查询。
http服务是基于tcp的7层协议,其中tcp的三次握手和四次挥手相关知识大家自行学习,本章不进行赘述。http连接是基于发起端(client)和响应端(server),close_wait是tcp过程中的一个中间状态,该状态在client端和server端都会出现,其中client端的问题比较简单,大部分情况是server端处理时间过长,或者server端处理请求过多阻塞导致,解决方法可以采用如下:
- 扩展server端机器,集群负载方式;
- 程序代码优化;
- http服务采用异步方式调用;
Server端出现大量close_wait问题是如下流程引起:
- client发起请求到server端;
- Server端同步处理请求,不会给client端进行报文回复;
- Client收不到server报文回复,client端的超时时间到达发送关闭连接报文;
- Server端收到client的关闭连接报文,由于server端还在处理程序,所以对该报文不处理,并且占用该连接;
- Client关闭连接;
- Server端程序处理完成,发送回复报文给client;
- Client收到server的回复报文,但是client已经把该连接关闭掉了,导致client不认识该报文进而发送est的错误报文给server;
- Server没收到正常的挥手报文导致tcp连接处于close_wait状态,然后需要等待系统的过期时间(150min)后把该tcp连接进行回收;
- 大量请求后导致server端出现大量tcp连接(close_wait状态),占用大量句柄,慢慢导致程序变慢,最终程序卡死状态处理不了新请求。
以上就是http server端出现大量close_wait状态的流程,解决问题的途径就是进行代码优化,或者采用异步通信的方式。希望该文章能帮助大家。