В Solaris наблюдение за CPU и расходованием виртуальной памяти обеспечивается с помощью утилит mpstat и vmstat. Эти утилиты предоставляют полезную статистику но не могут полностью гарантировать достоверность выводимых значений. Эта статья показывает как с помощью DTrace можно узнать какой программе или области ядра соответствуют значения, которые периодически появляются на консоли. Вывод DTrace является ценной отправной точкой для проведения дополнительных тестов, и в некоторых случаях помогает выявить ошибки в программах и областях ядра.
MPSTAT
Утилита mpstat может использоваться для наблюдения за использованием системой центрального процессора. mpstat обычно запускают с аргументом в виде числа. Этот аргумент контролирует частоту вывода данных, и каждая линия вывода mpstat содержит число событий, котрые произошли за этот период:
$ mpstat 5
CPU minf mjf xcal intr ithr csw icsw migr smtx srw syscl usr sys wt idl
0 11 13 558 760 212 265 1 3 1 0 525 9 1 0 90
1 9 11 479 467 0 251 1 3 1 0 474 9 1 0 89
2 7 4 226 884 383 147 0 4 2 0 192 4 1 0 96
3 7 4 234 495 0 146 0 3 0 0 215 5 1 0 95
Далее объясняется за что отвечают значения того или иного столбца в выводе mpstat, вместе с тем, как с помощью DTrace или системной утилиты идентифицировать процесс или область ядра, отвечающие за эти значения.
Minor faults (minf)
minf показывает число несерьезных ошибок. Чтобы увидеть какие исполняемые файлы ответственны за minor faults, можно использовать пробу as_fault провайдера vminfo:
$ dtrace -n 'vminfo:::as_fault
{
@execs[execname] = count()
}'
dtrace: description 'vminfo:::as_fault ' matched 1 probe
sac 1
mpstat 10
uname 36
dtrace 47
ostname 72
sh 142
procmail 165
fetchmail 224
cron 278
spamassassin 2964
Major faults (majf)
majf показывает число серьезных ошибок. Для major faults можно использовать пробу maj_fault провайдера vminfo:
$ dtrace -n 'vminfo:::maj_fault
{
@execs[execname] = count()
}'
dtrace: description 'vminfo:::maj_fault ' matched 1 probe
awk 1
sshd 1
bash 11
Cross calls (xcal)
xcal показывает число межпроцессорных вызовов. Чтобы увидеть какие исполняемые файлы ответственны за cross calls, можно использовать пробу xcal:
$ dtrace -n 'sysinfo:::xcalls
{
@execs[execname] = count();
}'
dtrace: description 'sysinfo:::xcalls' matched 2 probes
bash 3
cron 9
uname 24
sched 219
dtrace 50415
Interrupts (intr and ithr)
intr и ithr показывают общее число прерываний и число обрабатываемых ядром прерываний. Чтобы увидеть кто вызывает прервания, можно использовать скрипт intrtime из DTraceToolkit и команду Solaris intrstat:
$ intrtime 60
Interrupt Time(ns) %Time
uata 2869846 0.00
qfe 46331270 0.08
glm 1913715146 3.19
TOTAL(int) 1962916262 3.27
TOTAL(dur) 60008698021 100.00
$ /usr/sbin/intrstat 5
device | cpu0 %tim
-------------+---------------
glm#0 | 953 2.6
qfe#0 | 202 1.5
uata#0 | 91 0.2
Context switches (csw)
csw показывает число переключений контекста. Чтобы увидеть число переключений контекста для процесса, можно использовать пробу pswitch провайдера sysinfo:
$ dtrace -n 'sysinfo:::pswitch
{
@execs[execname] = count();
}'
dtrace: description 'sysinfo:::pswitch ' matched 3 probes
sshd 2
fmd 3
fsflush 3
sendmail 3
nscd 5
svc.startd 6
dtrace 7
httpd 8
orca 1702
sched 4189
Involuntary context switches (icsw)
icsw показывает число принудительных переключений контекста. Чтобы увидеть времменные интервалы процессов, для которых время выполнения закончилось, можно использовать пробу inv_swtch провайдера sysinfo:
$ dtrace -n 'sysinfo::preempt:inv_swtch
{
@execs[execname] = count();
}'
dtrace: description 'sysinfo::preempt:inv_swtch ' matched 1 probe
dtrace 1
orca 57
Thread migrations (migr)
migr показывает сколько раз поток переключался на новый CPU. Здесь можно использовать пробы on-cpu и off-cpu провайдера sched:
$ dtrace -n ' sched:::off-cpu
{
self->cpu = cpu;
}
sched:::on-cpu /self->cpu != cpu/
{
printf("%s migrated from cpu %d to cpu %d\n",execname,self->cpu,cpu);
self->cpu = 0;
}'
Чтобы увидеть список всех потоков, которые перешли на свободный CPU, можно использовать скрипт /usr/demo/dtrace/whosteal.d:
$ dtrace -s /usr/demo/dtrace/whosteal.d
sched stolen from CPU 3 by:
value ------------- Distribution ------------- count
< 0 | 0
0 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
1 | 0
sendmail stolen from CPU 2 by:
value ------------- Distribution ------------- count
< 0 | 0
0 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1
1 | 0
Spin on mutexes (smtx)
smtx показывает число ожиданий ресурсов ядра. Чтобы увидеть какие исполняемые файлы ответственны за значения больше нуля, можно использовать пробы adaptive-spin и adaptive-block провайдера lockstat:
$ dtrace -n 'lockstat:::adaptive-spin, lockstat:::adaptive-block
{
@execs[execname,probename] = count();
}'
dtrace: description 'lockstat:::adaptive-spin, lockstat:::adaptive-block' matched 2 probes
bash adaptive-spin 44
orca adaptive-spin 144
sched adaptive-spin 527
Команда plockstat также может использоваться для обнаружения блокировок файлов (plockstat использует для этого DTrace, и DTrace еще можно использовать для обнаружения блокировок с опцией "-V"):
$ plockstat -s 4 -p 336
Mutex block
-------------------------------------------------------------------------------
Count nsec Lock Caller
12 24816298 libc.so.1`libc_malloc_lock 0
nsec ---- Time Distribution --- count Stack
4194304 |@@ | 1 libc.so.1`lmutex_lock+0xe0
8388608 |@@@@@@ | 3 libc.so.1`malloc+0x44
16777216 |@@@@@@@@ | 4 libc.so.1`__regcomp_C+0x24
33554432 |@@@@ | 2
67108864 |@@@@ | 2
Mutex unsuccessful spin
-------------------------------------------------------------------------------
Count nsec Lock Caller
16 32768 libc.so.1`libc_malloc_lock 0
nsec ---- Time Distribution --- count Stack
32768 |@@@@@@@@@@@@@@@@@@@@@@@@| 16 libc.so.1`lmutex_lock+0xe0
libc.so.1`malloc+0x44
libc.so.1`__regcomp_C+0x24
Spin on read/writer lock (srw)
srw показывает сколько раз поток блокировался на чтении/записи. Чтобы увидеть какие исполняемые файлы блокируются на чтении/записи, можно использовать пробу rw-block провайдера lockstat :
$ dtrace -n 'lockstat:::rw-block
{
@execs[execname] = count();
}'
dtrace: description 'lockstat:::rw-block ' matched 1 probe
collect_server 221 orca 254
Опять же можно использовать команду plockstat.
System calls (syscl)
syscl показывает число системных вызовов. Чтобы увидеть кто забрасывает систему вызовами, можно использовать провайдер syscall:
$ dtrace -n 'syscall:::entry
{
@num[execname] = count();
}'
dtrace: description 'syscall:::entry' matched 225 probes
utmpd 2
sac 6
fmd 7
svc.configd 7
ttymon 9
sshd 17
svc.startd 78
sendmail 92
nscd 149
httpd 213
dtrace 2018
orca 70710
С помощью провайдера syscall также можно увидеть также инициатора вызова:
$ dtrace -n 'syscall:::entry
{
@num[execname,probefunc] = count();
}'
dtrace: description 'syscall:::entry ' matched 225 probes
orca stat64 501
orca llseek 610
orca read 662
orca lseek 666
orca gtime 1506
orca fstat64 1524
CPU utilization (usr/sys/wt/idl)
usr, sys, wt и idl показывают время, затраченное на выполнение пользовательских программ, функций ядра, ожиданий для чтения/записи, и время бездействия процессора. Для получения информации по использованию CPU процессами, можно использовать скрипт из DTraceToolkit - cputimes:
$ cputimes -a 5
2006 Jan 11 13:49:25,
THREADS TIME (ns)
cron 47842
nscd 211868
fmd 262522
svc.configd 278960
svc.startd 282133
httpd 754139
fsflush 9870970
mysqld 10047752
pageout 11670536
KERNEL 32145457
IDLE 4908549182
Провайдер pid позволяет пронаблюдать за интересующими приложениями, и скрипт из DTraceToolkit под названием modcalls.d помогает распознать какая область ядра занята:
$ modcalls.d
dtrace: script './modcalls.d' matched 18578 probes
ldterm 19
pcipsy 27
ip 29
ipf 46
uata 85
specfs 88
TS 145
sha1 543
SUNW,UltraSPARC-IIi 2111
genunix 20225
unix 110134
VMSTAT
Утилита vmstat используется для получения статистики по использованию виртуальной памяти, обмену страниц физической памяти с диском (с помощью опции "-p" можно выводить тип страниц). Также запускается с аргументом в виде числа, контролирующим частоту вывода данных, а каждая линия вывода vmstat содержит число событий, котрые произошли за этот период:
$ vmstat -p 5
memory page executable anonymous filesystem
swap free re mf fr de sr epi epo epf api apo apf fpi fpo fpf
1986360 5368 0 21 17703 0 46954 0 0 4491 0 4943 4943 0 0 8269
1986224 15944 15 81 12706 0 4659 165 0 2886 0 4643 4643 63 133 5176
1986040 11696 6 37 8293 0 16890 246 0 1560 0 3715 3715 0 16 3018
1985848 7368 0 19 5321 0 38852 53 0 0 15 5313 5313 0 8 8
1985768 4432 3 29 4994 0 52122 171 0 16 0 4971 4971 0 0 8
1985680 5936 6 37 6496 0 49302 192 0 592 0 5888 5888 0 0 16
1985648 7736 2 30 6415 0 53248 116 0 7 15 6400 6400 7 7 7
1985600 5776 12 31 6265 0 53264 317 0 143 16 6083 6083 0 0 40
1985568 8264 0 20 6083 0 58411 222 0 127 24 5956 5956 16 0 0
Далее объясняется за что отвечают значения того или иного столбца в выводе vmstat, вместе с тем, как с помощью DTrace или системной утилиты коррелировать paging применительно к индивидуальным процессам.
Page reclaims (re)
re показывает число страниц, взятых от других процессов за данный период. Здесь можно использовать пробу page_reclaims провайдера vminfo :
$ dtrace -n 'vminfo::page_reclaim:pgrec
{
@execs[execname] = count();
}'
dtrace: description 'vminfo::page_reclaim:pgrec ' matched 1 probes
nscd 6
bash 92
metastat 966
Pages freed (fr)
fr показывает число страниц, освобожденных были освобождены сканером страниц или файловой системой. Чтобы увидеть какие исполняемые файлы были освобождены, можно использовать пробу free провайдера vminfo :
$ dtrace -n 'vminfo:::*free
{
@execs[execname,probename] = count();
}'
dtrace: description 'vminfo:::*free ' matched 8 probes
spamassassin anonfree 114
spamassassin execfree 114
spamassassin fsfree 114
spamassassin dfree 114
sched fsfree 770
sched dfree 770
sched execfree 770
sched anonfree 770
Executable pages paged in (epi)
epi показывает число исполняемых страниц, вовлеченных в paging. Чтобы увидеть "виновников", можно использовать пробу execpgin провайдера vminfo :
$ dtrace -n'vminfo:::execpgin
{
@execs[execname] = count();
}'
dtrace: description 'vminfo:::execpgin ' matched 1 probe
metastat 69
kcfd 70
vmstat 77
bash 207
spamassassin 242
sshd 358
Anonymous pages paged in (api)
api показывает число анонимных страниц, вовлеченных в paging. Здесь используется проба anonpgin провайдера vminfo:
$ dtrace -n'vminfo:::anonpgin
{
@execs[execname] = count();
}'
dtrace: description 'vminfo:::anonpgin ' matched 1 probe
nscd 7
bash 8
cron 14
Anonymous pages paged out (apo)
apo показывает число анонимных страниц, извлеченных из paging'a. Здесь используется проба anonpgout провайдера vminfo:
$ dtrace -n 'vminfo:::anonpgout
{
@execs[execname] = count();
}'
dtrace: description 'vminfo:::anonpgout ' matched 1 probe
vi 4
java 22
sched 693
File system pages paged in (fpi)
fpi показывает число страниц файловой системы, вовлеченных в paging. Чтобы увидеть какие исполняемые файлы ответственны за пэйджинг файловой ситемы, используется проба fspgin провайдера vminfo:
$ dtrace -n 'vminfo:::fspgin
{
@execs[execname] = count();
}'
dtrace: description 'vminfo:::fspgin ' matched 1 probe
metastat 1
which 1
ypcat 1
bart 2
bash 27
File system pages paged out (fpo)
fpo показывает число страниц файловой системы, извлеченных из paging'a. Чтобы увидеть какие исполняемые файлы ответственны за пэйджинг файловой ситемы, используется проба fspgout провайдера vminfo:
$ dtrace -n 'vminfo:::fspgout
{
@execs[execname] = count();
}'
dtrace: description 'vminfo:::fspgout ' matched 1 probe
sshd 1
mailx 10
sched 1003
(По материалам prefetch.net)