0

我们在 REST 服务上运行 JavaMelody,最近遇到了服务器崩溃的问题,例如

Socket accept failed: java.net.SocketException: Too many open files

事实证明,JavaMelody 在 /tmp/javamelody 中创建了数万个文件。我该如何解决。

4

1 回答 1

4

所以事实证明,JavaMelody 为每个 URL 和 SQL 请求创建了唯一的 RRD 文件。我们的 REST 服务公开了数百个端点,每个端点都可以接收数千个值,例如

http://server/get/entity/10

其中 10 可以是系统中的任何唯一 ID。因此,我们拥有与要查询的实体一样多的 RRD 文件。

https://github.com/javamelody/javamelody/wiki/UserGuide#6-optional-parameters上的文档提示了名为http-transform-pattern和的选项sql-transform-pattern

参数 http-transform-pattern 是一个正则表达式,用于转换 http 请求的描述并删除动态部分(例如对象的标识符)以便能够聚合这些请求

类似地,参数 sql-transform-pattern 是一个正则表达式,用于转换 sql 请求的描述(例如,不是“in”子句的绑定标识符),以便能够聚合这些请求。

这是对这些选项的作用的非常模糊的描述,而且它们如何提供帮助也不是很明显。但其他有同样问题的人表示这些设置解决了他们的问题,所以我深入挖掘。

我怀疑这些选项的工作原理是通过用“$”替换与正则表达式匹配的 URL 的任何部分。因此设置http-transform-pattern\d+意味着 URLhttp://server/get/entity/10http://server/get/entity/20两者的数字都与正则表达式匹配,然后聚合到 URLhttp://server/get/entity/$中。这反过来又减少了 RRD 文件的数量,因为不再为每个 id 创建新文件。

在我们的例子中,我们使用lookbehinds 对URL 进行分组。因此,我们设置http-transform-pattern(?<=/server/get/fuzzballs).*|(?<=/server/get/foobars).*将 URL 聚合到存储桶http://server/get/fuzzballs$/server/get/foobars$.

于 2013-10-02T22:19:31.893 回答