【发布时间】:2014-04-08 22:20:08
【问题描述】:
当我在我的一台 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 ""
真正的 0m22.255s 用户 0m26.875s 系统 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) = ?
【问题讨论】:
-
什么版本的 groovy/Java?
-
Groovy 版本:2.2.1 JVM:1.7.0_25 供应商:Oracle Corporation 操作系统:Linux
-
卡在 futex 的事实可能意味着它正在等待另一个线程。尝试运行 strace -f 来跟踪子进程
-
我添加了 strace -f 结果,不知道如何解释
标签: performance groovy redhat