我有一个处理 http 和 https 请求的播放框架 1.2.4 站点。
Play 监听 80 和 443 端口,没有安装反向代理。
一段时间后,站点停止响应,并在日志中显示大量“java.io.IOException:打开的文件过多”。
显然,播放有时会使 https 连接处于 CLOSE_WAIT 状态。这些连接如下所示:
java 24151 root 201u IPv6 915797 0t0 TCP Ubuntu-1004-lucid-64-minimal:https->xdsl.******.net:55055 (CLOSE_WAIT)
以下是对存活(工作几个小时)和死亡(打开 16k 文件)的 lsof 转储的分析:
$ grep "CLOSE_WAIT" dead.txt | wc -l
10473
$ grep "ESTABLISHED" dead.txt | wc -l
1888
$ grep "https.*CLOSE_WAIT" dead.txt | wc -l
10473
$ grep "https.*ESTABLISHED" dead.txt | wc -l
1621
$ grep "CLOSE_WAIT" alive.txt | wc -l
7
$ grep "ESTABLISHED" alive.txt | wc -l
50
$ grep "https.*CLOSE_WAIT" alive.txt | wc -l
7
$ grep "https.*ESTABLISHED" alive.txt | wc -l
32
如您所见,约 20% 的请求是 http,但所有处于 CLOSE_WAIT 状态的连接都是 https。
什么可能造成麻烦?这可能是游戏框架中的错误吗?