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

Если описание необходимой вам программы не содержится в репозитории, можно заглянуть на страничку Chime Displays либо создать его при помощи встроенного мастера. Третьим вариантом может быть генерация отображения на лету: например с помощью такой D-программы, подсчитывающей суммарное количество байт, прочитанных каждым процессом в системе:
# chime -kTn -t "Bytes Read" \
'sysinfo:::readch { @bytes[execname] = sum(arg0); }'
можно получить динамическую картину активности операций ввода-вывода:

Таким образом 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
Результат:

Другим интересным способом отображения данных может быть использование 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

Стоит отметить что этот пример будет работать только для исполняемых файлов не обработанных программой strip.
Tags: DTrace, visualization
December 18th, 2007 at 8:22 pm
А как же Project D-Light?
http://blogs.sun.com/solarisdev/entry/project_d_light_tutorial
December 20th, 2007 at 12:44 am
Спасибо за наводку - D-Light попал во вторую часть обзора.