Groovy启动很慢

时间:2014-04-08 22:20:08

标签: performance groovy redhat

当我在我的一台Linux机器上启动Groovy时出现问题 - 执行非常简单的命令大约需要30秒:

groovy -e ""

如果我在其上运行strace,我就会看到它停在哪里并等待:

mprotect(0x7fae284e0000, 4096, PROT_NONE) = 0
clone(child_stack=0x7fae285dfff0, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fae285e09d0, tls=0x7fae285e0700, child_tidptr=0x7fae285e09d0) = 62660
futex(0x7fae285e09d0, FUTEX_WAIT, 62660, NULL <unfinished ...>

有没有办法弄清楚它在等什么,为什么以及如何解决它?

我正在运行Red Hat 6.3,Groovy版本:2.2.1 JVM:1.7.0_25供应商:Oracle Corporation操作系统:Linux

这是时间命令:

bin $ time groovy -e&#34;&#34;

真正的0m22.255s 用户0m26.875s sys 0m2.064s

已编辑:

根据建议,做了strace -f,这是我看到的:

[pid 49451] <... gettimeofday resumed> {1397076179, 998954}, NULL) = 0
[pid 49482] clock_gettime(CLOCK_MONOTONIC,  <unfinished ...>
[pid 49451] gettimeofday( <unfinished ...>
[pid 49482] <... clock_gettime resumed> {10719052, 15135866}) = 0
[pid 49451] <... gettimeofday resumed> {1397076180, 871}, NULL) = 0
[pid 49482] gettimeofday({1397076180, 2272}, NULL) = 0
[pid 49451] gettimeofday( <unfinished ...>
[pid 49482] futex(0x7fde3c145554, FUTEX_WAIT_BITSET_PRIVATE|FUTEX_CLOCK_REALTIME, 1, {1397076180, 52272000}, ffffffff <unfinished ...>
[pid 49451] <... gettimeofday resumed> {1397076180, 3226}, NULL) = 0
[pid 49451] gettimeofday({1397076180, 5444}, NULL) = 0
[pid 49451] gettimeofday({1397076180, 7123}, NULL) = 0
[pid 49451] gettimeofday({1397076180, 8765}, NULL) = 0
[pid 49451] gettimeofday({1397076180, 9766}, NULL) = 0
[pid 49451] gettimeofday({1397076180, 10650}, NULL) = 0
[pid 49451] gettimeofday({1397076180, 11611}, NULL) = 0
[pid 49451] gettimeofday({1397076180, 12648}, NULL) = 0
[pid 49451] gettimeofday({1397076180, 13569}, NULL) = 0
[pid 49451] gettimeofday({1397076180, 14450}, NULL) = 0
[pid 49451] gettimeofday({1397076180, 16851}, NULL) = 0
[pid 49451] gettimeofday({1397076180, 17891}, NULL) = 0
[pid 49451] gettimeofday({1397076180, 19012}, NULL) = 0
[pid 49451] gettimeofday({1397076180, 20415}, NULL) = 0
[pid 49451] gettimeofday({1397076180, 21734}, NULL) = 0

看起来好像正在等待gettimeofday,我看到了很多这样的痕迹。

以下是它的结束方式:

[pid 49475] gettimeofday({1397076182, 86016}, NULL) = 0
[pid 49475] futex(0x7fde3c008754, FUTEX_WAKE_OP_PRIVATE, 1, 1, 0x7fde3c008750, {FUTEX_OP_SET, 0, FUTEX_OP_CMP_GT, 1}) = 1
[pid 49451] <... futex resumed> )       = 0
[pid 49475] madvise(0x7fddf09d6000, 1028096, MADV_DONTNEED <unfinished ...>
[pid 49451] futex(0x7fde3c008728, FUTEX_WAKE_PRIVATE, 1 <unfinished ...>
[pid 49475] <... madvise resumed> )     = 0
[pid 49451] <... futex resumed> )       = 0
[pid 49475] _exit(0)                    = ?
Process 49475 detached
[pid 49451] rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
[pid 49451] unlink("/tmp/mydirectory/49439") = 0
[pid 49451] madvise(0x7fde42dcc000, 1028096, MADV_DONTNEED) = 0
[pid 49451] _exit(0)                    = ?
Process 49451 detached
[pid 49439] <... futex resumed> )       = 0
[pid 49439] exit_group(0)               = ?

1 个答案:

答案 0 :(得分:1)

大量gettimeofday次来电可能与此bug report有关 您可以尝试建议的解决方法,并使用-XX:-UsePerfData JVM选项启动Groovy 如果它无助于缩短启动时间,至少它会清除strace输出,并可能有助于从中获取更好的信息。