使用 ps、vmstat、topas 等通用工具观察 AIX 操作系统内存使用状况

来源:百度文库 编辑:神马文学网 时间:2024/04/19 19:19:16
ps、vmstat、topas 在 AIX 操作系统中是任何用户都可以使用的,而 sar 命令普通用户缺省情况下没有执行权限,需要超级用户事先授权,我发现大部分系统管理员没有把 sar 放开,建议 sar 至少应让数据库用户或者主要应用用户能够使用,sar 在 HP-UX 和Linux 系统中是任何用户都能使用的,sar 的历史数据搜集功能简单有效。本文不会用到 sar, 当然不是为了证明 sar 是个废物,只是就地取材的需要,在普通用户下用不了 sar,但 ps、vmstat 和 topas 是一定能用的。另外一定要提到的是 svmon 命令,这是 AIX 下要进行更详细的内存分析时用到的专用工具,一定要做个比较的话,Solaris 和 Linux 下有 pmap 命令。svmon 在 AIX 5L 中只能在超级用户权限下执行,在 AIX 6 下由于引入了 RBAC(role-based access control)机制,对 svmon 执行权限可以进行授权,缺省情况下普通用户也能使用 。ps、vmstat、topas 和 svmon 的输出信息可以互相参照和应证。

好了,现在提一个问题,我如何知道我的 4C(4个CPU)4G(4GB内存)、8C8G、8C16G、8C32G 等诸如此类配置的p系列系统内存是够用的,有没有一招鲜的方法就盯一个指标就知道内存够用,不是瓶颈?

老实说,没有这么一个指标给你去用,但是厂家的销售和某些固执的技术人员会很坚定地跟你说,就看 free 值(vmstat 输出中一个字段),只要它大于 1000 就行了,你问为什么?他不会给你解释,仿佛那是一个毋庸置疑的真理。我想 free 值 1000 是多少啊,1000 页,每页 4KB, 自由内存只要有 4MB 就行了,现在什么执行程序不都得上 10M, 那些象 awk、grep、sort、cut 之类小巧玲珑的程序除外。你想找一个乐于讨论技术的专家来聊聊,这时你又被传授一招,用 vmstat 命令去观察是否有 page space in 和 page space out 动作发生。

我就想如果我的系统 free 值是 5000,连续监控两天也没有出现 page space in 和 page space out,难道我就能下结论说我的系统是一个好系统,不存在内存的困恼?下面给大家展示一个系统,这个系统上跑两个独立的应用,一个是 ATM 交换平台应用,另一个是跨行卡交换平台应用。两个应用都有自己的数据库实例,而且两个数据库实例也都在这同一个系统上,该系统硬件配置是 4C8G,操作系统识别的逻辑 CPU 是 8 个(因 SMT enabled and SMT_threads = 2)。

$ vmstat 5 3

System Configuration: lcpu=8 mem=7936MB

kthr    memory              page              faults        cpu
----- ----------- ------------------------ ------------ -----------
 r  b   avm   fre  re  pi  po  fr   sr  cy  in   sy  cs us sy id wa
 1  0 1611619  8087   0   0   0   0    0   0  78 4070 777  1  1 98  0
 0  0 1611586  8079   0   0   0   0    0   0 114 8136 1131  4  3 93  0
 2  0 1612269  7354   0   0   0   0    0   0  87 12327 1311  5  3 93  0
$

$ lsps -a
Page Space      Physical Volume   Volume Group    Size %Used Active  Auto  Type
hd6             hdisk0            rootvg        8192MB     2   yes   yes    lv
$

$topas
Topas Monitor for host:    JHAP001             EVENTS/QUEUES    FILE/TTY
Fri Aug 20 16:12:51 2010   Interval:  2         Cswitch    1421  Readch  2642.4K
                                                Syscall   14800  Writech  140.2K
Kernel    4.8   |##                          |  Reads      2809  Rawin         0
User      6.4   |##                          |  Writes      612  Ttyout     2018
Wait      0.0   |#                           |  Forks       144  Igets         0
Idle     88.7   |#########################   |  Execs       143  Namei      3109
                                                Runqueue    2.0  Dirblk        0
