Thursday, 31 August. 2006
Изучение Dtrace лучше начать c простых вызовов, использующих пробу BEGIN, которая включается каждый раз, когда мы запускаем какую-либо трассировку.
Для включения пробы запустите dtrace с опцией -n, например:
Продолжить чтение "DTrace - первые шаги"
Вы когда-либо задавались вопросом, кого из клиентов стоит грохнуть если ваш сервер NFS стал тормозить? С помощью D найти их довольно просто. Вот d-скрипт как раз для этого:
#!/usr/sbin/dtrace -FCs
#define AF_INET 2
#define AF_INET6 26
fbt::common_dispatch:entry
{
self->ca = (struct sockaddr )(args[0]->rq_xprt->xp_xpc.xpc_rtaddr.buf);
self->sin_addr = (uchar_t )&((struct sockaddr_in )self->ca)->sin_addr;
self->in = 1;
}
fbt::common_dispatch:return
/self->in && self->ca->sa_family == AF_INET/
{
self->sin_addr = (uchar_t )&((struct sockaddr_in )self->ca)->sin_addr;
@hosts[self->sin_addr[0], self->sin_addr[1], self->sin_addr[2],
self->sin_addr[3]] = count();
self->in = 0;
self->ca = 0;
self->sin_addr = 0;
}
fbt::common_dispatch:return
/self->in && self->ca->sa_family == AF_INET6/
{
self->sin6 = (uchar_t )&((struct sockaddr_in6 *)self->ca)->sin6_addr;
@hosts6[self->sin6[0], self->sin6[1], self->sin6[2], self->sin6[3],
self->sin6[4], self->sin6[5], self->sin6[6], self->sin6[7],
self->sin6[8], self->sin6[9], self->sin6[10], self->sin6[11],
self->sin6[12], self->sin6[13], self->sin6[14], self->sin6[15]]
= count();
self->in = 0;
self->ca = 0;
self->sin6 = 0;
}
END
{
printa("\nhost: %d.%d.%d.%d num nfs calls: %@d", @hosts);
printa("\nhost: %x%x:%x%x:%x%x:%x%x:%x%x:%x%x:%x%x:%x%x num nfs calls: %@d", @hosts6);
}
А вот пример вывода:
# ./get_nfs_clients.d
dtrace: script './get_nfs_clients.d' matched 4 probes
^C
CPU FUNCTION 7 | :END
host: 1.1.1.1 num nfs calls: 2
host: 3.2.2.2 num nfs calls: 2
host: 3.2.2.3 num nfs calls: 2
host: 3.2.2.4 num nfs calls: 5
host: 1.3.3.5 num nfs calls: 6
host: 2.4.4.6 num nfs calls: 10
host: 1.3.3.7 num nfs calls: 10
host: 1.5.3.8 num nfs calls: 25
host: fe80:00:00:00:00:00:00:xx num nfs calls: 2
#
Вывод сортируется по активности, а еще и по ipv4 и ipv6 клиентам.
Круто! Можно еще заменить блок 'END' в конце на следующий, чтобы получился 'nfstop':
tick-3s
{
trunc (@hosts, 20);
trunc (@hosts6, 20);
printf("\033[H\033[2J");
printa("\nhost: %d.%d.%d.%d num nfs calls: %@d", @hosts);
printa("\nhost: %x%x:%x%x:%x%x:%x%x:%x%x:%x%x:%x%x:%x%x num nfs calls: %@d", @hosts6);
trunc (@hosts);
trunc (@hosts6);
}
(Из блога Eric Kustarz)
Wednesday, 30 August. 2006
Проблема возникла когда я попытался загрузить модуль mod_owa.so для apache (он используется для соедининения с Oracle и восстановления информации). Всякий раз система показывала высокую активность (как только запускался apache) и появлялись defunct-процессы (defunct процесс (зомби) - процесс-потомок (дочерний процесс), котрый завершился раньше, чем этого ожидал процесс-родитель):
{callacct:/u01/app/oracle} /usr/apache/bin/apachectl start
/usr/apache/bin/apachectl start: httpd started
{callacct:/u01/app/oracle} vmstat 1
kthr memory page disk faults cpu
r b w swap free re mf pi po fr de sr m1 m1 m1 m2 in sy cs us sy id
0 0 0 17075280 447352 89 105 14 6 6 0 2 1 1 1 0 432 2566 671 1 1 98
0 0 0 16958384 157736 326 1242 23 31 31 0 0 40 43 43 0 2319 670 409 1 7 92
0 0 0 16945808 154256 93 1962 24 0 0 0 0 110 113 111 0 4168 1224 736 2 14 83
0 0 0 16945720 149888 1 139 8 0 0 0 0 247 256 261 0 5067 64 716 0 10 90
0 0 0 16948864 151448 3 601 55 879 879 0 0 186 186 174 0 4885 77 637 0 9 91
^C
Продолжить чтение "Пример использования DTrace для решения возникшей проблемы"
Tuesday, 29 August. 2006
(DTrace расшифровывается как Dynamic Tracing Framework и является отличным инструментом для администраторов Solaris, позволяя получать полную диагностику системы или пользовательских приложений в режиме реального времени. В ядро Solaris 10 встрено множество счетчиков, управляют которыми динамически загружаемые модули - провайдеры. Каждый из провайдеров отвечает за определенную область системы. Получить информацию от счетчиков можно при помощи языка, получившего название D. Язык D знаком очень многим, поскольку он базируется на языке Cи и широко использует его синтаксис. После запуска D-скрипта DTrace активирует провайдеры, которые в свою очередь включают счетчики, в зависимости от их показателей можно выбирать различные действия, чаще всего это просто вывод нужной информации о работе какой-либо части системы или приложения.)
Продолжить чтение "Введение в DTrace на примере"
|