【问题标题】:java server application performance issuesjava服务器应用程序性能问题
【发布时间】:2020-12-07 18:39:09
【问题描述】:

我正在监控一个长时间运行的java进程,该进程使用G1垃圾收集器。

这些是我的 java 选项(在服务器模式下运行):

-Xmx2048m -XX:+UseG1GC -XX:+UseStringDeduplication -XX:G1HeapRegionSize=32M -XX:MetaspaceSize=100m -XX:CompressedClassSpaceSize=400m 

该进程是一个 java websocket 服务器,它涉及大量 I/O,并在其前面嵌入了 tomcat。 根据 java 任务控制,顶部堆使用量达到 1.7GB,并且在每个 GC 周期后它会减少到 ~900MB。 该进程在具有 3.8GB 内存限制的 docker 容器中运行。 使用top -o %MEM 时,显示总 RES 为 2.6GB,永远不会更多。

我注意到在大量 websocket 连接/断开连接后,该过程变得非常缓慢且无响应。

当我尝试在 6-7 小时后再次加载此进程时,当它处于空闲状态且连接“干净”时,它会在 6-7 秒后响应,而在第一次加载时,响应时间要低得多 ~2-3 秒.

我认为它与文件描述符有关,但在检查时:

ls /proc/1/fd | wc -l

从 docker 内部,它显示所有已释放的文件描述符。

java 版本:8u131 tomcat 版本:8.5.60

这是我的堆在加载 6 小时且服务器上没有连接后的样子: 这是来自江铃:

我该如何进一步调查?

【问题讨论】:

    标签: java performance memory jvm file-descriptor


    【解决方案1】:

    不要关注内存和垃圾收集(目前),但要确定请求处理中需要时间的内容。 您的请求处理程序代码中花费的时间是多少?是在别的地方吗?

    如果你可以修改代码,你可以简单地添加一些 println 语句来启动。 并且/或者您可以使用像 https://github.com/jvm-profiling-tools/async-profiler 这样的轻量级 cpu 分析器来获取 CPU 火焰图 - wall-clock profiling 可能对“off-cpu”分析特别有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-22
      • 1970-01-01
      • 2021-04-23
      • 1970-01-01
      • 2011-08-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多