2.2 使用vmo命令检查AIX如何处理分页空间分配... 4
AIX的内存页面大小为4K, 是虚拟内存管理(VMM)的最小单位. 页面空间也可以被称为交换空间(paging space), 创建在属性类型为paging的逻辑卷(logic volume LV)上. 交换空间是一项很重要的设备. AIX kernel需要利用paging space来管理虚拟内存. 系统安装时创建的默认页面LV是hdisk0上的hd6, 也叫主交换空间.
AIX5L默认采用交换空间的延迟分配策略(deferred page space allocation), 利用环境变量psalloc来控制内存的机制与页面的分配策略, 缺省设置是late. 在这种设置下, 知识需要用到的时候, 才去分配交换空间, 正常情况下, 不需要很大的交换空间, 所以适合大内存的系统, 可以减少很多paging space资源的浪费.
内存在计算机中的作用很大,电脑中所有运行的程序都需要经过内存来执行,如果执行的程序很大或很多,就会导致内存消耗殆尽。为了解决这个问题,Windows中运用了虚拟内存技术,即拿出一部分硬盘空间来充当内存使用,当内存占用完时,电脑就会自动调用硬盘来充当内存,以缓解内存的紧张。举一个例子来说,如果电脑只有128MB物理内存的话,当读取一个容量为200MB的文件时,就必须要用到比较大的虚拟内存,文件被内存读取之后就会先储存到虚拟内存,等待内存把文件全部储存到虚拟内存之后,跟着就会把虚拟内里储存的文件释放到原来的安装目录里了。
允许设置的虚拟内存最小值为2MB,最大值不能超过当前硬盘的剩余空间值,同时也不能超过操作系统的内存寻址范围。
VMM服务于来自系统以及应用程序的内存请求. 虚拟内存段以页为单位进行分区, 每个页面大小为4KB.VMM就是用来管理这些存储页面.
1, 实际内存管理
在AIX中,虚拟内存段被分成4096字节大小的页,物理内存则被划分为4096字节大小的页帧(page frame),VMM主要有以下两个主要功能:
(1) 管理页帧的分配
(2) 解析对当前没有调入RAM中的虚拟内存页的引用
为了完成上述功能,VMM维护一个可用帧列表,并且使用一个页面替换算法决定哪些当前在RAM中的虚拟内存页使用的页帧将被分配到可以可用帧列表。页面替换算法将考虑永久段(Persistent segment)和工作段(Working segment)的分配、页交换和VMM阈值等因素。
2, 永久段(Persistent segment)和工作段(Working segment)
AIX 区分不同的存储段类型。理解不同的存储段类型,特别是工作段和永久段的区别非常重要。
永久段在磁盘上有一个永久的存储位置。含有不可编辑数据的文件或者只读的运行程序被映射到持久段。VMM 参数控制什么时候分配给永久段的RAM页帧可以被重写,并且用于存储新的数据。
工作段是临时性的,仅在它们被某个进程使用的时候存在,并且没有固定的磁盘位置。进程堆栈以及数据区,共享库文本被映射到工作段。当工作段数据也不能存在于“实”存中的时候,他们被保存在磁盘上的页交换空间。程序退出执行,所有工作段占用的页面被返回。
3, VMM 内存调用控制机制
当一个进程引用一个在磁盘上的虚拟内存页,被引用的页先要换到页帧中,如果内存已经满了,这可能导致一个或更多的页从页帧中换出,以腾出空间。这种情况一般发生在可用页帧数已经很低的情况。而VMM将使用前述页交换算法来满足系统对内存的需要。
一个有效的页交换算法要保持当前活动进程所使用的页总是在RAM中,而非活动进程使用的存储页将被移出。但是当RAM不足的时候,选择移出页将很困难,因为被移出的页可能很快又要被引用,这导致一些页面被频繁的换入换出。系统大部分时间在做页交换而不是执行进程指令。VMM使用存储器调用控制算法来检测这种情况,并予以纠正。
什么是交换(分页)空间?它是与 VMM 有关的。VMM 使用交换(分页)空间存储没有使用活动RAM 的进程。分页空间本身是一个特殊的逻辑卷,它存储了当前不访问的信息。您必须确保您的系统拥有足够的分页空间。如果分页空间过小,整个进程可能会丢失,并且当所有的空间都占满后,系统可能会崩溃。尽管值得再次说明,分页空间是 VMM 中的一部分,但是更重要的是真正地理解内核如何将进程调入到 RAM 中,过多的分页肯定会对性能造成影响。AIX 通过将内核与 VMM 紧密集成在一起,实现了一种称为请求分页的方法。
在这个部分中,我介绍了 AIX 如何处理分页,给出了交换和分页的定义,并深入地研究了分页空间分配的几种不同模式。这些概念可以帮助您理解后续有关监视、配置和优化的部分。
大多数管理员都认为分页是一件很麻烦的事情。实际上,分页是 AIX 所完成的任务中非常必要的一部分,这是由于 AIX 内核与 VMM 及其请求分页的实现进行了紧密的集成。请求分页的工作原理是,内核一次仅加载部分页面到实际内存中。当 CPU 需要另一个页面时,它会到 RAM 中查找。如果无法在 RAM 中找到这个页面,则出现一次缺页,然后向内核发出信号以便从磁盘中加载更多的页面到 RAM。请求分页的一个优点是,分页空间不需要非常大,因为数据总是在分页空间和 RAM 之间不断地交换。在较早的 UNIX® 系统中,将分页预先分配到磁盘,无论使用还是不使用它们。这使得所分配的磁盘空间可能永远不会被使用。从本质上说,请求分页可以避免盲目地分配磁盘空间。应该使得进程的交换最少,因为许多任务可能存储在 RAM 中。的确如此,因为进程(页面)只有一部分存储在 RAM 中。
交换指的是什么呢?尽管分页和交换通常可以互换使用,但它们之间存在细微的区别。如前所述,在进行分页时,进程的部分内容将在磁盘和 RAM 之间来回移动。当发生交换时,会将整个进程来回移动。为了支持这种情况,在将进程移动到分页空间之前,AIX 会挂起整个进程。只有在将进程交换回 RAM 之后,才能够继续执行它。出现这样的情况并不是很好,您应该尽量防止交换的发生,交换可能会导致另一种称为颠簸的情况(稍后将介绍这个内容)发生。
Lsps主要用来显示调页空间的特征.
lsps { -s | [ -c | -l ] { -a | -t { lv | nfs } | PagingSpace } }
1, -a, 指定要给出的所有调页空间的特征.
# lsps -a
Page Space Physical Volume Volume Group Size %Used Active Auto Type
hd6 hdisk0 rootvg 8192MB 13 yes yes lv
2, -c, 指定输出应该使用冒号格式. 在逻辑分区中以冒号格式给出调页空间大小
# lsps -c -a
#Psname:Pvname:Vgname:Size:Used:Active:Auto:Type
hd6:hdisk0:rootvg:32:13:y:y:lv
3, -l, 指定输出应该使用表格式
4, 指定要给出的所有调页空间的概要特征. 如果指定-s标记, 忽略所有其他标记
# lsps -as
Total Paging Space Percent Used
8192MB 13%
# vmo -a | grep def
defps = 1
vmo命令用来管理虚拟内存管理器可调参数. –a显示所有可调参数的当前, 重新引导或永久值.
上述显示defps=1说明使用了这种缺省的方法(延迟的页面空间分配)。要禁用这个策略,您需要将参数设置为 0。这将使得系统使用晚分页空间分配策略。晚分页空间分配策略会在 RAM 中相应的页面被修改时才分配分页磁盘块。这种方法通常用于那些性能比可靠性更加重要的环境。在本文所介绍的场景中,程序可能会因为缺少内存而运行失败。那么早页面空间分配又如何呢?如果您希望确保进程不会因为较低的分页情况而终止,通常可以使用这种策略。早页面空间分配策略可以预先分配分页空间。这是与晚分页空间分配策略截然相反的。对于可靠性要求很高的环境,可以使用这种策略。启用这种策略的方法是将 PSALLOC 环境变量设置为 early (PSALLOC=early)
# 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 |
调出到交换空间的页面数 |
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
Pid Command Inuse Pin Pgsp Virtual 64-bit Mthrd 16MB
1155298 oracle 264700 7953 176642 272827 Y N N
Pid Command Inuse Pin Pgsp Virtual 64-bit Mthrd 16MB
323600 oracle 264684 7953 178168 274243 Y N N
由上面的显示我们可以计算pid=442460的进程使用的实际内存为 271187*4K = 1059M
栏 |
说明 |
PID |
表示进程标识符 |
Command |
进程正在运行的命令 |
Inuse |
进程使用的段中的实际内存的页面总数(计算大小应乘以4092B) |
Pin |
固定内存: 进程使用的段中固定内存的页面总数 |
Pgsp |
交换空间: 进程使用的段在调页空间上保留或使用的页面总数 |
Virtual |
在进程虚拟空间中分配的页面总数 |
64-bit |
是64位进程(Y)还是32位进程(N) |
Mthrd |
进程是否为多线程(Y) |
16MB |
进程的大页面状态. “M”表示强制性, “Y”表示进程使用或已经使用大页面段, “N”表示进程不使用大页面. |
2, 列出使用交换区最多的三个进程
svmon -gP -t 5 | grep -p Pid | grep '^.*[0-9]'
Pid Command Inuse Pin Pgsp Virtual 64-bit Mthrd 16MB
462924 oracle 264568 7953 188139 283991 Y N N
Pid Command Inuse Pin Pgsp Virtual 64-bit Mthrd 16MB
442460 oracle 271480 7953 179707 275342 Y N N
Pid Command Inuse Pin Pgsp Virtual 64-bit Mthrd 16MB
323600 oracle 264804 7953 178164 274241 Y N N
Pid Command Inuse Pin Pgsp Virtual 64-bit Mthrd 16MB
1179830 oracle 251210 7953 177081 272633 Y N N
Pid Command Inuse Pin Pgsp Virtual 64-bit Mthrd 16MB
299146 oracle 251246 7953 177065 272687 Y N N
由上面的显示计算出, 使用交换空间最大的进程用到的交换区间大小为 188139 * 4092 = 734 MB
3, 查看进程462924使用了哪些文件
# svmon -pP 462924
-------------------------------------------------------------------------------
Pid Command Inuse Pin Pgsp Virtual 64-bit Mthrd 16MB
462924 oracle 264566 7953 188139 283989 Y N N
Vsid Esid Type Description PSize Inuse Pin Pgsp Virtual
0 0 work kernel segment s 8068 7931 3849 12181
40a54 f00000002 work process private s 27 22 3 29
6cabf 8fffffff work private load data s 0 0 36 36
18026 9ffffffe work shared library s 13 0 14 14
30a0 90000000 work shared library text s 1062 0 68 2759
1c843 - clnt /dev/fslv03:92 s 2 0 - -
84a6 - clnt /dev/fslv01:76408 s 0 0 - -
18482 - clnt /dev/fslv01:143871 s 2 0 - -
204ac - clnt /dev/fslv01:76409 s 0 0 - -
4525 70000003 work default shmat/mmap s 0 0 0 0
244ad - clnt /dev/fslv03:76 s 6 0 - -
184e2 70000005 work default shmat/mmap s 38968 0 21088 40950
8926 - clnt /dev/fslv03:88 s 2 0 - -
c527 - clnt /dev/fslv01:191039 s 0 0 - -
50830 - clnt /dev/fslv03:78 s 2 0 - -
344a9 70000007 work default shmat/mmap s 39557 0 25293 45057
10540 - clnt /dev/fslv03:75 s 2 0 - -
44475 - clnt /dev/fslv03:91 s 635 0 - -
8566 - clnt /dev/fslv03:87 s 528 0 - -
14941 - clnt /dev/fslv03:85 s 2 0 - -
3c4ab - clnt /dev/fslv03:77 s 0 0 - -
408b4 - clnt /dev/fslv03:81 s 2 0 - -
444b5 - clnt /dev/fslv03:71 s 36 0 - -
4c497 - clnt /dev/fslv01:191040 s 0 0 - -
30508 70000006 work default shmat/mmap s 62488 0 34002 65520
484b6 - clnt /dev/fslv03:70 s 36 0 - -
30748 - clnt /dev/fslv03:79 s 6 0 - -
34509 70000008 work default shmat/mmap s 57007 0 54623 59208
3ca6b 11 work text data BSS heap s 318 0 12706 13052
4c4b7 - clnt /dev/fslv03:69 s 60 0 - -
404f4 - clnt /dev/fslv03:68 s 2 0 - -
7881a - clnt /dev/fslv03:80 s 6 0 - -
4c4d7 - clnt /dev/fslv03:66 s 8802 0 - -
3852a - clnt /dev/fslv01:76412 s 0 0 - -
40514 70000002 work default shmat/mmap s 0 0 0 0
484f6 - clnt /dev/fslv03:67 s 600 0 - -
6049c 10 clnt text data BSS heap, s 8518 0 - -
/dev/fslv01:73964
70478 - clnt /dev/fslv03:84 s 2 0 - -
604bc - clnt /dev/fslv03:86 s 2 0 - -
8226 9fffffff clnt USLA text,/dev/hd2:2165 s 9 0 - -
48536 80020014 work USLA heap s 0 0 104 104
70498 - clnt /dev/fslv01:190026 s 0 0 - -
3c56b - clnt /dev/fslv03:89 s 6 0 - -
684be 70000009 work default shmat/mmap s 31632 0 33846 38930
7c47b - clnt /dev/fslv03:82 s 1370 0 - -
784ba - clnt /dev/fslv03:90 s 2 0 - -
54951 9001000a work shared library data s 18 0 48 89
744d9 - clnt /dev/fslv03:65 s 980 0 - -
50570 - clnt /dev/fslv03:83 s 0 0 - -
c687 70000000 mmap maps 1 source(s) s 0 0 - -
6851e 70000004 work default shmat/mmap s 0 0 0 0
20a4c 8001000a work private load data s 1 0 146 146
3822a 90020014 work shared library s 58 0 95 96
34a49 70000001 work default shmat/mmap s 3580 0 553 4076
48a16 ffffffff work application stack s 8 0 6 14
4001 9ffffffd work shared library s 141 0 1659 1728
栏 |
说明 |
VSid |
虚拟段标识符, 在VMM中的唯一段 |
Esid |
有效的段标识符, 只有在段属于进程空间时才有效. 如果vsid段被几个进程映射, 但具有不同的sid值, 那么该字段包含”-“. |
Type |
段的类型 |
Description |
段的文本描述, 列的内容取决于段的类型和用途 |
Psize |
表示该段是否使用大页面 |
Inuse |
段中的实际内存页数 |
Pin |
段中的固定内存页数 |
Pgsp |
该段在调页空间上的页数 |
Virtual |
分配给段的虚拟空间的页数 |
1, 使用swap命令查看交换磁盘空间信息
# swap -l
device maj,min total free
/dev/hd6 10, 2 8192MB 7166MB
结果说明, 系统中定义了一个交换分区. 分区使用了8192-7166=1026MB的空间.
2, 检查当前交换空间剩余情况
# lsps -a
Page Space Physical Volume Volume Group Size %Used Active Auto Type
hd6 hdisk0 rootvg 8192MB 13 yes yes lv
如果上面显示的%used较高, 则可能会出现危险. 这时需要检查系统登录时间, 如果登录已经很久了, 可以考虑重启系统以轻快数据库缓存, 这样就可以释放虚拟内存.
3, uptime检查系统启动时间
# uptime
05:28PM up 181 days, 16:15, 1 user, load average: 0.00, 0.00, 0.00
可以通过如下命令创建一个交换空间
#mkps -s’16′ -n -a datavg hdisk2
其中-s表示pp个数,-n表示启动后是否自动激活,-a表示是否当时激活。
可以采用如下命令改变交换空间大小
新增加10个pp
#chps -s’10′ paging00
减少10个pp
#chps -d’10′ paging00
shrinkps: Temporary paging space paging01 created.
shrinkps: Paging space paging00 removed.
shrinkps: Paging space paging00 recreated with new size.
对于5L以上的版本,可以直接用chps -d来操作hd6
#chps -d’10′ hd6
shrinkps: Temporary paging space paging00 created.
shrinkps: New boot image created with temporary paging space.
shrinkps: Paging space hd6 removed.
shrinkps: Paging space hd6 recreated with new size.
shrinkps: New boot image created with resized paging space.
如果要使交换空间处于非活动状态,可以采用
#swapoff /dev/’paging00′
相反,处于活动状态可以采用
#swapon /dev/’paging00′
如果要删除一个ps交换空间,必须先使这个空间处于非活动状态,然后采用命令rmps删除。如
#rmps ‘paging00′
rmlv: Logical volume paging00 is removed.
系统究竟需要多大的交换空间?
首先, 我们认为将分页空间的大小设置为RAM的两倍(以前的基本原则). 通常来说, 如果我的系统拥有超过4GB的内存, 我会按照RAM的大小来创建分页空间.在投入运行之后, 要经常监视系统, 如果看到分页空间的利用率从来都没有接近过百分之五十, 就不需要添加额外的空间. Oracle为AIX提供的文档推荐设置交换空间为RAM大小的一半加上4GB, 但是上限为32GB.