迷彩 潜伏 隐蔽 伪装
分类:
2012-11-08 11:19:03
原文地址:swap与Pseudo swap 作者:风之幻想
与其他版本的 Unix 一样,HP-UX 也使用 Virtual Memory 将进程加载到内存中。简单来讲,Virtual Memory 由两部分组成,物理内存,即 RAM 和 swap。物理内存是程序运行所在的位置,swap 是 "交换"。Swap 设备通常属于物理硬件驱动器。 Swap 允许进程的总数超过物理 RAM 的数量,而且可以根据需要进行分配。
产生 (Spawn) 进程时,Kernel 将检查虚拟内存,看看该进程是否可以直接加载到物理内存中。该 Kernel 还会进行检查,以确保该进程能够节省 swap 区域中的空间。如果两个测试均失败,该进程则不会产生,将被终止。生成的错误消息为 malloc 或 fork 失败。所有进程都必须能够节省 swap 区域中的空间。要保留足够的可用物理内存,以便进程运行,有一个被称为 vhand 的 daemon 会扫描 Kernel 中的所有进程表,查找尚未使用过的数据页。如果 vhand 发现了任何 "非活动" 页,vhand 就会将这些页移动到 swap 区域。如果可用内存下降至太低,另一个被称为 swapper 的 daemon 则会删除或 swap 出整个进程。Swapper 将继续将进程从物理内存推入 swap 区域,直到可用内存增加。当系统进行 swap 时,该 swapper 进程非常活跃。在 HP-UX 10.x 及以上版本中,不会 swap 出整个进程,而只是 swap 部分进程。Swap 的部分进程称为已分页。
如果系统上没有配置足够的 swap,系统性能则可能会受到很大的影响。有些影响是,系统可能无法访问系统上安装的所有物理内存。只有在 Swap 区域的可用空间多到可用于进程的情况下,Kernel 才允许产生进程。应用程序也依赖于 swap,如果没有配置足够的 swap,则生成与内存相关的错误消息,如 malloc 或 fork 失败。如果系统无须将进程从物理内存 swap 到 swap 区域,则将执行附加磁盘 I/O。该 Kernel 还将使用附加资源来监视内存并处理进程到 swap 设备的移动。这种附加开销将降低系统性能。如果这一问题非常严重,系统则可使用所有 CPU 或进程管理的其他资源。一旦系统达到此状态,则称为 Thrashing。
您至少应该将 Swap 和物理内存的比例配置为 1:1。这是一个基础比例,允许您访问整个物理 RAM,并处理大多数操作系统的 swap 需求。但是,您安装的应用程序可能需要配置更多 swap。您应该与供应商或提供商联系,获得更多有关 swap 的建议。一般系统上的物理内存数量不会是 swap 数量的四倍。
用于 swap 的磁盘区或者 logical volume 称为设备 swap。默认情况下,安装了操作系统的情况下 (/dev/vg00/lvol2),系统至少会配置一个区域的设备 swap。设备 swap 就是一个 logical volume 或者一个磁盘区,是为系统提供用于 swap 的。类似 bdf 的命令不会显示系统上的 swap,但是 swapinfo 命令会显示。设备 swap 可以配置在系统上的任意 volume group 上。涉及到性能问题时,最提倡使用 logical volume,当系统需要附加 swap 时应首先配置 logical volume。设备 swap 也包括两个术语,第一个是主 swap。此 swap 设备应为 /dev/vg00/lvol2,是在安装操作系统时创建的。主 swap 只能位于引导驱动器上。任何附加设备 swap 都称为次 swap。次 swap 设备可以配置在任何 volume group 上。
文件系统 swap 使系统管理员能够在所有磁盘空间均已分配给文件系统的情况下,向系统添加更多的 swap。使用文件系统 swap,您可以设置和配置文件系统中可用的空间。当您分配文件系统 swap 时,该系统会创建一个目录,称为 paging,并会在该 paging 目录中创建 swap 文件。当且仅当系统开始向该 swap 区域进行 swap 时,系统才会执行到这些文件的写入。系统性能将会因维护文件系统 swap 而受到影响。这是因为,操作系统已经从物理内存删除了页,然后将其以小块的形式写入文件。如果系统只需要文件系统 swap 用于保留空间,系统的性能就不会受到影响。文件系统 swap 应该仅用作 swap 问题的临时解决方案。一旦向系统中添加了附加驱动器,文件系统 swap 就应尽快删除。由于性能方面的原因,我们建议将文件系统 swap 区域的优先级设成高于设备 swap。
Pseudo swap 是该规则的例外。Pseudo swap 可使系统管理员利用具有较大物理 ram 的系统,而无须配置较大的 swap 区域。Pseudo swap 不是设备 swap 的替代品,而是 swap 的增强。当系统引导时,会计算 pseudo swap 的数量。此计算是 75% 的物理内存,此值是不可调整内核参数。该 Kernel 会此增强看作是产生新进程时可以分配的附加 swap 区域。系统只会将 pseudo swap 用作保留空间,而不会将进程分页进出 pseudo swap。如果进程需要分页出物理内存,Kernel 则会 swap 到设备或文件系统 swap。Pseudo swap 默认情况下处于打开状态,将内核参数 swapmem_on 改为 off,即可关闭。
下面是使用 pseudo swap 的优点示例。假设我们有一个系统,它有 1GB 的物理 RAM。要使操作系统能够使用所有内存,操作系统至少需要 1GB 的 swap。系统管理员为 swap 配置了 1GB 的 logical volume。另外,系统管理员还保持 pseudo swap 处于启用状态。当系统引导时,它会将 75% 的物理内存配置成 pseudo swap。我们大约有 750 (1000 * .75)M 的附加 swap 用于该系统。现在系统的 swap 总数为 1.75GB,或 2.75GB 的虚拟内存。Pseudo swap 不会增大 swap 的总数。Kernel 会将该系统视为具有 1.75 GB 的 swap,并将按照系统配置了 1.75GB 设备 swap 的方式使用 swap。但是,只配置了 1GB 的设备 swap。
由于 pseudo swap 会增加系统上的 swap 总数,所以有些系统管理员可能想减少设备 swap 的数量,并将该空间用于数据。在有些情况下,系统管理员可以执行此操作。此外,系统管理员还需要规划转储空间。此转储空间用于系统写入系统崩溃。默认情况下,主 swap (/dev/vg00/lvol2) 既用于 swap 也用于转储。在 10.X 系统上,系统管理员必须将 root volume group,即 /dev/vg00 上的设备 swap 和物理内存比例配置成至少 1:1。这样即能满足操作系统的最小 swap 和转储需求。在 11.0 及以上版本中,不再需要将 swap/转储空间与物理内存的比例配置为 1:1。配置系统崩溃只是为了节省确定系统崩溃的根本原因所需的部分。这非常容易,因为文件系统很少会配置 16GB 的 RAM。要在 11.X 上配置正确数量的转储空间,请参阅 crashconf(1m) 的 Manpage。
到目前为止,用于监视 10.X 和 11.X 系统上 swap 的最简单的命令是 swapinfo。使用一个命令,系统管理员即可看到配置了多少 swap,有多少 swap 是用于进程的,甚至有多少 swap 正处于活动状态,且可用于 swap 的进程。下面是一个示例:
#swapinfo -tam
Mb Mb Mb PCT START/ Mb
TYPE AVAIL USED FREE USED LIMIT RESERVE PRI NAME
dev 128 10 118 8% 0 - 1 /dev/vg00/lvol2
localfs 60 0 60 0% 60 0 4 /var/paging
reserve - 52 -52
memory 91 68 23 75%
total 279 130 149 47% - 0 -
此输出显示了此系统上配置的设备 swap(dev)、文件系统 swap(localfs) 和 pseudo swap(memory)。我要指出的第一个点是 total 行。从左到右,您可以快速了解系统上正在如何执行 swap。在 Mb Avail 列下面,它显示此系统总共配置了 279M 的 swap。在配置的 279M 中,130M 正在使用。我的意思是说,如果 swap 用于保留或分页时,total 行不会显示。130M 正在用于 "某些内容",剩下 149 M 的 swap 未在使用。Pct Used 列只显示了已在使用的 swap 百分比。
"memory" 行显示 pseudo swap 用量,这是所有 swapinfo 输出中最令人困惑的地方。正如我在以前的文章中提到的那样,pseudo swap 仅用于保留进程。因此,从此示例中可以看出,总共配置了 91M 的 pseudo swap,其中,68M 的 pseudo swap 正在由内存中运行的进程使用。剩下未使用的 pseudo swap 是 23 M。之所以令人困惑,其中的一个原因是 pseudo swap 使用不会像设备 swap 和文件系统 swap 那样降低系统性能。换句话说,无论使用 3% 还是 99% 的 pseudo swap,系统性能都是一样的。在查看 swapinfo 时,我们通常建议忽略 "memory" 行。
"reserve" 行仅涉及我们用于保留设备和文件系统 swap 区域中进程的 swap 数量。在此示例中,我们的设备和文件系统 swap 总共是 188 M,其中只有 52M 用于保留进程。现在,如果您采用用于内存和保留的所有数量,我们就会将 120(52+68)M swap 保留下来,用于活动进程。因此,从这两行信息可以看出,我们已经计算了 92% 的 swap,这部分仅保留下来,用于运行的进程。
"localfs" 行显示的一些信息说明了,对于 /var 上配置的文件系统 swap,系统将使用的空间量。该行有一点很有意思,这就是 swap 的优先级,它的优先级是 4。这说明,优先级设为 1 的所有设备 swap (/dev/vg00/lvol2) 都将在该文件系统 swap 区域使用之前使用。
"dev" 行是 swapinfo 命令可以显示的最重要的信息之一。如果 percent used 一行大于 0,系统就会进行 swap。这明确说明,系统上安装的物理 RAM 不足。只有两个方法能够使系统停止 swap,第一个是安装更多的物理内存,另一个是减少系统上运行的进程。在此示例中使用的 dev 行已经进行了更改,用以显示系统发生分页时输出是什么样子。如果还剩下 149M 的保留空间时,系统则不会将进程分页到 swap 区域中。
澄清 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",位于
上的知识库中。
影响 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) 输出信息可能有所帮助。