虚拟内存
内存在计算机中的作用很大,电脑中所有运行的程序都需要经过内存来执行,如果执行的程序很大或很多,就会导致内存消耗殆尽。为了解决这个问题,Windows中运用了虚拟内存技术,即拿出一部分硬盘空间来充当内存使用,当内存占用完时,电脑就会自动调用硬盘来充当内存,以缓解内存的紧张。举一个例子来说,如果电脑只有128MB物理内存的话,当读取一个容量为200MB的文件时,就必须要用到比较大的虚拟内存,文件被内存读取之后就会先储存到虚拟内存,等待内存把文件全部储存到虚拟内存之后,跟着就会把虚拟内里储存的文件释放到原来的安装目录里了。
允许设置的虚拟内存最小值为2MB,最大值不能超过当前硬盘的剩余空间值,同时也不能超过操作系统的内存寻址范围。
在unix系统下,交换空间就是我们常说的虚拟内存。
在AIX系统下,交换空间分配一般遵循以下原则:
# Only one paging space per disk;
# Use disks with the least activity;
# Paging spaces roughly the same size;
# Do not extend paging space to multiple physical volumes;
# Use multiple disk controllers;
# AIX交换空间常用管理命令
1.AIX查看交换空间使用情况(lsps):
用lsps -a 查看aix所有交换空间的信息
$ lsps -a
Page Space Physical Volume Volume Group Size %Used Active Auto Type
hd6 hdisk0 rootvg 16384MB 37 yes yes lv
如果上面显示的%used较高, 则可能会出现危险. 这时需要检查系统登录时间, 如果登录已经很久了, 可以考虑重启系统以轻快数据库缓存, 这样就可以释放虚拟内存.
用lsps -s查看aix交换空间的使用情况:
$ lsps -s
Total Paging Space Percent Used
16384MB 37%
2.AIX查看系统启动时激活的交换空间
#cat /etc/swapspaces
$ cat /etc/swapspaces
3.AIX创建交换空间(mkps)
AIX创建交换空间,可以用smit或mkps命令来完成,mkps命令格式如下:
mkps [-a] [-n] [-t type] -s NumLPs Vgname Pvname
Vgname 交换空间所在的卷组(volume group)名
Pvname 交换空间所在的物理卷(physical volume)名
-s NumLPs 交换空间所占用的逻辑分区(logical partition)数
-a 在下次系统启动时激活该交护岸空间 (将该交换空间加入到/etc/swapspaces文件中)
-n 立即激活该交换空间
-t type 指定交换空间类型(lv或者nfs)
也可以通过smitty mkps命令来创建:
#smitty mkps
以下命令在名字为rootvg的卷组中创建一个大小为40个逻辑分区大小的交换空间,在创建完成后立即激活该交换空间,并且在下次系统启动时激活该交换空间:
# mkps -s 40 -n -a rootvg
4.AIX激活/关闭交换空间
如果交换空间在创建时没有激活,可以使用如下命令激活:
#swapon /dev/paging00
Swap –a命令可以激活/etc/swapspaces中定义的所有交换空间,该命令一般在系统启动时自动执行。
如下命令可以使一个已经激活的交换空间变为非激活:
#swapoff /dev/paging00
5.AIX交换空间修改
AIX中可以使用chps对交换空间进行修改(也可以通过smitty chps来做)
#chps –d 1 paging00 #从交换空间paging00中删除1个LP;
#chps –s 1 paging00 #给交换空间paging00中增加1个LP;
6.AIX删除交换空间
AIX删除交换空间可以使用rmps命令(也可以使用smitty rmps)
#rmps paging00
删除一个交换空间之前,该交换空间必须是非激活状态。
7.vmstat监视分页控件的颠簸
# vmstat 2 4
System configuration: lcpu=4 mem=3824MB
kthr memory page faults cpu
----- ----------- ------------------------ ------------ -----------
r b avm fre re pi po fr sr cy in sy cs us sy id wa
0 0 479301 2384 0 0 0 0 0 0 5 1045 74 0 0 99 0
0 0 479300 2385 0 0 0 0 0 0 6 965 86 0 0 99 0
0 0 479300 2385 0 0 0 0 0 0 5 976 90 0 0 99 0
0 0 479300 2385 0 0 0 0 0 0 6 1026 79 0 0 99 0
Avm:系统使用的活动虚拟内存量(单位为4K), 不包括文件页面
Fre:空闲内存列表的大小, 一般不应该小于vmo中设置的minfree.
Pi:从交换空间调入的页面数
Po:调出到交换空间的页面数
8.svmon检查正在使用交换空间的进程
Svmon命令主要用来捕获并分析虚拟内存快照.
该命令报告进程的语法为
svmon -P [ PID1... PIDN ] [ -r [ -n | -s ] [ -w | -f | -c ] [ -t Count ] [ -u | -p | -g | -v ] [ -i Interval [ NumIntervals] ] [ -l ] [ -j ] [ -z ] [ -m ] [ -q ]
svmon命令是虚拟内存的监视命令, svmon可以用于确认某个程序, 用户, 内存段使用内存或虚存的情况. 它事实上是调用svmon back命令, 在使用svmon命令之前, 必须确定svmon back命令可用, 该命令位置为/usr/lib/perf/svmon_back
svmon在运行过程中可以被中断, 所以,它无法真正成为内存使用情况的快照. 在非常繁忙的系统中, svmon收集的数据和真实的数据有所差距, 在svmon进程搜集的过程中, vmm可能已经发生改动了.
因为svmon使用的全是vmm中的数据, 而vmm对内存的视图是基于内存段的, 所以理解svmon的输出, 必须先理解段的概念.
段是一组页的集合, 每个段为256M, 而每页为4KB的虚存, 每帧为4KB的实际内存, 每个段可以被多个进程使用, 每个段属于以下五种类型的一种.
Persistent(持久段): 存放JFS文件或目录.
Working(工作段): 存放进程数据或共享内存段.
Client(): 用于实现虚拟文件系统如NFS, CD-ROM文件系统和JFS2;
Mapping(): 用于实现文件和内存之间的映射关系.
Real memory mapping: 用于对IO空间的访问.
注意, 在段的描述中, 如果paging space使用的节中有一横(-) , 表明该段未使用交换区, working段可能使用交换区, 但persistent和client不会使用交换区.
1, 列出使用实际内存最多的三个进程.
# svmon -uP -t 3|grep -p Pid | grep '^.*[0-9]'
Pid Command Inuse Pin Pgsp Virtual 64-bit Mthrd 16MB
442460 oracle 271187 7953 179711 275344 Y N N
1155298 oracle 264700 7953 176642 272827 Y N N
323600 oracle 264684 7953 178168 274243 Y N N
PID:表示进程标识符
Command:进程正在运行的命令
Inuse:进程使用的段中的实际内存的页面总数(计算大小应乘以4092B)
Pin:固定内存: 进程使用的段中固定内存的页面总数
Pgsp:交换空间: 进程使用的段在调页空间上保留或使用的页面总数
Virtual:在进程虚拟空间中分配的页面总数
64-bit:是64位进程(Y)还是32位进程(N)
Mthrd:进程是否为多线程(Y)
16MB:进程的大页面状态. “M”表示强制性, “Y”表示进程使用或已经使用大页面段, “N”表示进程不使用大页面.
由上面的显示我们可以计算pid=442460的进程使用的实际内存为 271187*4K = 1059M
列出使用交换区最多的三个进程
svmon -gP -t 5 | grep -p Pid | grep '^.*[0-9]'
参考
1.http://www.aixchina.net/club/thread-32322-1-1.html
2.http://blog.163.com/jin1457511@126/blog/static/6369392320111010115950669/