【问题标题】:Java Identifying Source of LatencyJava 识别延迟源
【发布时间】:2021-04-23 08:16:57
【问题描述】:

我正在研究一个概念上相当简单的 java 进程。它是一个单一的线程,不断地从各种来源获取数据并根据这些数据做出决策。我最近注意到 2 条日志行之间存在可疑延迟,我不希望在 2 条日志行之间发生太多处理。(数十英里的延迟与 1 到几英里的预期)

由于这种可疑的延迟并不总是存在,我的第一个想法是我在最大限度地减少垃圾收集需求方面做得很差,导致 JVM 在不需要的时间暂停执行。

虽然我仍然认为我在这方面做得不好,但这似乎不是原因。我添加了以下 JVM 参数:-Xlog:gc*=info,safepoint::timemillis,level,tags 我发现可疑的日志行之间没有停顿。这些 JVM 参数不会显示其他 JVM 暂停吗?

无论如何,Java 专业人士有什么建议可以尝试有效地追踪这种延迟的来源吗?我可以使用任何(最好是免费的)工具来监控和了解正在发生的事情?

环境信息:Linux 3.10,java 11。有问题的进程在一个独立的核心上运行,除此之外我没有做太多的调整。

【问题讨论】:

  • 您是否尝试过使用 Flight Recorder + Mission Control 分析您的代码?
  • 添加更多日志行。找到新的两条线,它们之间有间隙。在它们之间添加更多日志行。重复。只需要几次迭代就可以缩小范围。如果延迟开始在多条线路之间扩散,那么您会发现一堆 缓慢的东西。如果您获得比预期更多的日志行,您会发现意外的慢循环。
  • 这也可能取决于您的登录方式。一个专用的Logger?解析日志的FluentBitSystem.out::println?
  • @Eugene,好问题。我正在使用java.util.logging.Logger 实例
  • 我没有看得太深,但我确实看到该记录器中的一些事情是在synchronized 锁定下完成的。这可以解释。也可能是一个文件也在那个时候旋转

标签: java performance optimization latency


【解决方案1】:

根据信息的来源,获取信息可能存在延迟。就像它必须连接到服务器一样,那么服务器的连接和查询可能会引入这种延迟。或者您访问磁盘的速度太快,并且您受到驱动器速度的限制。除此之外,我不确定。可能会添加其中一些。

long time = System.currentTimeMillis();
foo();
System.err.println(System.currentTimeMillis() - time + "ms");

【讨论】:

  • 嗨,Shawn,没有连接和抓取信息。日志由正在执行工作的进程直接生成到文件中。
猜你喜欢
  • 1970-01-01
  • 2015-11-16
  • 2014-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-07
  • 2012-04-01
  • 1970-01-01
相关资源
最近更新 更多