星期五 七月 27, 2007
Solaris 10 上的性能调优的一些总结 (续)
关于Virtual Memory系统, 首先我们可以通过vmstat和其他工具来观察系统状态:
Loading modules: [ unix krtld genunix specfs dtrace ufs scsi_vhci pcisch ip hook neti sctp arp usba s1394 nca lofs zfs random audiosup sd sppp crypto ptm logindmux md cpc fcip fctl fcp ipc ]
> ::memstat
Page Summary Pages MB %Tot
------------ ---------------- ---------------- ----
Kernel 27266 213 21%
Anon 19408 151 15%
Exec and libs 1986 15 2%
Page cache 12370 96 10%
Free (cachelist) 34253 267 26%
Free (freelist) 34024 265 26%
Total 129307 1010
Physical 127478 995
> $q
通过mdb -k的::memstat我们可以观察到系统内存的状态: 我们可以看到Free 的内存大概占52%左右, cachelist + freelist.
可以用vmstat -p 看系统的page in 和 page out状态如何?
vmstat -p 3
memory page executable anonymous filesystem
swap free re mf fr de sr epi epo epf api apo apf fpi fpo fpf
1512488 837792 160 20 12 0 0 0 0 0 0 0 0 12 12 12
1715812 985116 7 82 0 0 0 0 0 0 0 0 0 45 0 0
1715784 983984 0 2 0 0 0 0 0 0 0 0 0 53 0 0
1715780 987644 0 0 0 0 0 0 0 0 0 0 0 33 0 0
如果系统大部分的活动都是只在filesystem pagein 和 pageout方面, 即fpi, fpo, fpf三列, 不用紧张, 这是很正常的现象, 因为系统当有空闲的内存的时候, 都会拿来做 file system的cache, 这样会增加系统的读写文件的速度和性能.
vmstat -p 3
memory page executable anonymous filesystem
swap free re mf fr de sr epi epo epf api apo apf fpi fpo fpf
2276000 1589424 2128 19969 1 0 0 0 0 0 0 0 0 0 1 1
1087652 388768 12 129675 13879 0 85590 0 0 12 0 3238 3238 10 9391 10630
608036 51464 20 8853 37303 0 65871 38 0 781 12 19934 19930 95 16548 16591
94448 8000 17 23674 30169 0 238522 16 0 810 23 28739 28804 56 547 556
如果系统大部分的活动除了在filesystem方面 pagein 和 pageout, 还在Anonymous memory方面有很大的page in 和 page out活动,即api, apo 两列有很大的值, 并且 sr 一列即 scan rate比较大, 同时free 一列即 free memory少于机器物理内存的 1/16, 这代表系统的内存正处于不足以供应应用的状态, 这会导致性能问题.
我们继续用prstat -m来观察:
prstat -mL
PID USERNAME USR SYS TRP TFL DFL LCK SLP LAT VCX ICX SCL SIG PROCESS/LWPID
15625 rmc 0.1 0.7 0.0 0.0 95 0.0 0.9 3.2 1K 726 88 0 filebench/2
15652 rmc 0.1 0.7 0.0 0.0 94 0.0 1.8 3.6 1K 1K 10 0 filebench/2
15635 rmc 0.1 0.7 0.0 0.0 96 0.0 0.5 3.2 1K 1K 8 0 filebench/2
15626 rmc 0.1 0.6 0.0 0.0 95 0.0 1.4 2.6 1K 813 10 0 filebench/2
15712 rmc 0.1 0.5 0.0 0.0 47 0.0 49 3.8 1K 831 104 0 filebench/2
15628 rmc 0.1 0.5 0.0 0.0 96 0.0 0.0 3.1 1K 735 4 0 filebench/2
15725 rmc 0.0 0.4 0.0 0.0 92 0.0 1.7 5.7 996 736 8 0 filebench/2
15719 rmc 0.0 0.4 0.0 0.0 40 40 17 2.9 1K 708 107 0 filebench/2
15614 rmc 0.0 0.3 0.0 0.0 92 0.0 4.7 2.4 874 576 40 0 filebench/2
从USR到 LAT这些列的值加起来应该是100%, LAT所代表的是cpu的latency, DFL所代表的是在Anon memory也就是匿名内存中所花费的在major fault上面的时间, 如果这一列值很大, 说明系统的内存不足或者应用有问题.
我们可以用dtrace往下观察, dtrace中的vminfo provider可以让我们了解更多的内容.
比如我们使用vmstat -p 命令看到api一列值很大,我们可以用dtrace来了解是哪些程序造成的:
sol10$ dtrace -n anonpgin '{@[execname] = count()}'
dtrace: description anonpgin matched 1 probe
svc.startd 1
sshd 2
ssh 3
dtrace 6
vmstat 28
filebench 913
而在solarisinternal上也有很多备好的脚本,非常方便使用.
http://www.solarisinternals.com/si/dtrace/
比如whospaging.d:
#!/usr/sbin/dtrace -s
#pragma D option quiet
sched:::on-cpu
{
self->on = vtimestamp;
}
sched:::off-cpu
/self->on/
{
@oncpu[execname] = sum(vtimestamp - self->on);
self->on = 0;
}
vminfo:::anonpgin
{
self->anonpgin = 1;
}
:::pageio_setup:return
{
self->wait = timestamp;
}
:::pageio_done:entry
/self->anonpgin == 1/
{
self->anonpgin = 0;
@pageintime[execname] = sum(timestamp - self->wait);
self->wait = 0;
}
tick-5s
{
trunc(@oncpu, 10);
trunc(@pageintime, 10);
printf("\033[H\033[2J");
normalize(@pageintime, 1000000);
printf("Who's waiting for pagein (milliseconds):\n");
printa(" %-50s %15@d\n", @pageintime);
normalize(@oncpu, 1000000);
printf("Who's on cpu (milliseconds):\n");
printa(" %-50s %15@d\n", @oncpu);
trunc(@oncpu);
trunc(@pageintime);
}
通过这段脚本我们可以看到程序和应用怎样在CPU中切换, 一个应用在切换前在前一个CPU上运行的时间. 另外, 我们还可以看到应用花费在anno pagein活动上建立page的时间.
同理可得, 我们可以使用major fault的探针, 同样是vminfo provider里面其中的一员, 观察到应用花费在 major fault上的时间, 虽然在这个脚本里面我们并没有使用major fault的探针.
脚本的结果格式大概如下:
sol10$ ./whospaging.d
Who's waiting for pagein (milliseconds):
wnck-applet 21
gnome-terminal 75
Who's on cpu (milliseconds):
wnck-applet 13
gnome-terminal 14
metacity 23
Xorg 90
sched 3794
Posted at 05:03下午 七月 27, 2007 by Benny Luo in Solaris 10 | Comments[1]
你好!我是《软件世界》的编辑,拜读了你的blog,对你关注的东西也很感兴趣,希望你能不吝赐稿。希望能得到你的回复,保持联系,我的邮箱是qsy@swm.com.cn。
Posted by qsy on 七月 30, 2007 at 12:55 下午 GMT+08:00 #