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%的现象。
添加新评论4 条评论
2016-06-06 23:36
2012-11-06 17:18
2012-10-22 08:38
2012-10-20 10:44
http://soulhou.taobao.com/?spm=a1z10.1.w2.1.bdacb