在系统监控时,经常会监控系统内存占用率,其目的为避免系统因为在动态分配内存时因为实际内存不够而使用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%的现象.
1.在AIX系统中,内存可以简单的分为两类,计算型内存和文件型内存,
在AIX操作系统中,可以使用topas命令查看整个系统的运行情况,其中一个重要的部份是系统的内存使用情况,以及交换情况:
MEMORY
Real,MB 16032
% Comp 83.2
% Noncomp 9.9
% Client 9.9
PAGING SPACE
Size,MB 16384
% Used 3.3
% Free 96.6
在一个使用裸设备的系统中,文件型内存,即上面的%Noncomp,%Client,只需要使用整个系统很少的内存;而把大部份的内存作为计算型内存(%Comp)来使用,这部份内存量主要为ORACLE SGA和PGA所用,其中ORACLE SGA 为pinned memory.
根据系统内存大小,设定系统可以pin住的最大值:
maxpin% = 80 --此值可以升高
v_pinshm = 1 --允许pin住内存
接下来是三个控制文件型内存的参数的值:
maxclient% = 10 --文件型内存可使用内存总的百分比的最大值,<=maxperm%
maxperm% = 10 --文件型内存可使用内存总的百分比的最大值
minperm% = 5 --文件型内存可使用内存总的百分比的最小值
这三个参数,可以根据内存总量大小,进行适度调节。计算型内存与文件型内存,在实际的应用中,需要遵循以下一些原则(前3条是参考别人的):
1.使用的文件型内存百分比 + 使用的计算型内存百分比 < 100%
2.计算型内存中的pinned memory设置要合理,即sga大小要设置合理,要留一部份给OS,OS也需要pinned memory.当系统资源紧张时,OS的pinned memory具有最高的优先级.
3.保证系统非pinned 计算型 memory有一个合理的成长空间,这部份主要是给ORACLE PGA使用,当连接数增长过快时,此内存的使用增长也相当的明显,而此增长很有可能会导致操作系统的交换。
当系统的使用的文件型内存百分比 + 使用的计算型内存百分比 >= 100%,系统便开始产生交换,系统的PAGING SPACE会持续的增长,影响到产品库的安全。
4.一般的数据库服务器,文件型内存可以使用较少的空间,因为文件型内存并不主动释放,可能造成内存资源的短缺及Paging Space使用率过高,所以数据库服务器上maxclient、maxperm、minperm的值不宜过大,典型值如下:
maxclient% = 8
maxperm% = 12
minperm% = 5
如何更改这三个参数呢, 在AIX5.3上,可以使用 vmo 命令,此命令设置或显示所有虚拟内存管理器调整参数的当前值或下一个引导值。还可以用此命令进行永久性更改,或将更改推迟到下一次重新引导之后生效。此命令是设置参数还是显示参数,要由所带标志来决定。带 -o 标志的话,两个操作都执行。它既可以显示参数的值,也可以为参数设置新值。
如果在修改这些参数前,想查看这些参数的值,则可以用下面的命令:
vmo -L 或者 vmstat -v 或者vmo -a
调整:vmo -p -o maxclient%=8
vmo -p -o maxperm%=12
vmo -p -o minperm%=5
利用-p参数,是立即生效的,不需要重启,下次重启仍然有效。
如果是-r参数,是不立即生效的,重启生效,turns on the updating of the
/etc/tunables/nextboot file.重启生效的参数记录在 /etc/tunables/nextboot。
因为参数maxperm充当的是软限制,所以文件型内存的占用率仍然可以超过maxperm的设定值,如果需要进行强制限制,则需要将参数strict_maxperm的值设为1,该参数的缺省值是0,但此方法需要谨慎使用。
备注:也许有人不是很熟悉vmo,反而熟悉vmtune,其实他们是一样的
AIX 5.3以前,查看参数值 vmtune -a
修改minperm和maxperm的值为5%和20%,vmtune -p 5 -P 20
如果是64位内核,vmtune64 -p 5 -P 20
AIX 5.3: vmo -p -o maxperm%=20
vmo -p -o minperm%=5