做性能調優首先需要了解系統的現象,一個應用如果出現性能問題,大部分應用都會在操作系統層面表現出問題,比如CPU使用過度, 程序中鎖使用過于頻繁, 內存泄露等等, 這些都可用Solaris的基本命令看出來, 基本上在性能調優過程, 我們需要通過Solaris 10的一些常用命令比如mpstat, vmstat, iostat等等確定問題所在, 然后再用dtrace進行深入調查.
比方說, 如果是CPU方面使用有問題, 我們通過mpstat, prstat來看. 下面是一個例子, 只是一個范例而已:
# mpstat 2
CPU minf mjf xcal intr ithr csw icsw migr smtx srw syscl usr sys wt idl
0 117 0 1583 883 111 1487 593 150 6104 64 11108 7 92 0 1
1 106 0 557 842 0 1804 694 150 6553 84 10684 6 93 0 1
2 112 0 664 901 0 1998 795 143 6622 64 11227 6 93 0 1
3 95 0 770 1035 0 2232 978 131 6549 59 11769 7 92 0 1
可以看到cpu使用在系統態層面大概平均93%, 用戶層大概6%左右, 1%左右是閑置的,而sys call調用是大量而且頻繁的, 良好的系統應用應該是大部分的時間花在用戶層面, 而少部分時間使用在系統調用層面.
我們使用dtrace往下追蹤是什么應用導致這么多的sys call:
# dtrace -n 'syscall:::entry { @[execname] = count(); }'
dtrace: description 'syscall:::entry ' matched 229 probes
^C
inetd 1
svc.configd 1
fmd 2
snmpdx 2
utmpd 2
inetd 1
svc.configd 1
fmd 2
snmpdx 2
utmpd 2
svc.startd 13
sendmail 30
snmpd 36
nscd 105
dtrace 1311
filebench 3739725
知道了是filebench應用導致了這么多的sys call, 但我們不知道是哪一個具體的sys call, 依然可以通過dtrace來查找:
# dtrace -n 'syscall:::entry /execname == "filebench"/ { @[probefunc] = count(); }'
dtrace: description 'syscall:::entry ' matched 229 probes
^C
lwp_continue 4
lwp_create 4
mmap 4
schedctl 4
setcontext 4
lwp_sigmask 8
nanosleep 24
yield 554
brk 1590
pwrite 80795
lwp_park 161019
read 324159
pread 898401
semsys 1791717
我們可以知道semsys sys call調用得最多, 但不知道在應用中是通過應用的哪些函數調用和怎樣調用的, 依然可以通過dtrace.
# dtrace -n 'syscall::semsys:entry /execname == "filebench"/ { @[ustack()] = count(); }'
dtrace: description 'syscall::semsys:entry ' matched 1 probe
^C
libc.so.1`_syscall6+0x1c
filebench`flowop_start+0x408
libc.so.1`_lwp_start
10793
libc.so.1`_syscall6+0x1c
filebench`flowop_start+0x408
libc.so.1`_lwp_start
10942
libc.so.1`_syscall6+0x1c
filebench`flowop_start+0x408
libc.so.1`_lwp_start
11084
這樣我們可以知道filebench的flowop_start函數調用此semsys sys call最多,我們就可以著手去尋找這個flowop_start函數看是否有改進的方法.
posted on 2007-07-27 22:27
前方的路 閱讀(351)
評論(0) 編輯 收藏 所屬分類:
Solaris相關