camyd
作者camyd2012-10-11 16:12
数据库管理员, 中储粮

AIX系统内存占用率的计算

字数 3260阅读 17040评论 4赞 3
1、现象、问题描述

在系统监控时,经常会监控系统内存占用率,其目的为避免系统因为在动态分配内存时因为实际内存不够而使用swap空间,使用swap空间将使用系统性能下降,系统不稳定。

在Linux系统中,系统内存占用率可以通过free命令,计算得出:

/home/jcxia> free

total used free shared buffers cached

Mem: 24672800 17895600 6777200 0 232996 14706928

-/+ buffers/cache: 2955676 21717124

Swap: 21727904 0 21727904

其中:

total――指系统所有的物理内存大小

used――已经使用的物理内存大小

free――空闲的物理内存大小

buffers――文件系统缓存占用的物理内存,指要写入物理磁盘的数据占用的内存。

cached――文件系统缓存占用的物理内存,指从物理磁盘读入供以后使用的数据占用的内存。

实际系统中,文件系统缓存可能占用大量的物理内存,Linux下计算物理内存空闲率时,通常将buffers与cached内存当作可使用的内存。即实际系统内存占用率计算:

( total – (free + buffer + cached) ) * 100/ total

在AIX系统下,没有free命令,与之类似的的命令是svmon –G

# svmon -G

size inuse free pin virtual

memory 4100096 420275 3679821 271614 398980

pg space 1048576 1109


work pers clnt

pin 271614 0 0

in use 398980 0 21295

其中:

size――报告了 RAM 的大小,单位是大小为 4k 的页面。

inuse ――报告了进程所使用的 RAM 中的页面数,加上属于一个已终止的进程但仍位于 RAM 中的持久页面的数目。

free ――报告了空闲列表中页面的数目。

pin ――报告了物理内存 (RAM) 中固定的页面数。固定的页面不能被调出。

paging space ――报告了分页空间的实际使用情况(单位是大小为 4k 的页面)。


与Linux不同的是,svmon只能是root用户才能使用。但有一些脚本并不运行在root用户下,那怎么样才能在普通用户下计算系统内存占用率呢?

在巡检工具及watchdog脚本中,AIX下的空闲内存计算通常通过free * 100/ total。与Linux系统一样,AIX的文件系统也占用了大量的内存,free值很小是很正常的。

因此这里有两个问题:

l AIX下的内存占用率应该怎么计算?

l AIX下普通用户怎么获取内存占用信息?

2、关键过程、根本原因分析

首先想到的办法是通过另外的属主是root用户的脚本,设置其Set-id位,使其执行时有效用户ID为root用户的ID,然后在脚本中执行svmon,没有成功。

然后,想想能不能搞清楚svmon每项输出的含义,并找找有没有普通用户能执行的相关的命令,并根据相关的输出计算得出。

先来分析AIX内存管理原理。

AIX使用VMM(虚拟内存管理器)管理管理 RAM 和虚拟页面的分配。“在 AIX 中,将所有的虚拟内存段划分为若干个页面,每个页面的缺省大小为 4KB。所分配的页面可以位于 RAM 或者分页空间(虚拟内存存储于磁盘上)。VMM 还维护一个称为空闲列表 的对象,该对象定义为未分配的页帧。它们用于处理缺页的情况。通常存在少量未分配页面(您可以自行配置),VMM 可以使用这些页面来腾出空间并为其重新分配页帧。可以使用 VMM 的页面置换算法来选择要重新分配页帧的虚拟内存页面。这种分页算法可以确定对当前位于 RAM 中的哪些虚拟内存页面的页帧进行回收,并放回到空闲列表中。AIX 可以使用所有可用的内存,除了那些配置为未分配并用做空闲列表的内存之外。”

VMM 将虚拟内存段划分为两种不同的类别。它们分别是,使用计算内存的工作段和使用文件内存的持久段。

计算页面

当进程对计算信息进行处理时,将使用到计算内存。这些工作段是临时的(暂时的),并且当进程终止或者页面被替换时,这些工作段将不复存在。它们没有对应的持久磁盘存储位置。在许多情况下,当一个进程终止时,将释放其物理和分页空间。在 VMM 中,当空闲物理内存较少时,可以将最近没有使用的程序从 RAM 移出到分页空间,以帮助释放物理内存,从而完成更多的实际工作。

文件页面

与计算内存不同,文件内存使用了持久段,并在磁盘上具有持久存储位置。数据文件或者可执行程序通常都映射为持久段,而不是工作段。数据文件可能与文件系统相关,如 JFS、JFS2 或 NFS。它们一直都位于内存中,直到文件被卸载、页面被替换、或者取消了到文件的链接。在将数据文件复制到 RAM 中之后,VMM 控制何时对这些页面进行覆盖或者将其用于存储其他数据。在可以选择的情况下,大多数人更希望将文件内存调出到磁盘,而不是计算内存。

从以上分析可以得出,计算AIX内存实际使用的量时,应该是:
计算内存 *100 / 总内存

使用svmon –G命令时,即为work * 100 / memory size.

不过上述计算也不完全正确,因为work页面可能于交换空间,而不是实际内存中。


分析系统性能时,我们还常用另一个命令:vmstat。

8 [jcxia] :/home/jcxia/tool>vmstat

系统配置:lcpu=4 mem=16000MB

kthr memory page faults cpu

----- ----------- ------------------------ ------------ -----------

r b avm fre re pi po fr sr cy in sy cs us sy id wa

1 1 397674 3681485 0 0 0 0 0 0 24 2040 64 0 0 75 24

这里,avm的含义为:表示系统所使用的活动虚拟内存量(单位为 4k 大小的页面),不包括文件页面。可见,使用“vm * 100/系统内存总页面数 ”可以估算系统当前内存占用率。


3、结论、解决方案及效果

使用vmstat –v获取系统总页面数:

9 [jcxia] :/home/jcxia/tool>vmstat -v

4096000 内存页

3886550 lruable 页

3681488 可用页

0 内存池

279392 固定页

80.0 maxpin 百分比

20.0 minperm 百分比

80.0 maxperm 百分比

0.3 numperm 百分比

13075 文件页

0.0 压缩百分比

0 压缩页

0.4 numclient 百分比

80.0 maxclient 百分比

16841 客户机页

0 已调度的远程页调出

0 在没有 pbuf 的情况下阻塞暂挂磁盘 I/O

0 在没有 psbuf 的情况下阻塞调页空间 I/O

2740 在没有 fsbuf 的情况下阻塞文件系统 I/O

6092 在没有 fsbuf 的情况下阻塞客户机文件系统 I/O

0 在没有 fsbuf 的情况下阻塞外部寻呼机文件系统 I/O

然后使用vmstat获取avm大小。

可以使用使用shell脚本如下:

total=`vmstat -v|head -1|awk '{print $1}'`

avm=`vmstat |sed -n '$ p'|awk '{print $3}'`

SysMemRatio=`echo "100 * ${avm} / ${total}" | bc `

4、经验总结、预防措施和规范建议

不同的操作系统管理机制存在一定的差别,做watchdog等相关的工具时,要考虑不同平台的差别。

这种方法只能近似计算,并且有可能出现内存占用率超过100%的现象。

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

3

添加新评论4 条评论

hanson2008hanson2008系统工程师, city
2016-06-06 23:36
好内容,学习了
sakidodosakidodo系统工程师, 无
2012-11-06 17:18
确实有点难理解
lcq225lcq225软件开发工程师, Haike Group
2012-10-22 08:38
思路非常好,就是理解起来难度大大地
houfenghoufeng系统管理员, 天元网络
2012-10-20 10:44
Ctrl+Enter 发表

作者其他文章

相关文章

相关问题

相关资料

X社区推广