内存使用率高达微米级



我们看到了我们的一些服务(Java <>SpringBoot)获得OOM。在检查堆转储时,我们发现micrometer库占用了113MB(约占堆内存总量的54%)。

io.micrometer.statsd.internal.LogbackMetricsSuppressingUnicastProcessor
Jar: io.micrometer:micrometer-core

我在网上做了一些研究,发现创建很多不同的标签会导致这个问题。然而,我们的服务并非如此。我们把很多指标推给数据狗,但一直在重复使用标签。

这样的内存问题通常是由使用高基数标记引起的。

这里的高基数意味着标签可以有大量的唯一值。例如,如果您想将用户的gender附加到指标上,那么该标记可能具有较低的基数,因为您可能没有很多值可供选择。另一方面,userID是高基数的,因为每个用户都有一个唯一的。

拥有高基数标记可能会导致大量的度量,因为每个唯一值都有一个度量,这将导致高内存消耗,并且您的度量后端也会遇到类似的问题。

(可能)高基数标签的示例:

  • 资源ID,例如:userID
  • 电子邮件地址(基本上任何用户输入)
  • 请求路径而不是模板(例如:它可以包含resourceID)

请参阅本文以获取更多详细信息:https://develotters.com/posts/high-cardinality/也可以参见Micrometer文档:https://micrometer.io/docs/concepts#_tag_values

你有高基数标签吗?如果是,您可以规范化或删除它们。

最新更新