The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

Использование LTTng для прозрачной трассировки приложений в Ubuntu Linux
Система трассировки LTTng (http://lttng.org/) работает на уровне Linux-ядра и
отличается минимальным влиянием на работу профилируемого приложения, что
позволяет приблизить условия работы данного приложения к его выполнению без
использования трассировки (например, позволяет выявлять проблемы с
производительностью в программах, работающих в реальном режиме времени).

Поддержка LTTng пока не включена в состав Linux-ядра, но недавно для Ubuntu
Linux  был подготовлен специальный PPA-репозиторий, позволяющий значительно
упростить установку LTTng.

Приведем пример использования LTTng для отладки системы и тюнинга производительности.

Подключаем репозиторий:

   sudo add-apt-repository ppa:lttng/ppa
   sudo aptitude update

Устанавливаем компоненты для трассировки ядра (LTTng работает только с ядром
2.6.35, поэтому в Ubuntu 10.04 может потребоваться установка экспериментального
пакета с более новым ядром):

   sudo apt-get install lttng

Установка утилит для трассировки пользовательских приложений:

   sudo apt-get install ust-bin libust-dev liburcu-dev

Пример поддержи трассировки на уровне ядра

Загружаем ядро lttng:

   sudo ltt-armall

Начинаем трассировку:

   sudo lttctl -C -w /tmp/trace1 программа

Прекращаем трассировку:

   sudo lttctl -D программа

Результаты трассировки /tmp/trace1 теперь можно открыть в утилите lttv или
использовать режим текстового дампа:

   lttv -m textDump -t /tmp/trace1 | grep ...


Трассировка пользовательских приложений со связыванием специальной библиотеки

Собираем приложения добавив в опции сборки флаг '-lust'.

Запускаем приложение с трассировкой:

   usttrace исследуемая_программа

Контроль трассировки с удаленной машины

На локальной машине устанавливаем и запускаем программу-агент:

   sudo apt-get install tcf-lttng-agent
   sudo tcf-agent

На удаленной машине устанавливаем и запускаем клиента:

   sudo apt-get install tcf-lttng-client
   tcf-client

далее, в появившейся консоли вводим:
   connect ip_локальной_машины

и после соединения передаем управляющие команды:
   tcf ltt_control getProviders
   tcf ltt_control setupTrace "kernel" "0" "traceTest"


Пример трассировки

Рассмотрим для примера простую программу, открывающую файл и записывающую в него циклично числа.

    #include <stdio.h>
    #define INT_MAX 2147483647
    int main(volatile int argc, char **argv) {
      int i = 3;
      FILE *fd = fopen("test.out", "w");
      fwrite(&i, sizeof(int), 1, fd);
      fclose(fd);
      volatile long a;
      int x;
      for (x = 0; x<INT_MAX; x++) {
        a++;
      }
      return 0;
   }

Собираем данную программу:

   gcc -o usecase usecase.c
 
  
Теперь попробуем выполнить трассировку при помощи LTTng.

Активируем точки трассировки в ядре:

   sudo ltt-armall

Для автоматизации выполнения активации трассировки, запуска программы и
остановки трассировки напишем небольшой скрипт trace-cmd.sh:

   #!/bin/sh
   if [ -z "$@" ]; then
     echo "missing command argument"
     exit 1
   fi
   cmd="$@"

   name="cmd"
   dir="$(pwd)/trace-$name"
   sudo rm -rf $dir
   sudo lttctl -o channel.all.bufnum=8 -C -w $dir $name
   echo "executing $cmd..."
   $cmd
   echo "return code: $?" 
   sudo lttctl -D $name

Запускаем:

   ./trace-cmd.sh ./usecase

После выполнения трассировки для наглядного анализа результатов запускаем
GUI-утилиту lttv-gui, заходим в меню File->Add и выбираем  директорию
трассировки  "trace-имя", сохраненную в каталоге, в котором был запущен скрипт
trace-cmd.sh. Каждое из событий трассировки представлено в виде графика. Для
нашего тестового приложения будет присутствовать три фазы: создание/доступ к
файлу, вычислительная фаза и завершение процесса.

Оценка различий от strace

Если сравнить результаты работы стандартной утилиты strace:

   strace -o usecase.strace ./usecase

В дополнение к системным вызовам, LTTng учитывает задействование подсистем
ядра, события планировщика задач, обработку прерываний и прочие детали,
недоступные в выводе strace. Но самым интересным отличием от strace является
то, что программа никаким образом не может определить, что подвергается
трассировке. Время наступления событий отображается в наносекундах. Влияние на
производительность трассировки минимально, тестирование показало, что работа
замедляется не более чем на 3%.
 
13.11.2010 , Источник: http://multivax.blogspot.com/2010/1...
Ключи: treace, systrace, debug, kernel, LTTng / Лицензия: CC-BY
Раздел:    Корень / Программисту и web-разработчику / C/C++, сборка, отладка

Обсуждение [ RSS ]
  • 1, ананим (?), 21:06, 13/11/2010 [ответить]  
  • +/
    спасибо, познавательно.
    картинка в оригинале тоже ничего так.
     
  • 2, Zenitur (?), 15:30, 17/11/2010 [ответить]  
  • +/
    Извращение для тех, кто не умеет сам пересобрать себе ядро.
     
     
  • 3, ksS (?), 00:10, 18/11/2010 [^] [^^] [^^^] [ответить]  
  • +/
    может сначала man strace?
     
  • 4, 0xCC (?), 22:23, 10/01/2011 [^] [^^] [^^^] [ответить]  
  • +/
    ох.. зенитур умер для меня......
     

  • 5, fp (?), 00:29, 29/03/2011 [ответить]  
  • +/
    usttrace -l - подгрузит библиотеку ust без перекомпиляции.

    P.S. надо поправить trace-cmd.sh:
    ...
    name="$cmd"
    ...

     

     Добавить комментарий
    Имя:
    E-Mail:
    Заголовок:
    Текст:




    Партнёры:
    PostgresPro
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2024 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру