- 论坛徽章:
- 0
|
澄清 Swap 和 Pseudoswap
澄清 Swap 和 Pseudoswap
问题描述
如何确定 pseudo swap 的 'used' 部分 - 系统如何确定哪些进程或者进程的哪些部分位于该区域内 - 相对于页面交换到设备swap中保留?
在 pseudo-swap环境中,使用和保留是什么意思-尤其是在物理内存的使用中?
系统到底在什么时候开始要 page out?
配置信息
Glance swap 空间报告屏幕:
B3692A GlancePlus C.03.20.00 Current Avg High
----------------------------------------------------------
CPU Util S SA AU U | 30% 30% 30%
Disk Util F F | 9% 9% 9%
Mem Util SSU UB B | 50% 50% 50%
Swap Util U UR R | 35% 35% 35%
---------------------------------------------------------
SWAP SPACE Users= 14
Swap Device Type Avail Used Priority
----------------------------------------------------------
/dev/vg00/lvol2 device 1.5gb 0mb 1
/dev/vg00/lvol8 device 512mb 0mb 1
pseudo-swap memory 2.8gb 552mb na
Swap Available: 4900mb
Swap Used: 552mb
Swap Util (%): 35
Reserved: 1735mb
解决方法
1) "如何确定 pseudo swap 的 'used' 部分 - 系统如何确定哪些进程或者 进程的哪些部分位于该区域内 - 相对于页面交换到设备swap中保留?"
这个问题有两个部分。
首先,与 Glance swap 空间报告中以及 swapinfo 输出中 "memory" 一行中报告的 "used" 数据有关。这只是一个计数器操作,表明我们可用于 pseudo-swap *reservation* 的数量大大减少了。它并不表示 pseudo-swap 使用的任何实际内存数量。例如 Pseudo-swap 不是内存中的 paging 区域。
请记住,按照定义 pseudo 表示 '假冒' 或 '模拟'。
在当前的环境中,pseudo-swap 不是磁盘块备份的物理 Swap 空间 (设备 swap reservation 是磁盘块备份的物理 Swap 空间)。
它不是内存,即使 swapinfo 中相关的数据表报告在 "memory" 行中。因为 pseudo-swap 不是物理 paging 区域 (磁盘上或内存中),所以不会对 pseudo-swap 进行任何 page-in 或 page-out 活动。
第二,与系统如何确定哪些是保护用于设备 swap 和 pseudo-swap 的。
Kernel 的 Swap 分配策略总是首先从真正的 Swap 中保留 (swapspc_cnt),然后才是pseudo-swap (swapmem_cnt) - 其中 swapspc_cnt 和 swapmem_cnt 为用于跟踪一些内容的内部计数器。
查看 swapinfo 输出中的 memory (pseudo-swap) 和 reserve (device/filesystem swap) 行,下面的内容讲述了这些内部计数器是如何使用的。
最初,swapmem_cnt 设置的值与 swapmem_max 相同,其中 swapmem_max counter 在引导时设置为系统上物理内存的 7/8。
请记住这些数字只与 "pseudo"-swap 的数字相关。
Mb Mb Mb PCT START/ Mb
TYPE AVAIL USED FREE USED LIMIT RESERVE PRI NAME
memory 15 10 5 67%
| | | |
| | | |__(USED*100) / swapmem_max
| | |
| | |____ swapmem_cnt
| |
| |____ swapmem_max - swapmem_cnt
|
|____ swapmem_max
reserve 1127424 1118110 --1048576
| | |
| | |____ pages_alloc
| |
| |____ swapspc_cnt
|
|____ swapspc_max
swapmem_cnt 计数器可能会由于下列两个原因而递减:
- 如果 Kernel 为自己分配物理内存,或者内存页被 locked/plocked
(pseudo-swap 和可锁定内存之间存在某种关系)。
- 如果没有足够的真正 [device/filesystem] swap (swapspc_cnt),并且我们现在要真正从 swapmem_cnt 保留。一个类似 pseudo-swap 的纯粹的计数器不是由任何物理磁盘块 (或内存) 组成的。
在上面的两种情况下,"used" 一词表示了不同的含义。在第一个情况下,它表示 "不再可用于 swap 保留"。在第二种情况下,它表示 "已被pseudo-swap保留"。
在上面的示例输出中的 'CONFIGURATION' 区域,因为 reserve 一行表明没有保留所有的已配置设备 Swap,552Mb used 表示swapmem_cnt 计数器已经减小,反映出分配的内核物理内存或被锁定的内存页面(比如共享内存段)已经被用户应用程序锁定在内存中.
如果您需要有关如何考虑系统上内存使用情况的信息,您的开发人员/供应商则了解有关它们应用程序的共享内存使用情况以及被锁定的数量。
如果您对 Kernel 内存使用情况感兴趣,则存在用来显示这种信息的工具。
2) "在 pseudo-swap环境中,使用和保留是什么意思-尤其是在物理内存的使用中?"。
"used" 一词实际上是 pseudo-swap 用词不当。它并不表示真正用于设备 Swap 的 "used" 内容,它也不表示 pseudo-swap 已经使用了一些内存。
对于设备 Swap,它表示已分配的磁盘块。保留的设备 Swap 只是为了保证系统存在内存压力时具有 Swap 空间。该数字不等于将要 page out 到磁盘的页数。实际上 vhand 进程会根据内部参数决定哪些页以及多少页会 page out 到磁盘 (下面对于第三个问题的回答中有详细说明)。
在 pseudo-swap环境中,used 和 reserved 表示相同的意思。
pseudo-swap 的 "used" 字段的一个更加精确的解释可能是不能用于 pseudo-swap reservation 的数量。它不表示 pseudo-swap 使用的真正内存、虚拟或者物理内存的任何数量。
相关的 swapinfo 示例输出如下所示:
root@server1:/users/root $ swapinfo -tm
Mb Mb Mb PCT START/ Mb
TYPE AVAIL USED FREE USED LIMIT RESERVE PRI NAME
dev 1528 0 1528 0% 0 - 1 /dev/vg00/lvol2
dev 512 0 512 0% 0 - 1 /dev/vg00/lvol8
reserve - 1205 -1205
memory 2860 552 2308 19%
total 4900 1757 3143 36% - 0 -
总共有 4900 Mb 可用于 swap reservation,其中真正的
swap (swapspc_cnt)= 2040 Mb (1528 + 512),
pseudo-swap (swapmem_cnt) = 2860。
设备 Swap 的 "USED" 列显示没有任何 paging 活动,因为没有使用任何磁盘块。
pseudo-swap 的 552 Mb "USED" 数据 ("memory") 表示 Kernel 已经分配了这么多的动态内存用于某些用途,或者已经锁定了这些内存页。因此这个数字不再可用于 swap reservation,swapmem_cnt 计数器也会相应递减。
它在这个意义上是 "used" ... 但是此处的 "used" 一词并不表示内存页已经 page out。只是表示可用于 swap reservation 的数量减少了。
"FREE" 一列基本是 AVAILable 的数量减去 USED 的数量。
"reserve" 一行显示了有多少内存已保留。换句话说,"reserve" 一行显示了从 swap 计数器 (swapspc_cnt) 减少了多少数量。请注意,我们总是在 pseudo-swap 计数器之前首先从真正的 swap 计数器进行保留的。
3) "系统到底在什么时候开始要 page out?"
下面的信息是基于文档 WP1030009A 中的信息的,该文档标题为
"HP-UX Memory Management White Paper, Part I",位于
http://itrc.hp.com 上的知识库中。
影响 paging 阈值的内核参数
# echo maxfree/D | adb /stand/vmunix /dev/kmem
# echo desfree/D | adb /stand/vmunix /dev/kmem
# echo minfree/D | adb /stand/vmunix /dev/kmem
# echo gpgslim/D | adb /stand/vmunix /dev/kmem
可用页列表中的页数是由 statdaemon 每秒钟检查一次的。
当可用页列表低于 lotsfree 设置的值时,vhand 就会开始 对页进行 aging。
一个过期的页面将会被设置ref bit然后关闭-表示它要从 TLB 清除。如果在下一次中该页的 ref bit 仍然保持了设置状态,则该页可能被stolen。
当可用页列表低于 gpgslim 设置的值时,vhand 就会开始 steal 页。
当可用页列表低于 desfree 和 minfree 设置的值时,vhand 就会变得更大。当可用页列表低于 minfree 设置的值时,swapper 则会 wake up。
desfree: 在一个内存较小的系统上 (系统初始化之后为 32 Mbytes 可用内存或更少),desfree 设置为了非 Kernel 内存的 1/16,而且不会超过 60 页 (240 Kbytes)。在一个内存较大的系统上 (系统初始化之后多于 32 Mbyte 可用内存),desfree 设置为了非 Kernel 内存的 1/64,而且不会超过 1024 页 (4MB)。如果非 Kernel 内存超过了 2Gb,desfree 则设置为 3072 页 (12 Mbyte)。
lotsfree: 在一个系统初始化之后为 32 Mbytes 可用内存或更少的系统上,lotsfree 设置为了非 Kernel 内存的 1/8,而且不会超过 256 页(1Mbytes)。在一个系统初始化之后多于 32 Mbyte 可用内存的系统上, lotsfree 设置为了非 Kernel 内存的 1/16,而且不会超过 8192 页 (32MB)。如果非 Kernel 内存超过了 2Gb,lotsfree 则设置为 16384 页 (64 Mbyte)。
minfree: 在一个内存较小的系统上 (系统初始化之后为 32 Mbytes 可用内存或更少),minfree 设置为了 desfree 的 ?,而且不会超过 25 页 (100 Kbytes)。在一个内存较大的系统上 (系统初始化之后多于 32 Mbyte 可用内存),minfree 设置为了 desfree 的 ?,而且不会超过 256 页 (1MB)。如果非 Kernel 内存超过了 2Gb,minfree 则设置为 1280 页 (5 Mbyte)。
通常情况下,page reclaim 是正常的。它基本上表示系统不必转入磁盘来执行 I/O。它而是会发现 Kernel 页缓存中与磁盘块相关的页,并且会保存一个 I/O 操作。
page reclaim 和 page out 值都与虚拟内存 paging 活动相关。但是 reclaim 值可能反映的是内存压力情况下 page out 到磁盘的内存,它们可能还包括内存映射文件的活动 - 即,内存映射文件的 I/O 被视为 paging I/O。
假设一个内存页用于内存映射文件,则该内存映射文件是非映射的。
该页将被链接到可用页池,但仍然会包含有效数据。如果在页分配用于其他目的之前,有些应用程序请求这些磁盘数据,则无需磁盘 I/O,因为该页仍然位于内存中。
该页将从可用列表中提取 - page reclaim 将会在 vmstat 中得到反映 (如果此时正在运行的话)。
因此,在这个没有明显的内存压力,但是 vmstat 反映了 page reclaim 的示例系统环境中,可能应该对应用程序 IO 活动进行进一步研究。
这些磁盘活动的 Glance(1) 和 sar(1M) 输出信息可能有所帮助。
[ 本帖最后由 sunyone 于 2006-4-26 16:19 编辑 ] |
|