我已经将Apache设置为Java应用服务器(GlassFish)的反向代理,并且我注意到即使在闲置的开发系统上,在CLOSE_WAIT状态下也有大约100个连接:
sudo netstat -n -e -p -a -t | grep httpd | grep CLOSE_WAIT | wc -l
我正在使用以下HTTP代理设置:
ProxyPass /myapp http://localhost:8080/myapp ttl=20 max=1 smax=0 ProxyPassReverse /myapp http://localhost:8080/myapp
为什么所有这些连接都在附近? 我已经设置了“ttl = 20 max = 1 smax = 0”,所以我想所有的连接都会在空闲的系统上清理。 应用程序服务器是否不干净地清理连接?
我遇到了类似的问题,我正在寻找关于Apache的推理。 我怀疑Apache的prefork。
至于解决scheme,我使用了解决CLOSE_WAIT问题的Nginx。 然而,TIME_WAIT(约20,000)的数量表明,Java应用程序处理连接的方式有些不对。 使用Nginx的服务器和应用程序performance要好得多。
我希望有人能用技术深度来改善这个答案。
这些CLOSE_WAIT连接是死的,只是服务器把它们保存在tcp栈中,以防进一步的数据包到达它们。 在“过去的美好时光”中,Solaris服务器如果文件描述符太大,会耗尽文件描述符,系统会崩溃。 我们不得不增加内核允许的文件描述符总数,并减lessCLOSE_WAIT连接的清理间隔。
现在一天,文件描述符的默认数量通常足以忽略这个。 但是可以减less清理configuration,所以减less了CLOSE_WAIT连接的数量。
这些(Glassfish,Tomcat,JBoss,…)的本质是使用“大量”连接,而不是重用它们。 在大多数情况下,您可以放心地忽略。