Использование 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%.
|
|
|
|
Раздел: Корень / Программисту и web-разработчику / C/C++, сборка, отладка |