需要有关 Solaris 下 Java ProcessBuilder 性能的帮助

Tim*_*ell 5 java multithreading solaris processbuilder

我的问题是,JVM 是否共享某种与线程或进程相关的资源,这些资源可能会导致 ProcessBuilder 性能在正常使用一个月或更长时间后出现峰值?对所有应用程序使用 java 6 update 21。

在过去的几个月中,我们注意到数据中心中的单个服务器(运行 Solaris 10 的 Sparc M4000)可以运行大约 6-8 周而不会出现任何问题。然而,使用 ProcessBuilder 类运行脚本的应用程序的性能很快就会受到巨大的影响 - ProcessBuilder.start 有时需要一分钟多的时间才能返回。重新启动后,以及几周后,正常返回时间在 10 秒或可能 100 毫秒范围内。

我编写了一个单独的小应用程序,它创建了 5 个线程,每个线程使用 ProcessBuilder 连续运行“ls”命令 10 次,然后我从中收集统计信息以监控原始问题。该应用程序在每次运行后退出,并且每小时仅从 cron 运行一次。通常只需要一两秒钟。

昨晚,经过 45 天的正常运行时间和正常行为后,每次 ProcessBuilder.start 调用的 ProcessBuilder 时间再次飙升至一分钟多。

顶部显示没有内存或 CPU 占用。我确实尝试在测试应用程序上执行 jstack,但收到错误“无法创建 thread_db 代理”。

有任何想法吗?

bab*_*thy 4

我们在 Linux 中运行的应用程序也遇到了类似的问题。Linux JVM 代码使用分叉,这意味着每次执行时都会映射和复制地址空间。我们正在执行许多小的、短暂的进程。看来与您的应用程序的主要区别在于我们有一个相对较大的堆(大约 240GB),所以我确信这会产生影响。我们最终使用 JNI 和 posix spawn 实现了我们自己的生成代码。这是问题/答案的链接:Slowing process create under java