Визуализация вывода DTrace

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

Первый полноценный инструмент для визуализации данных (а именно агрегаций) - Chime был разработан в рамках проекта OpenSolaris и представляет из себя Java приложение и репозиторий инструкций (в формате XML) по отображению данных различных D-программ. Например в таком виде:

Dtrace Visualization - Chime (Interrupt Statictics)

Если описание необходимой вам программы не содержится в репозитории, можно заглянуть на страничку Chime Displays либо создать его при помощи встроенного мастера. Третьим вариантом может быть генерация отображения на лету: например с помощью такой D-программы, подсчитывающей суммарное количество байт, прочитанных каждым процессом в системе:

# chime -kTn -t "Bytes Read" \
'sysinfo:::readch { @bytes[execname] = sum(arg0); }'

можно получить динамическую картину активности операций ввода-вывода:

Dtrace Visualization - Chime (Bytes read by process)

Таким образом Chime предоставляет возможность удобно наблюдать за изменением параметров системы с течением времени, чем сильно облегчает анализ сложных проблем. Однако, поскольку Chime основан на DTrace Java API, он работает только начиная с Solaris Nevada build 35 (т.е. не работает в стабильных релизах Solaris 10).

В связи с этим ограничением стоит рассмотреть альтернативные способы графического отображения данных, основанные на передаче сформатированного специальным образом вывода DTrace на вход к программам визуализации - gnuplot и graphviz. К сожалению с их помощью не получится достичь гибкости Chime и получить обновления отображаемых данных в реальном времени, однако и они могут оказать существенную помощь.

Для того чтобы построить график изменения некоторых параметров с течением времени с помощью gnuplot, понадобится текстовый файл вида:

<time> <value1> [<value2> ...]

Одним из способов генерации такого файла может быть распечатка текущего значения какой-либо переменной в обработчике пробы провайдера tick:

# dtrace -n -q -n \
'tick-1s
{printf("%d %d\n",walltimestamp/1000000000,`freemem)}'
1197973038 858446
1197973039 858445
1197973040 858445
^C

Вторым - накопление данных в агрегации и распечатка в обработчике пробы END по завершению D-программы:

# dtrace -o scalls.dat -q -n \
'syscall:::entry
{ @[walltimestamp/1000000000] = count() }
END
{ setopt("aggsortkey"); printa("%d %@d\n", @); }'

После чего полученный файл может быть обработан с помощью gnuplot:

# gnuplot
gnuplot> set term png size 400,300 truecolor font '/Library/Fonts/Verdana.ttf' 8 notransparent
gnuplot> set title "scall/s"
gnuplot> set xdata time
gnuplot> set timefmt "%s"
gnuplot> set format x "%H:%M:%S"
gnuplot> set grid
gnuplot> set out "scalls.png"
gnuplot> plot 'scalls.dat' using 1:2 title 'syscalls' with linespoints

Результат:
Dtrace Visualization - gnuplot (Syscalls per second)

Другим интересным способом отображения данных может быть использование graphviz (материал взят из блога Thermal Noise). Небольшой D-программой можно генерировать инструкции по построению графа вызовов функций для graphviz:

pid$target:a.out::entry
{
@[ufunc(ucaller), strjoin(strjoin(probemod,"`"), probefunc)] = count();
}
END
{
printf("digraph foo {\n");
printa(" \"%A\" -> \"%s\" [weight=%@d];\n", @);
printf("}\n");
}


# dtrace -q -s callgraph.d -c ls

Вызов graphviz для полученного файла:

# dot -T jpg -o callgraph.jpg graph.in

Dtrace Visualization - graphviz (Call graph)

Стоит отметить что этот пример будет работать только для исполняемых файлов не обработанных программой strip.

Продолжение…

Tags: ,

2 Responses to “Визуализация вывода DTrace”

  1. horsh Says:

    А как же Project D-Light?
    http://blogs.sun.com/solarisdev/entry/project_d_light_tutorial

  2. Ilya Voronin Says:

    Спасибо за наводку - D-Light попал во вторую часть обзора.

Leave a Reply