我们在 REST 服务上运行 JavaMelody,最近遇到了服务器崩溃的问题,例如
Socket accept failed: java.net.SocketException: Too many open files
事实证明,JavaMelody 在 /tmp/javamelody 中创建了数万个文件。我该如何解决。
我们在 REST 服务上运行 JavaMelody,最近遇到了服务器崩溃的问题,例如
Socket accept failed: java.net.SocketException: Too many open files
事实证明,JavaMelody 在 /tmp/javamelody 中创建了数万个文件。我该如何解决。
所以事实证明,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/10
和http://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$
.