Dtrace: некоторые примеры применения

Данные примеры работают не только на Solaris, но и на FreeBSD

Загрузка ЦПУ приложениями (можно использовать оба варианта)

dtrace -n 'syscall:::entry { @num[execname] = count(); }'
dtrace -n 'syscall:::entry { @num[pid,execname] = count(); }'

Статистика системных вызовов (syscalls)

dtrace -n 'syscall:::entry { @num[probefunc] = count(); }'

Статистика системных вызовов (syscalls) приложения MyApp (вывод в файл dtracefile)

dtrace -n 'syscall::MyApp:entry {@[ustack()] = count()}' > dtracefile

Статистика вызова самых частых потоков для MyApp

dtrace -n 'syscall::MyApp:entry {@[pid, tid] = count()}'

Файлы, открытые процессами (нужно делать перенаправление в файл)

dtrace -n 'syscall::open*:entry { printf("%s %s",execname,copyinstr(arg0)); }'

Новые процессы вместе с аргументами

dtrace -n 'proc:::exec-success { trace(curpsinfo->pr_psargs); }'

Стек для определённого pid’a при использовании функции close:

dtrace -n syscall::close:return'/pid == 26651/ {  ustack(); }'

Подчёт количества потребляемой памяти запускаемым приложением:

dtrace -n 'syscall::mmap:entry { @ = sum(arg1); }' -c "bash test.sh"

Сетевые соединения

#!/usr/sbin/dtrace -qs
syscall::connect:entry
{
socks = (struct sockaddr*) copyin(arg1, arg2);
hport = (uint_t) socks->sa_data[0];
lport = (uint_t) socks->sa_data[1];
hport <<= 8;
port = hport + lport;
printf("%s: %d.%d.%d.%d:%d\n", execname, socks->sa_data[2], socks->sa_data[3], socks->sa_data[4], socks->sa_data[5], port);
}

Дополнение.

Достаточно примеров можно найти по следующим ссылками

http://www.solarisinternals.com/wiki/index.php/DTrace_Topics_One_Liners
http://www.brendangregg.com/DTrace/dtrace_oneliners.txt
http://www.brendangregg.com/dtrace.html#Scripts

А здесь видео с dtrace.conf 2016

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *