$topas -p topas monitor for host: jhhost interval: 2 thu aug 26 16:23:57 2010 data text page pgfaults user pid ppid pri ni res res space time cpu% i/o oth command oracle 324076 1 102 20 1293 4827 1293 3:07 21.7 0 0 oracle patrol 307496 1 8
$topas -p
topas monitor for host: jhhost interval: 2 thu aug 26 16:23:57 2010
data text page pgfaults
user pid ppid pri ni res res space time cpu% i/o oth command
oracle 324076 1 102 20 1293 4827 1293 3:07 21.7 0 0 oracle
patrol 307496 1 80 30 5072 619 11840 2465:39 0.3 0 230 patrolagent
patrol 241988 1 60 20 685 6 835 438:53 0.1 0 0 snmpmagt
oracle 463258 508290 60 20 441 49 441 0:00 0.0 0 0 topas
root 172464 156076 60 20 67 0 345 510:40 0.0 0 0 dtgreet
oracle 467318 1 60 20 1014 4827 1014 0:00 0.0 0 0 oracle
oracle 327748 1 60 20 256 4827 1084 16:25 0.0 0 0 oracle
patrol 299382 307496 60 20 187 954 539 39:58 0.0 0 0 sqlplus
oracle 311356 1 60 20 134 4827 1396 20:18 0.0 0 0 oracle
oracle 303164 1 60 20 131 4827 2167 25:44 0.0 0 0 oracle
root 278788 205276 60 20 40 61 306 47:43 0.0 0 0 i4llmd
root 28972 0 37 41 24 0 29 75:29 0.0 0 0 gil
root 61592 160160 60 20 64 26 651 20:13 0.0 0 0 x
root 4384 0 16 41 11 0 12 37:30 0.0 0 0 swapper
oracle 307258 1 60 20 469 4827 1873 17:29 0.0 0 0 oracle
root 221672 1 60 20 257 31 1600 9:26 0.0 0 0 ltid
root 282672 1 60 20 296 19 6578 7:27 0.0 0 0 vmd
root 225300 1 60 20 177 308 716 12:42 0.0 0 0 naviagen
root 204816 1 60 20 45 0 47 11:55 0.0 0 0 rpc.lock
root 192708 0 60 20 11 0 12 0:22 0.0 0 0 n4bg
$ topas
topas monitor for host: jhhost events/queues file/tty
thu aug 26 16:24:56 2010 interval: 2 cswitch 346 readch 88771
syscall 2742 writech 23220
kernel 0.5 |# | reads 141 rawin 0
user 42.3 |############# | writes 124 ttyout 259
wait 0.1 |# | forks 0 igets 0
idle 57.1 |################# | execs 0 namei 78
runqueue 0.0 dirblk 0
network kbps i-pack o-pack kb-in kb-out waitqueue 0.0
en0 69.2 112.5 118.5 45.7 23.5
lo0 2.0 3.5 3.5 1.0 1.0 paging memory
en1 0.7 8.5 0.0 0.7 0.0 faults 54 real,mb 3728
steals 0 % comp 87.7
disk busy% kbps tps kb-read kb-writ pgspin 0 % noncomp 8.5
hdisk46 0.0 39.2 0.5 0.0 39.2 pgspout 0 % client 8.5
skpower7 0.0 39.2 0.5 0.0 39.2 pagein 0
hdisk1 1.0 8.0 2.0 0.0 8.0 pageout 0 paging space
sios 0 size,mb 16384
name pid cpu% pgsp owner % used 15.1
oracle 410020 24.9 5.0 oracle nfs (calls/sec) % free 84.8
oracle 324076 23.4 5.1 oracle serverv2 0
patrolagent 307496 0.1 46.2 patrol clientv2 0 press:
topas 389584 0.1 1.8 oracle serverv3 0 h for help
dtgreet 172464 0.1 1.3 root clientv3 0 q to quit
上面是在 aix 5.3 系统下的两份 topas 输出,第一份是仅输出进程(带 -p 选项),第二份是囊括 cpu、内存、交换空间、i/o 和进程多项资源指标于一个界面的 topas 标准输出。pgsp 是一项描述进程的指标,是 page space 的缩写,本义指的是进程所用页空间大小,在两份输出中,topas -p 显示的 page space 以页为单位(1页等于4kb),topas 标准输出中 pgsp 以 mb 为单位。
比较 hp-ux 、 linux 和 aix 上 top 输出中与 pgsp 相似的字段( hp-ux 上是 size ,linux 上是 virt),pgsp 实在是名字起得不好,太容易和 paging space 混淆,注意一个是名词 page,一个是动词 paging,paging space 在 aix 中与 swap space 是互换使用的,paging space 是换页空间,也是交换区所在。pgsp 是虚空间(virtual space),不是换页空间或交换区空间。man topas 手册页对 page space 说明如下:
virtual working set size used by process (4kb pages). note: the true paging space allocations per process are not available using thetopas command. refer to the svmon command for more detailed.
pgsp 只包括进程私有数据段以及堆栈段虚空间,不含执行映象、共享库、共享内存部分,pgsp 的值一定大于或等于 data res(见前面 topas -p 输出) 的值,因为 pgsp 会包括不在内存中的不活动的私有数据段部分或者已被交换到换页空间上的部分。什么叫不活动的数据段,举个例子,你有一个应用程序通过 malloc 系统调用申请了 1mb 内存空间,系统并非马上就在物理内存中就给它划了那么多空间,你如果一直不用这段内存(譬如作 i/o 操作),那么这段空间只在虚空间里存在。在前面 topas -p 输出中,我们看到一个进程号是 324076 的 oracle 进程,其 pgsp 与 data res 相同,都是 1293 页;一个进程号是 327748 的 oracle 进程,其 pgsp 是 1084 页,data res 是 256 页;一个进程号是 307496 的 patrolagent 进程,其 pgsp 是 11840 页,data res 是 5072 页。一般内存充裕的情况下,pgsp 与 data res 是一致的,除非你程序编得不好,申请一个大内存又不用。前面 topas 标准输出中我的计算内存(%comp)已占到总内存的 88%,换页空间(paging space)使用了 15%,这不是一个内存很充分的系统。
大家会有一个问题:我如何知道换页空间(paging space)是被哪些进程占用了?前面那段英文交代得很清楚,topas 没法告诉你这些,用 svmon 命令可看到进程使用换页空间的情况。
另外要说明的是 ps 命令中也有类似 pgsp 的字段,以 patrolagent 这个进程(pid 号为 307496)为例,执行以下命令:
$ ps avx | head -1; ps avx | grep 307496
pid tty stat time pgin size rss lim tsiz trs %cpu %mem command
307496 - a 2478:25 309661 47360 21900 32768 3632 2332 0.1 1.0 patrolagent
size 字段与 pgsp 等义。ps 输出中与内存/虚存有关的单位是 kb,看 size 值是 47360kb(46.2mb),也就是 11840 页,与 top 中的 pgsp 完全相同。
前面说过要了解 aix 中某个进程使用换页空间的情况,正规方法是用 svmon 命令,不过你也可以用 ps 命令作个大致换算,看前面 patrolagent 进程的 ps 输出,size-(rss-trs)=47360-(21900-2332)=27792kb, 这个 patrolagent 进程大概使用了26mb 的换页空间,嘿,这 26mb 也可能是未使用的虚空间呢。
你可以用下面的 shell 脚本来估算你的系统中全部进程占用了多少换页空间(提醒你只是估算):
$ ps avx | sed -e 1d | awk 'begin { total = 0 } { total += ( $6 - ( $7 - $10 ))} end { print total = ,total }'
注意 aix 的 ps 输出中 size 字段以及 rss 字段都不包括共享内存(shared memory)部分,这点与 linux 不同,使用 ps 要注意到这种差异。一般数据库服务器的共享内存段都常驻内存,不会用到换页空间,如果上面 shell 脚本算出的换页空间占用量明显小于 lsps -s 命令显示的换页空间使用量,有可能大的共享内存段被交换出去了,这是非常糟糕的情况,要赶紧打报告,扩内存了。