Система трассировки LTTng (http://lttng.org/) работает на уровне Linux-ядра и отличается минимальным влиянием на работу профилируемого приложения, что позволяет приблизить условия работы данного приложения к его выполнению без использования трассировки (например, позволяет выявлять проблемы с производительностью в программах, работающих в реальном режиме времени). Поддержка LTTng пока не включена в состав Linux-ядра, но недавно для Ubuntu Linux был подготовлен специальный [[https://launchpad.net/~lttng/+archive/ppa/+index 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%.
URL: http://multivax.blogspot.com/2010/11/introduction-to-linux-t...
Обсуждается: http://www.opennet.dev/tips/info/2475.shtml