2.2 使用vmo命令检查AIX如何处理分页空间分配... 4
AIX交换空间管理与查看
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资源的浪费.
一, 交换磁盘空间概念
1.1 虚拟内存
内存在计算机中的作用很大,电脑中所有运行的程序都需要经过内存来执行,如果执行的程序很大或很多,就会导致内存消耗殆尽。为了解决这个问题,Windows中运用了虚拟内存技术,即拿出一部分硬盘空间来充当内存使用,当内存占用完时,电脑就会自动调用硬盘来充当内存,以缓解内存的紧张。举一个例子来说,如果电脑只有128MB物理内存的话,当读取一个容量为200MB的文件时,就必须要用到比较大的虚拟内存,文件被内存读取之后就会先储存到虚拟内存,等待内存把文件全部储存到虚拟内存之后,跟着就会把虚拟内里储存的文件释放到原来的安装目录里了。
允许设置的虚拟内存最小值为2MB,最大值不能超过当前硬盘的剩余空间值,同时也不能超过操作系统的内存寻址范围。
1.2 虚拟内存管理器(VMM)
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使用存储器调用控制算法来检测这种情况,并予以纠正。
1.3 交换(分页)空间概念
什么是交换(分页)空间?它是与 VMM 有关的。VMM 使用交换(分页)空间存储没有使用活动RAM 的进程。分页空间本身是一个特殊的逻辑卷,它存储了当前不访问的信息。您必须确保您的系统拥有足够的分页空间。如果分页空间过小,整个进程可能会丢失,并且当所有的空间都占满后,系统可能会崩溃。尽管值得再次说明,分页空间是 VMM 中的一部分,但是更重要的是真正地理解内核如何将进程调入到 RAM 中,过多的分页肯定会对性能造成影响。AIX 通过将内核与 VMM 紧密集成在一起,实现了一种称为请求分页的方法。
1.4请求分页
在这个部分中,我介绍了 AIX 如何处理分页,给出了交换和分页的定义,并深入地研究了分页空间分配的几种不同模式。这些概念可以帮助您理解后续有关监视、配置和优化的部分。
大多数管理员都认为分页是一件很麻烦的事情。实际上,分页是 AIX 所完成的任务中非常必要的一部分,这是由于 AIX 内核与 VMM 及其请求分页的实现进行了紧密的集成。请求分页的工作原理是,内核一次仅加载部分页面到实际内存中。当 CPU 需要另一个页面时,它会到 RAM 中查找。如果无法在 RAM 中找到这个页面,则出现一次缺页,然后向内核发出信号以便从磁盘中加载更多的页面到 RAM。请求分页的一个优点是,分页空间不需要非常大,因为数据总是在分页空间和 RAM 之间不断地交换。在较早的 UNIX® 系统中,将分页预先分配到磁盘,无论使用还是不使用它们。这使得所分配的磁盘空间可能永远不会被使用。从本质上说,请求分页可以避免盲目地分配磁盘空间。应该使得进程的交换最少,因为许多任务可能存储在 RAM 中。的确如此,因为进程(页面)只有一部分存储在 RAM 中。
交换指的是什么呢?尽管分页和交换通常可以互换使用,但它们之间存在细微的区别。如前所述,在进行分页时,进程的部分内容将在磁盘和 RAM 之间来回移动。当发生交换时,会将整个进程来回移动。为了支持这种情况,在将进程移动到分页空间之前,AIX 会挂起整个进程。只有在将进程交换回 RAM 之后,才能够继续执行它。出现这样的情况并不是很好,您应该尽量防止交换的发生,交换可能会导致另一种称为颠簸的情况(稍后将介绍这个内容)发生。
二, 查看交换磁盘空间
2.1 lsps命令
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%
2.2 使用vmo命令检查AIX如何处理分页空间分配
# vmo -a | grep def
defps = 1
vmo命令用来管理虚拟内存管理器可调参数. –a显示所有可调参数的当前, 重新引导或永久值.
上述显示defps=1说明使用了这种缺省的方法(延迟的页面空间分配)。要禁用这个策略,您需要将参数设置为 0。这将使得系统使用晚分页空间分配策略。晚分页空间分配策略会在 RAM 中相应的页面被修改时才分配分页磁盘块。这种方法通常用于那些性能比可靠性更加重要的环境。在本文所介绍的场景中,程序可能会因为缺少内存而运行失败。那么早页面空间分配又如何呢?如果您希望确保进程不会因为较低的分页情况而终止,通常可以使用这种策略。早页面空间分配策略可以预先分配分页空间。这是与晚分页空间分配策略截然相反的。对于可靠性要求很高的环境,可以使用这种策略。启用这种策略的方法是将 PSALLOC 环境变量设置为 early (PSALLOC=early)
2.3 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 |
调出到交换空间的页面数 |
2.4 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
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 |
分配给段的虚拟空间的页数 |
2.5 交换空间检查实例
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.