Network  KBPS   I-Pack  O-Pack   KB-In  KB-Out  Waitqueue   0.0
lo0      55.3    109.3   109.3    27.7    27.7
en0      22.0     45.9    48.4    10.2    11.8  PAGING           MEMORY
en1       0.2      1.0     0.5     0.1     0.1  Faults    22667  Real,MB    7936
                                                Steals        0  % Comp     87.4
Disk    Busy%     KBPS     TPS KB-Read KB-Writ  PgspIn        0  % Noncomp  13.2
kpower28  0.4     37.9     9.5     0.0    37.9  PgspOut       0  % Client   13.2
kpower27  0.4     35.9     1.0     0.0    35.9  PageIn        0
hdisk62   0.4     33.9     0.5     0.0    33.9  PageOut       8  PAGING SPACE
hdisk63   0.0     20.0     5.0     0.0    20.0  Sios          8  Size,MB    8192
hdisk50   0.4     18.0     4.5     0.0    18.0                   % Used      1.9
hdisk1    1.9     14.0     3.5     0.0    14.0  NFS (calls/sec)  % Free     98.0
hdisk0    0.9     14.0     3.5     0.0    14.0  ServerV2       0
kpower21  0.0     10.0     2.5     0.0    10.0  ClientV2       0   Press:
hdisk56   0.0      6.0     1.5     0.0     6.0  ServerV3       0   "h" for help
hdisk43   0.0      4.0     1.0     0.0     4.0  ClientV3       0   "q" to quit
hdisk49   0.0      2.0     0.5     0.0     2.0
hdisk20   0.0      0.0     0.0     0.0     0.0
hdisk25   0.0      0.0     0.0     0.0     0.0

Name            PID  CPU%  PgSp Owner
sh           557172   0.5   0.5 switch
oninit       708922   0.2   0.6 informix
xmwlm        221660   0.2   1.2 root
etsReq_D     950746   0.1   1.8 switch
oninit       258106   0.1   0.7 informix

$ ps aux | wc -l
     425
$

$ ps aux | head -1; ps aux | sed -e "1d" | sort +5nr | more
USER         PID %CPU %MEM   SZ  RSS    TTY STAT    STIME  TIME COMMAND
patrol    962716  0.3  1.0 58420 55780      - A      Jul 04 1523:33 PatrolAgent -p
root      245760  0.0  0.0 28976 29124      - A      Jul 04 22:58 /usr/openv/netb
root      213244  0.0  0.0 30828 28092      - A      Jul 04  0:38 /usr/openv/netb
posb      774276  0.0  0.0 26004 25496      - A      Jul 05  2:01 Switch 1101 2
root     1229294  0.0  0.0 24256 24244      - A      Jul 28  0:19 storapid start
patrol   1077590  0.0  0.0 12848 12928      - A      Jul 04  8:08 bgscollect -I n
root      200976  0.0  0.0 13592 12400      - A      Jul 04  1:33 vmd
root      254230  0.0  0.0 14288 11000      - A      Jul 04  2:04 /usr/openv/volm
root      672240  0.0  0.0 9588 9752      - A      Jul 04  9:42 /usr/sbin/rsct/
informix  745512  0.0  0.0 11072 9584      - A      Jul 04  3:48 oninit
informix  475394  0.0  0.0 11068 9580      - A      Jul 04 14:58 oninit
informix  807204  0.1  0.0 10800 9556      - A      Jul 04 368:52 oninit
informix  258106  0.0  0.0 10740 9504      - A      Jul 04 93:33 oninit
informix  708922  0.1  0.0 10648 9412      - A      Jul 04 356:05 oninit
........................

$ vmstat -v
              2031616 memory pages
              1952961 lruable pages
                 6360 free pages
                    2 memory pools
               472656 pinned pages
                 80.0 maxpin percentage
                 10.0 minperm percentage
                 90.0 maxperm percentage
                 13.2 numperm percentage
               258434 file pages
                  0.0 compressed percentage
                    0 compressed pages
                 13.2 numclient percentage
                 90.0 maxclient percentage
               258429 client pages
                    0 remote pageouts scheduled
                    1 pending disk I/Os blocked with no pbuf
                  717 paging space I/Os blocked with no psbuf
                 2484 filesystem I/Os blocked with no fsbuf
                  417 client filesystem I/Os blocked with no fsbuf
                    0 external pager filesystem I/Os blocked with no fsbuf
                    0 Virtualized Partition Memory Page Faults
                 0.00 Time resolving virtualized partition memory page faults
$

$ vmstat -s
            622566993 total address trans. faults
            238405893 page ins
            417458254 page outs
                15227 paging space page ins
                26227 paging space page outs
                    0 total reclaims
           2874949233 zero filled pages faults
                43094 executable filled pages faults
            145148903 pages examined by clock
                 4968 revolutions of the clock hand
            469136694 pages freed by the clock
            428962821 backtracks
                    0 free frame waits
                    0 extend XPT waits
              9083933 pending I/O waits
            655864382 start I/Os
             94687163 iodones
           4660499262 cpu context switches
            532343826 device interrupts
            824993972 software interrupts
           2335995821 decrementer interrupts
             40991343 mpc-sent interrupts
             40982373 mpc-received interrupts
              1045786 phantom interrupts
                    0 traps
          50214373791 syscalls
$

这是一台 4C/8G 的 IBM p系列服务器,操作系统是 AIX 5.3 ML06, vmstat 显示的自由内存(free memory list)还有 7300 页,相当于 29 MB(7300 X 4KB),vmstat -s 输出显示自由内存等待(free frame waits)为 0,这说明虽然自由内存不多,但应用需要内存的时候都能得到满足,也反映一个问题,你这个系统突然需要内存的时候不多。vmstat 还告诉我们在命令执行时刻不存在换页空间(pageing space)操作,看 vmstat 显示的活动虚存总数(avm)是 1612269 页,相当于 6449MB(1612269 X 4KB),而系统物理内存有 7936MB, 所以活动虚存基本上可以全部被容纳到物理内存中,如果系统配置的是 4G 内存,那就要重新做部署规划了。再通过 lsps -a 观察下交换空间的使用,用得不多,还是用了2%,即164MB,这样大致看一下,这个交易系统在内存使用上还算过得去。系统管理员、运行人员以及第三方维保工程师在该系统上确实也没有耗费过多的精力,客户使用自助设备也能得到及时的响应。但假如你问该系统内存容量(capacity)如何这么个问题,就得想想了,系统虽然运行还算可以,质量要求是无限的,你要考虑类似容错那样的场景,假若运行人员打开一个大的日志文件,或者应用分析人员在系统上执行一个复杂的历史数据查询,都有可能引发意想不到的结果,一年 365 天周而复始的运行,说不上哪天或者哪段时间就碰上这种事。看看 topas 显示的内存(memory)使用情况,计算内存(computational pages)占了 87.4%, 非计算内存(file pages)占用了 13.2%.换算一下计算内存用掉 6936MB, 文件内存用掉 1048MB.计算内存与 avm 值比较接近,有 avm 比计算内存量大很多的系统,那样换页空间会大量使用。看 vmstat -v 输出中的 numperm 值(就是非计算内存占比)是 13.2%, 它介于 minperm(AIX 5.3 设为 10%)和 maxperm(AIX 5.3 设为 90%)之间,当自由内存不足的时候(譬如你打开一份 800 MB 的日志文件来回浏览或者 unload 一个 2GB 的明细文件做模式匹配),偷页进程(在 AIX 上进程名叫 lrud)会在非计算内存那 1048MB 空间中去回收页面。如果计算内存占用比例提高到 90% 以上,现在已经 87% 了,所以这并非不可能,那么 numperm 一定不会超过 minperm, 这个时候内存不足就可能到计算内存中去回收页面,引发换页空间的操作。我想说的是计算内存使用量接近 90%,这对于一个 7X24 小时运行的系统应该引起警觉,增加 8G 内存,把计算内存使用量降到 50%,这个投入是非常值得的。

大家会注意到 topas 输出中计算内存与非计算内存之和超过了 100%,估计有部分重复量(共享库、共享内存、执行映像之类)算到了相应的内存中,完全避免很难,超过一点点属正常。另外要提醒的是计算内存加上非计算内存之和并非一定要等于或接近 100%,因为自由空闲内存不属于上述任何一类内存。