【问题标题】:How to configure keep-alive timeout in playframework 2如何在 playframework 2 中配置保持活动超时
【发布时间】:2012-11-15 23:31:05
【问题描述】:

我在生产中使用 playframework 2.0,我看到相应的 java 进程打开的文件数量迅速增加。我将进程的默认允许打开文件数从 1024 更改为 4096,但这只是延迟了一个问题,一段时间后打开文件的数量变得如此之大,以至于服务器速度变慢,有时甚至出现 java.net.SocketException“太许多打开的文件”出现在日志中。

我使用的是 ubuntu 服务器 12.04,sun jdk 1.7.0_09。

lsof 命令表明几乎所有打开的文件都是为用户连接创建的套接字,因此我得出一个结论,playframework 使用的 Netty 服务器保持大量打开的连接处于活动状态。据我了解,我应该更改 Netty 服务器的保活行为,例如,设置低保活超时。如何在 playframework 2.0 中配置它?或者可能是其他问题?如果需要,我可以提供任何配置。

UPD:这是lsof -aPn -p 12251 的一些输出。我用***审查了一些ips

COMMAND   PID USER   FD   TYPE             DEVICE SIZE/OFF   NODE NAME
java    12251 root  324u  IPv6             279502      0t0    TCP 10.127.0.***:80->***.***.65.137:51506 (ESTABLISHED)
java    12251 root  325u  IPv6             286749      0t0    TCP 10.127.0.***:80->***.***.18.121:1624 (ESTABLISHED)
java    12251 root  327u  IPv6             287220      0t0    TCP 10.127.0.***:80->***.***.126.210:49244 (ESTABLISHED)
java    12251 root  330u  IPv6             279289      0t0    TCP 10.127.0.***:80->***.***.65.155:12444 (ESTABLISHED)
java    12251 root  331u  IPv6             285609      0t0    TCP 10.127.0.***:80->***.***.33.233:2552 (ESTABLISHED)
java    12251 root  332u  IPv6             285610      0t0    TCP 10.127.0.***:80->***.***.33.233:2554 (ESTABLISHED)
java    12251 root  333u  IPv6             287236      0t0    TCP 10.127.0.***:80->***.***.90.20:16040 (ESTABLISHED)
java    12251 root  334u  IPv6             284047      0t0    TCP 10.127.0.***:80->***.***.195.2:1175 (ESTABLISHED)
java    12251 root  335u  IPv6             279357      0t0    TCP 10.127.0.***:80->***.***.65.137:51273 (ESTABLISHED)
java    12251 root  336u  IPv6             279988      0t0    TCP 10.127.0.***:80->***.***.65.137:51287 (ESTABLISHED)

【问题讨论】:

  • 你确定它来自 Play 吗?你不会在你的应用程序中生成某种文件吗?
  • 我不会从文件系统生成或读取任何文件,所有资源都自动打包在应用程序 jar 中。如果我通过lsof 实用程序测试打开了哪些文件,我会看到这些文件是指向许多不同 IP 的 unix 套接字,所以我认为这些套接字已连接到用户。而且它们不对应,例如,与我的数据库的连接。

标签: playframework-2.0 netty keep-alive


【解决方案1】:

如果您在没有任何 HTTP 服务器的情况下使用 Play,您可以在发送 Result (Scala version) 之前manipulate the response headers,否则您需要检查前端服务器的设置。

response().setHeader(CONNECTION, "Keep-Alive");
response().setHeader("Keep-Alive", "timeout=3, max=10");
return ok(index.render());

请注意,这些值是示例值,我不知道它们是否符合您的需求。

【讨论】:

  • 是的,我不使用任何其他 HTTP 服务器。看来这就是我所需要的,我会测试。
  • 顺便说一句,尝试在google群上提问,有更多的geek,所以也许有人会发现你的问题
  • 不幸的是,我无法完成这项工作。我在本地电脑上测试过,设置timeout=1,max=1,但是连接挂了很长时间。无论我是否添加标题,它们都会自行关闭。我读到这个标头主要用于诊断,因此它们几乎不会影响服务器的行为。而且,总是设置这个headers非常困难,程序中的控制器很多,也有不是我写的控制器,例如Assets控制器。
  • 我在发布答案后观察到相同的行为,但是代码正确设置了标题。
  • 是的,标题是正确的。现在我试着在谷歌群里问。由于预审,现在没有链接。
猜你喜欢
  • 1970-01-01
  • 2013-10-09
  • 1970-01-01
  • 2018-11-09
  • 1970-01-01
  • 2015-01-25
  • 1970-01-01
  • 2016-03-23
  • 2018-03-16
相关资源
最近更新 更多