2016-03-22 3 views
7

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

[email protected] ~ (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:

[email protected] ~ % cat Loop.java 
class Loop { 

    public static void main(String[] args) throws InterruptedException { 
     while (true) { 
       Thread.sleep(5000); 
     } 
    } 
} 
[email protected] ~ % javac Loop.java 
[email protected] ~ % java Loop 

я могу Не находите никаких датчиков:

[email protected] ~ (255) % pfexec dtrace -ln 'hotspot*:::' 
    ID PROVIDER   MODULE       FUNCTION NAME 
dtrace: failed to match hotspot*:::: No probe matches description 

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

ответ

15

Проблема здесь состоит в том, что на 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.) Если это проблема, о которой вы заботитесь, в вариантах освещенности (SmartOS, OmniOS и т. Д.), Вы можете эффективно отменить ленивую загрузку зондов DTrace (и помощника стека), используя библиотеку аудита , предназначенную для этой задачи. Эта библиотека - /usr/lib/dtrace/libdtrace_forceload.so и ее 64-битный вариант, /usr/lib/dtrace/64/libdtrace_forceload.so - эффективно заставляют зонды DTrace загружаться при запуске процесса, предоставляя вам пробники USDT и действие jstack() для всех таких процессов. Для того, чтобы сделать это для 32-разрядных виртуальных машин, запустите java с переменной LD_AUDIT_32 среды набором:

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

Для 64-разрядных виртуальных машин:

export LD_AUDIT_64=/usr/lib/dtrace/64/libdtrace_forceload.so 
Смежные вопросы