Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
Last revisionBoth sides next revision
work:semana_43_de_2021 [2021/10/27 15:21] magsilvawork:semana_43_de_2021 [2021/10/27 15:31] magsilva
Line 3: Line 3:
 ===== Pesquisa ===== ===== Pesquisa =====
   * Usar o eBPF para obter rastros de aplicações abre diversas possibilidades. O tutorial disponível em https://github.com/goldshtn/linux-tracing-workshop/blob/master/bpf-usdt.md é um bom ponto de partida.   * Usar o eBPF para obter rastros de aplicações abre diversas possibilidades. O tutorial disponível em https://github.com/goldshtn/linux-tracing-workshop/blob/master/bpf-usdt.md é um bom ponto de partida.
-    * Infelizmente, nem tudo são flores e, para algumas linguagens, temos limitações. Por exemplo, descobri o motivo da lentidão ao utilizar o bpftrace em aplicações Java. Para linguagens dinâmicas, os probes precisam ser criados também dinamicamente. Para a JVM, isso atualmente envolve usar a opção '''-XX:+ExtendedDTraceProbes''' para permitir a criação de USDT. No entanto, isso tem um impacto significativo para aplicações Java (o que não se observa em outras linguagens). +    * Infelizmente, nem tudo são flores e, para algumas linguagens, temos limitações. Por exemplo, descobri o motivo da lentidão ao utilizar o bpftrace em aplicações Java. Para linguagens dinâmicas, os probes precisam ser criados também dinamicamente. Para a JVM, isso atualmente envolve usar a opção '''-XX:+ExtendedDTraceProbes''' para permitir a criação de USDT. No entanto, isso tem um impacto significativo para aplicações Java (o que não se observa em outras linguagens)
 +    * A lista de probes está disponível em https://docs.oracle.com/javase/6/docs/technotes/guides/vm/dtrace.html. O texto até menciona que as pontas de prova para entrada e saída de método serão mais rápidas no futuro, mas isso nunca aconteceu.
     * A melhor solução seria otimizar a criação desses probes, sem incorrer em custo tão elevado quanto visto na JVM atualmente com a opção '''-XX:+ExtendedDTraceProbes'''.     * A melhor solução seria otimizar a criação desses probes, sem incorrer em custo tão elevado quanto visto na JVM atualmente com a opção '''-XX:+ExtendedDTraceProbes'''.
       * Utilizando a biblioteca [[https://github.com/sthima/libstapsdt | libstapsdt]] ou [[https://github.com/chrisa/libusdt/ | libusdt]] isso seria possível. Até existe um projeto que buscou fazer isso para a JVM (https://github.com/goldshtn/libstapsdt-jni), mas ainda é uma prova de conceito. De toda forma, é interessante observar que o autor do libstapsdt é brasileiro e talvez seja mais simples conversar com ele a respeito disso.       * Utilizando a biblioteca [[https://github.com/sthima/libstapsdt | libstapsdt]] ou [[https://github.com/chrisa/libusdt/ | libusdt]] isso seria possível. Até existe um projeto que buscou fazer isso para a JVM (https://github.com/goldshtn/libstapsdt-jni), mas ainda é uma prova de conceito. De toda forma, é interessante observar que o autor do libstapsdt é brasileiro e talvez seja mais simples conversar com ele a respeito disso.
       * Quanto à biblioteca libusdt, o projeto https://github.com/dankimmel/dtrace-jvm-dynamic faz uso dela para inserir os pontos de prova. Também é uma prova de conceito.       * Quanto à biblioteca libusdt, o projeto https://github.com/dankimmel/dtrace-jvm-dynamic faz uso dela para inserir os pontos de prova. Também é uma prova de conceito.
   * Além do eBPF, também é possível obter rastros com o LTTng. Veja em https://lttng.org/docs/v2.13/#doc-java-application sobre como fazê-lo para aplicações Java.   * Além do eBPF, também é possível obter rastros com o LTTng. Veja em https://lttng.org/docs/v2.13/#doc-java-application sobre como fazê-lo para aplicações Java.
 +  * Considerando o nível de detalhe que precisamos, talvez algo na linha do [[https://www.brendangregg.com/flamegraphs.html | FlameGraphs]] seja suficiente (mas não sei se ele é mais rápido ou como ele contorno o problema dos pontos de prova dinamicamente definidos da JVM).