如何在 SmartOS 上使用 HotSpot DTrace 探针?

Posted

技术标签:

【中文标题】如何在 SmartOS 上使用 HotSpot DTrace 探针?【英文标题】:How do I use the HotSpot DTrace probes on SmartOS? 【发布时间】:2016-03-22 22:57:15 【问题描述】:

在 Mac OS X 上,我可以通过运行以下命令找到运行 Java 程序的 HotSpot 探针:

cody.mello@ashur ~ (1) % sudo dtrace -ln 'hotspot*:::'
Password:
Invalid connection: com.apple.coresymbolicationd
   ID   PROVIDER            MODULE                          FUNCTION NAME
165084  hotspot46      libjvm.dylib _ZN13instanceKlass15initialize_implE19instanceKlassHandleP6Thread [instanceKlass::initialize_impl(instanceKlassHandle, Thread*)] class-initialization-clinit
165085  hotspot46      libjvm.dylib _ZN13instanceKlass15initialize_implE19instanceKlassHandleP6Thread [instanceKlass::initialize_impl(instanceKlassHandle, Thread*)] class-initialization-concurrent
165086  hotspot46      libjvm.dylib _ZN13instanceKlass15initialize_implE19instanceKlassHandleP6Thread [instanceKlass::initialize_impl(instanceKlassHandle, Thread*)] class-initialization-end
165087  hotspot46      libjvm.dylib _ZN13instanceKlass15initialize_implE19instanceKlassHandleP6Thread [instanceKlass::initialize_impl(instanceKlassHandle, Thread*)] class-initialization-erroneous
165088  hotspot46      libjvm.dylib _ZN13instanceKlass15initialize_implE19instanceKlassHandleP6Thread [instanceKlass::initialize_impl(instanceKlassHandle, Thread*)] class-initialization-error
165089  hotspot46      libjvm.dylib _ZN13instanceKlass15initialize_implE19instanceKlassHandleP6Thread [instanceKlass::initialize_impl(instanceKlassHandle, Thread*)] class-initialization-recursive
...

但如果我创建一个简单的 Java 程序并在 SmartOS 上运行它:

cody@101901c9-6d66-ea32-fe42-f1fbebd4bf99 ~ % cat Loop.java 
class Loop 

    public static void main(String[] args) throws InterruptedException 
        while (true) 
                Thread.sleep(5000);
        
    

cody@101901c9-6d66-ea32-fe42-f1fbebd4bf99 ~ % javac Loop.java 
cody@101901c9-6d66-ea32-fe42-f1fbebd4bf99 ~ % java Loop

我找不到任何探针:

cody@101901c9-6d66-ea32-fe42-f1fbebd4bf99 ~ (255) % pfexec dtrace -ln 'hotspot*:::'
   ID   PROVIDER            MODULE                          FUNCTION NAME
dtrace: failed to match hotspot*:::: No probe matches description

我需要做什么特别的事情才能看到它们吗?

【问题讨论】:

【参考方案1】:

这里的问题是,在 SmartOS(和其他 illumos 变体——以及它们专有的 Solaris 表亲)上,JVM 中的 DTrace 模块是延迟加载的(也就是说,DOF 是用-x lazyload)。因此,在明确启用之前不会加载 DTrace 探测器。有两种方法可以解决这个问题。第一个是您可以告诉 DTrace 本身启用有问题的特定探测器,强制目标进程加载其探测器。这需要(至少)目标进程的ID;要在问题中提供的示例中说明这一点,它将类似于:

% pfexec dtrace -ln 'hotspot*$target:::' -p `pgrep -fn "java Loop"`

这将获取hotspot(和hotspot_jni)USDT 探测,但在充满毫无戒心的Java 进程的机器上使用jstack() 操作仍然很困难。 (也就是说,当您想在已知进程上使用 USDT 探测时,这有效,而不是当您想使用 ustack 帮助程序配置所有 Java 进程时。)如果这是您关心的问题,在 illumos 变体(SmartOS, Omnios 等),您可以使用专为该任务设计的 审计库 有效地撤消 DTrace 探针(和堆栈帮助程序)的延迟加载。这个库——/usr/lib/dtrace/libdtrace_forceload.so 及其 64 位变体/usr/lib/dtrace/64/libdtrace_forceload.so——将有效地强制在进程启动时加载 DTrace 探针,为您提供 USDT 探针和所有此类进程的 jstack() 操作。要为 32 位 JVM 执行此操作,请启动 java 并设置 LD_AUDIT_32 环境变量:

export LD_AUDIT_32=/usr/lib/dtrace/libdtrace_forceload.so

对于 64 位 JVM:

export LD_AUDIT_64=/usr/lib/dtrace/64/libdtrace_forceload.so

【讨论】:

以上是关于如何在 SmartOS 上使用 HotSpot DTrace 探针?的主要内容,如果未能解决你的问题,请参考以下文章

Managing Images on smartos

SmartOS轻量级多任务调度系统

ZFS+Dtrace+Zones+KVM=SMARTOS + dtrace 详细文档

如何在Android中检查网络内的互联网连接(通过HOTSPOT使用其他设备的互联网)

Hotspot优化指南(上)

Xcode debug Hotspot——创建Xcode项目