Использование Jprofiler Controller с процессом weblogic в автономном режиме - PullRequest
0 голосов
/ 11 декабря 2018

Я пытаюсь профилировать приложение, работающее на Weblogic в автономном режиме, с использованием API-интерфейса контроллера на основе примера demos\api\samples\offline\.

Моя проблема заключается в том, что файл .jps не создается,хотя Controller.saveSnapshot() завершается без ошибок.

  1. Я создал конфигурацию сеанса, которая работает хорошо, когда я присоединяюсь к процессу в графическом интерфейсе.

  2. Я скопировал файл config.xml из home в рабочий каталог.

  3. Я обновил параметры JVM в server start для своей службы следующей строкой:

    -agentpath: /home/alex/jprofiler10/bin/linux-x64/libjprofilerti.so=offline,id=116,config=/workdir/config_bak.xml

  4. Iсоздал программу на Java, которая запускает профилирование процессора, а затем завершает профилирование процессора и пытается сохранить результат профилирования.

    Controller.startCPURecording (true);
    executeProfiledTask ();
    Controller.stopCPURecording ();

    String fName = "test.jps";System.out.println ("сохранение снимка:" + fName);Controller.saveSnapshot (новый файл (fName));
    System.out.println ("сохраненный снимок:" + fName);

Программа выполняется без ошибок, но файл снимкане создан.

Я пытался запустить его с привилегиями sudo с тем же результатом.


РЕДАКТИРОВАТЬ:

Может быть, я неЧто-то не понимаю, но мне кажется, что JProfiler работает автономно, если контроллер запускается только в том же процессе, что и профилированный код.

Когда он запускается в другом \ дочернем процессе, файл несоздается.

Например, следующий код, который я ожидаю создать файл, не делает этого.

Процесс профилирования:

import java.io.File;
import java.io.IOException;

import com.jprofiler.api.controller.Controller;

//turn on profiling and run a child process with offline profiling enabled in agentpath
public class PerfDemo {

    public static void main(String[] args) throws IOException {

        System.out.println("Started profiling");

        // On startup, JProfiler does not record any data. The various recording subsystems have to be
        // switched on programatically.
        Controller.startCPURecording(true);

        try {
            exec(CpuIntensiveProcess.class);

        } catch (Exception ex) {
            ex.printStackTrace();
            System.out.println("Exception: "+ex.getStackTrace());
        }

        // You can switch off recording at any point. Recording can be switched on again.
        Controller.stopCPURecording();
        saveSnapshot("snapshot.jps");              
    }

    private static void saveSnapshot(String fileName){
        System.out.println("saving snapshot: "+fileName);
        Controller.saveSnapshot(new File(fileName));        
    }

    //execute a new process with offline profiling enabled in agentpath
    public static int exec(Class klass) throws IOException, InterruptedException{

            String javaHome = System.getProperty("java.home");
            String javaBin = javaHome +
            File.separator + "bin" +
            File.separator + "java";
            String classpath = System.getProperty("java.class.path");
            String className = klass.getName();

            ProcessBuilder builder = new ProcessBuilder(
            javaBin, "-cp", classpath, "-agentpath:\"c:\\\\Progra~1\\\\jprofiler10\\\\bin\\\\windows-x64\\\\jprofilerti.dll\"=offline,id=110,config=config.xml", className );

            System.out.println("starting process");
            Process process = builder.inheritIO().start();
            process.waitFor();

            System.out.println("process finished");
            return process.exitValue(); 
    }
}

Профилированный процесс:

import static java.lang.Math.*;

import java.io.IOException;

public class CpuIntensiveProcess {

    public static void main(String[] args) throws IOException {
        for (int i=0;i<50000000;i++) {
            double d = tan(atan(tan(atan(tan(atan(tan(atan(tan(atan(123456789.123456789))))))))));
            double h =d+1;
        }        
    }   
}

Пакет времени выполнения:

@echo off

SET CLASSPATH=.;jprofiler-controller-10.1.4.jar;agent.jar;
"c:\Program Files\Java\jdk-10.0.1\bin\javac.exe" -cp %CLASSPATH% *.java
java -cp %CLASSPATH% PerfDemo

REM If I run in this configuration, the profiling is of the PerfDemo process and not of the CpuIntensiveProcess process
REM SET AGENTPATH=-agentpath:"c:\\Progra~1\\jprofiler10\\bin\\windows-x64\\jprofilerti.dll"=offline,id=110,config=config.xml
REM java -cp %CLASSPATH%  %AGENTPATH% PerfDemo

set "CURR_DIR=%cd%"
pushd "c:\Program Files\jprofiler10\bin"
jpexport %CURR_DIR%/snapshot.jps -outputdir=%CURR_DIR% HotSpots out.csv
popd

type out.csv

Когда я запускаю пакет, файл .jps отсутствуетсоздал.

Когда я запускаю процесс PerfDemo с помощью agentpath, файл jps создается, но профилирование происходит из того же процесса, а не издругой процесс.

Вывод:

C:\dev\docs\bak\sample_other_process_profiling>profile.bat
Started profiling
Starting child process...
JProfiler> Protocol version 59
JProfiler> Java 9+ detected.
JProfiler> JVMTI version 1.1 detected.
JProfiler> Offline profiling mode.
JProfiler> 64-bit library
JProfiler> Using config file config.xml (id: 110)
JProfiler> Listening on port: 8849.
JProfiler> Enabling native methods instrumentation.
JProfiler> Can retransform classes.
JProfiler> Can retransform any class.
JProfiler> Native library initialized
JProfiler> VM initialized
JProfiler> Retransforming 7 base class files.
JProfiler> Base classes instrumented.
JProfiler> Using instrumentation
JProfiler> Time measurement: elapsed time
JProfiler> CPU profiling enabled
Child process finished
Saving snapshot: snapshot.jps
Controller.saveSnapshot finished, snapshot should exist on the disk: snapshot.jps
The snapshot file C:\dev\docs\bak\sample_other_process_profiling\snapshot.jps does not exist.
The system cannot find the file specified.

1 Ответ

0 голосов
/ 13 декабря 2018

Класс контроллера функционирует только в JVM, где загружается агент профилирования, обычно путем запуска JVM с параметром -agentpath: VM.

В вашем случае вы вызываете класс контроллера в процессегде агент профилирования не загружен, поэтому вызовы не имеют никакого эффекта.Кроме того, эти вызовы никак не влияют на дочерние процессы.

Вы должны были бы переместить вызовы в класс контроллера в дочерний процесс, чтобы он заработал.

...