jemalloc использует jeprof для генерации GIF из файлов *.heap

Прежде всего, цель jemalloc (в моем сценарии использования) состоит в том, чтобы отслеживать внутреннее распределение памяти, вызванное такими вещами, как вызовы JNI, поэтому давайте начнем:

Привет, ребята, у меня есть серьезная проблема здесь. У нас случается утечка памяти в одном из наших приложений. Он находится в библиотеке JNI, особенно для тех из вас, кто знает это - cplex. Я уже знаю это, но так как наш менеджер попросил меня получить доказательство, я трачу ужасно много времени на его получение. Я сталкивался с инструментом-монстром (да, я знаю, что это не просто инструмент) под названием jemalloc, который должен создавать файлы " .heap", и это здорово, мне удалось, хотя я не вижу способа на самом деле прочитать что-нибудь разумное из этого файла Вот пример: изображение PNG сгенерированного файла ".heap" - только первые несколько строк, но все выглядит примерно так

Затем я обнаружил, что есть другой монстр по имени "jeprof", который, очевидно, может конвертировать этот файл " .heap" в красивый ".gif" - все, что вам нужно сделать, это запустить команду следующим образом: jeprof --show_bytes --gif /path/to/jvm/bin/java jeprof*.heap > /tmp/app-profiling.gif и это должно было привести к чему-то вроде примера (и описания) здесь: https://gdstechnology.blog.gov.uk/2015/12/11/using-jemalloc-to-get-to-the-bottom-of-a-memory-leak/ (вам нужно прокрутить страницу вниз до раздела "JEMALLOC to the rescue", чтобы увидеть пример gif, о котором я говорю).

К сожалению, есть ровно 0 информации о том, как на самом деле использовать его, кроме блогов, подобных тому, который я включил. Каждый раз, когда я пытаюсь сгенерировать этот GIF, используя точную команду как: jeprof --show_bytes --gif java jeprof.out.14441.5.i5.heap > ../../../sheetchallenger/temp/app-profiling_14_10.gif - я получаю следующий ответ и создаю пустой gif размером 0 байт:

Use of uninitialized value $line in substitution (s///) at /usr/local/bin/jeprof line 3256.
http://jeprof.out.14441.5.i5.heap/pprof/symbol doesn't exist

Вот файл "jeprof", о котором он говорит (я имею в виду раздел вокруг строки 3256):

sub CheckSymbolPage {
  my $url = SymbolPageURL();
  my $command = ShellEscape(@URL_FETCHER, $url);
  open(SYMBOL, "$command |") or error($command);
  my $line = <SYMBOL>;
  $line =~ s/\r//g;         # Line:3256: turn windows-looking lines into unix-looking lines
  close(SYMBOL);
  unless (defined($line)) {
    error("$url doesn't exist\n");
  }

  if ($line =~ /^num_symbols:\s+(\d+)$/) {
    if ($1 == 0) {
      error("Stripped binary. No symbols available.\n");
    }
  } else {
    error("Failed to get the number of symbols from $url\n");
  }
}

Буквально не знаю, что это пытается сказать мне, почему он использует http? Зачем? Я понял, что нет какого-то профиля, созданного каким-то образом, или, кажется, он говорит, но какой профиль, где, как?

Возможно, будет полезно упомянуть, что в первый раз, когда я запустил эту "команду heprof heap file to gif преобразование", я получил следующий ответ:

[root@mnd-dev-kfk01 sheetchallenger]# jeprof --show_bytes --gif java jeprof.out.12077.129.i129.heap > temp/app-profiling_11_24.gif
Using local file jeprof.out.12077.129.i129.heap.
The first profile should be a remote form to use /pprof/symbol

Что, черт возьми, это значит и почему меня должно волновать - важна ли эта, какая отдаленная форма, форма чего, для чего?

Так что в основном вопрос заключается в следующем: поскольку я уже могу генерировать эти неудачные файлы "*.heap" (пожалуйста, кто-нибудь исправит меня, если эти файлы не кажутся правильными), как же я могу преобразовать их во что-то полезное, предпочтительно с помощью jeprof или чего-нибудь еще? еще?

Могу ли я преобразовать их в этот gif, как показано на этом сайте, который я указал выше ( https://gdstechnology.blog.gov.uk/2015/12/11/using-jemalloc-to-get-to-the-bottom-of-a-memory-leak/) или я могу сделать что-нибудь еще с ними?

С наилучшими пожеланиями всем вам, и, надеюсь, кто-то может помочь мне разобраться в этом.

2 ответа

jeprof --show_bytes --gif <java bin path>/java jeprof.out.12077.129.i129.heap > temp/app-profiling_11_24.gif

Попробуйте с полным путем Java, это помогло мне

Я на собственном опыте выяснил, что сообщение об ошибке
The first profile should be a remote form to use /pprof/symbol
могут быть не связаны с реальной проблемой и появиться, если ваш путь java неверен !!! 🤬

попробуйте использовать $JAVA_HOME/bin/java как ваш путь java так:

      jeprof --show_bytes --gif $JAVA_HOME/bin/java jeprof.*.heap > temp/app-profiling.gif

хотя это может измениться в зависимости от вашей среды

Другие вопросы по тегам