41.5. Анализ данных

Демон OProfile oprofiled периодически собирает выборки и сохраняет их в каталоге /var/lib/oprofile/samples/. Прежде чем анализировать эти данные, убедитесь в том, что в этом каталоге все необходимые данные сохранены, выполнив от имени root следующую команду:

opcontrol --dump

В имени каждого файла с данными отражено имя исполняемого модуля. Например, выборки события по умолчанию на процессоре Pentium III для /bin/bash будут называться:

\{root\}/bin/bash/\{dep\}/\{root\}/bin/bash/CPU_CLK_UNHALTED.100000

Для обработки уже собранных данных мониторинга предназначены следующие инструменты:

Используйте эти инструменты и отслеживаемый двоичный код для построения отчётов, которые затем можно будет анализировать.

ПредупреждениеПредупреждение
 

Чтобы проанализировать данные, помимо этих инструментов необходимо иметь отслеживаемый исполняемый код. Если этот код необходимо изменять после сбора данных, сделайте резервную копию не только файлов с показателями мониторинга, но и исполняемого модуля, мониторинг которого выполнялся.

Выборки, связанные с каждым исполняемым файлом, сохраняются в отдельном файле. Выборки, связанные с динамически загружаемыми библиотеками, также сохраняются в отдельном файле. Если в процессе работы OProfile отслеживаемый исполняемый модуль изменяется, и существует файл с данными его мониторинга, этот файл автоматически удаляется. Таким образом, если существующий файл с данными необходим, его необходимо скопировать вместе с исполняемым модулем, прежде чем исполняемый модуль будет заменён новой версией. За подробными инструкциями по копированию файла данных обратитесь к разделу 41.4 Сохранение данных.

41.5.1. Использование opreport

Программа opreport предоставляет сводку по всем отслеживаемым исполняемым модулям.

Ниже приведён фрагмент вывода этой команды:

Profiling through timer interrupt
          TIMER:0|
  samples|      %|
------------------
    25926 97.5212 no-vmlinux
      359  1.3504 pi
       65  0.2445 Xorg
       62  0.2332 libvte.so.4.4.0
       56  0.2106 libc-2.3.4.so
       34  0.1279 libglib-2.0.so.0.400.7
       19  0.0715 libXft.so.2.1.2
       17  0.0639 bash
        8  0.0301 ld-2.3.4.so
        8  0.0301 libgdk-x11-2.0.so.0.400.13
        6  0.0226 libgobject-2.0.so.0.400.7
        5  0.0188 oprofiled
        4  0.0150 libpthread-2.3.4.so
        4  0.0150 libgtk-x11-2.0.so.0.400.13
        3  0.0113 libXrender.so.1.2.2
        3  0.0113 du
        1  0.0038 libcrypto.so.0.9.7a
        1  0.0038 libpam.so.0.77
        1  0.0038 libtermcap.so.2.0.8
        1  0.0038 libX11.so.6.2
        1  0.0038 libgthread-2.0.so.0.400.7
        1  0.0038 libwnck-1.so.4.9.0

Для каждого исполняемого модуля отводится отдельная строка. В первом столбце указывается число выборок, сделанных для этого исполняемого модуля. Во втором столбце указывается процентное отношение этого числа к общему числу выборок. В третьем столбе указывается имя исполняемого модуля.

Обратитесь к странице man opreport за списком доступных параметров командной строки, в число которых входит, например, параметр -r, сортирующий выводимые строки в порядке возрастания числа выборок для исполняемого модуля.

41.5.2. Использование opreport для одного исполняемого модуля

Чтобы получить более подробную информацию о конкретном исполняемом модуле, используйте opreport:

opreport <mode> <executable>

Здесь вместо <executable> необходимо указть полный путь к анализируемому исполняемому модулю. Параметр <mode> может принимать следующее значения:

-l

Выводит список выбранных данных по символам. Например, ниже показан фрагмент результата выполнения команды opreport -l /lib/tls/libc-<version>.so:

