Как использовать зонды HotSpot DTrace в SmartOS?

В Mac OS X я могу найти зонды HotSpot для запуска Java-программ, выполнив:

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

Есть ли что-то особенное, что мне нужно сделать, чтобы увидеть их?


person argentpyro    schedule 22.03.2016    source источник


Ответы (1)


Проблема здесь в том, что в SmartOS (и других вариантах illumos, а также их проприетарных родственниках Solaris) модуль DTrace в JVM загружается лениво (то есть DOF был скомпилирован с -x lazyload). В результате зонды DTrace не загружаются до тех пор, пока они не будут включены явным образом. Есть два способа справиться с этим. Во-первых, вы можете указать DTrace, чтобы он включил определенные тесты, о которых идет речь, заставляя целевой процесс загружать свои тесты. Для этого требуется (как минимум) идентификатор целевого процесса; чтобы выразить это в примере, указанном в вопросе, это будет что-то вроде:

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

Это улавливает hotspothotspot_jni) зонды USDT, но по-прежнему затрудняет использование действия jstack() на машине, заполненной ничего не подозревающими процессами Java. (То есть это работает, когда вы хотите использовать зонды 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
person Bryan Cantrill    schedule 23.03.2016