Default style (Cherry Eve). Switch styles (Capricorn). Atom Feed Calendar
http://developers.sun.com.cn/blog/BennyLuo/date/20070727 星期五 七月 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

Comments:

你好!我是《软件世界》的编辑,拜读了你的blog,对你关注的东西也很感兴趣,希望你能不吝赐稿。希望能得到你的回复,保持联系,我的邮箱是qsy@swm.com.cn。

Posted by qsy on 七月 30, 2007 at 12:55 下午 GMT+08:00 #

Post a Comment:
  • HTML Syntax: NOT allowed