samples  %        symbol name
12       21.4286  __gconv_transform_utf8_internal
5         8.9286  _int_malloc
4         7.1429  malloc
3         5.3571  __i686.get_pc_thunk.bx
3         5.3571  _dl_mcount_wrapper_check
3         5.3571  mbrtowc
3         5.3571  memcpy
2         3.5714  _int_realloc
2         3.5714  _nl_intern_locale_data
2         3.5714  free
2         3.5714  strcmp
1         1.7857  __ctype_get_mb_cur_max
1         1.7857  __unregister_atfork
1         1.7857  __write_nocancel
1         1.7857  _dl_addr
1         1.7857  _int_free
1         1.7857  _itoa_word
1         1.7857  calc_eclosure_iter
1         1.7857  fopen@@GLIBC_2.1
1         1.7857  getpid
1         1.7857  memmove
1         1.7857  msort_with_tmp
1         1.7857  strcpy
1         1.7857  strlen
1         1.7857  vfprintf
1         1.7857  write

В первом столбце указывается начальный адрес в виртуальной памяти (virtual memory address, vma). Во втором столбце указывается число выборок, сделанных для этого символа. Третий столбец показывает процентное отношение этого числа к общему числу выборок для исполняемого модуля, а четвёртый — имя символа.

Чтобы отсортировать результаты в обратном порядке, передайте в командной строке -r вместе с параметром -l.

-i <symbol-name>

Выводит данные выборок, связанных с заданным символом. Например, ниже показан фрагмент результата выполнения команды opreport -l -i __gconv_transform_utf8_internal /lib/tls/libc-<version>.so:

samples  %        symbol name
12       100.000  __gconv_transform_utf8_internal

В первой строке приводится сводка по указанному символу/исполняемому модулю.

В первом столбце указывается число выборок, сделанных для этого символа в памяти. Во втором столбце указывается процентное отношение числа выборок по этому адресу в памяти к общему числу выборок, сделанных для этого символа. Название символа указывается в третьем столбце.

-d

Выводит данные выборки по символам в более подробном виде, чем -l. Например, ниже показан фрагмент результата выполнения команды opreport -l -d __gconv_transform_utf8_internal /lib/tls/libc-<version>.so:

vma      samples  %        symbol name
00a98640 12       100.000  __gconv_transform_utf8_internal
00a98640 1         8.3333
00a9868c 2        16.6667
00a9869a 1         8.3333
00a986c1 1         8.3333
00a98720 1         8.3333
00a98749 1         8.3333
00a98753 1         8.3333
00a98789 1         8.3333
00a98864 1         8.3333
00a98869 1         8.3333
00a98b08 1         8.3333

В результате выводятся те же данные, что и с параметром -l, только в данном случае для каждого символа показыватся используемый адрес виртуальной памяти. По каждому адресу показывается число выборок и процентное отношение этого числа к общему числу выборок для данного символа.

-x <symbol-name>

Исключает из результатов указанные через запятую символы.

session:<name>

Определяет полный путь к сеансу или каталогу относительно каталога /var/lib/oprofile/samples/.

41.5.3. Использование opannotate

Утилита opannotate пытается сопоставить выборки, полученные при выполнении конкретных инструкций, с соответствующими строками в исходном коде. В формируемых ей файлах слева от этих строк будут представлены полученные выборки. Она также помещает комментарий в начало листинга каждой функции, и помещает в него сводку по выборкам, полученным в этой функции.

Чтобы эта утилита работала, исполняемый модуль должен быть скомпилирован компилятором GCC с ключом -g. По умолчанию пакеты Red Hat Enterprise Linux компилируются без этого ключа.

Общий синтаксис opannotate выглядит так:

opannotate --search-dirs <src-dir> --source <executable>

В параметрах необходимо указать каталоги анализируемого исходного кода и исполняемой программы. За списком дополнительных параметров командной строки обратитесь к странице man opannotate.