AIX topas命令中的Memory项% Comp% Noncomp% Client如何理解和分析_第1页
AIX topas命令中的Memory项% Comp% Noncomp% Client如何理解和分析_第2页
AIX topas命令中的Memory项% Comp% Noncomp% Client如何理解和分析_第3页
AIX topas命令中的Memory项% Comp% Noncomp% Client如何理解和分析_第4页
AIX topas命令中的Memory项% Comp% Noncomp% Client如何理解和分析_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

AIX 内存使用情况 windows 尽量少的用内存 aix 尽量多的用内存 svmon G size inuse free pin virtual memory 4046848 3758845 288003 935436 1816226 pg space 2097152 4651 work pers clnt pin 935174 0 262 in use 1815740 0 1943105 用 vmstat 1 11111 查看内存瓶颈 ps aux 显示内存使用 svmon G 查看内存泄露 谢提供 vmstat v 从上面显示看来 我想应该是这样 1 numperm numclient 都是 perm 或 client 相对 lruable 的比值 内存只有部分是 lruable 的 2 当只用 jfs 或者 jfs2 用量不大时 client 基本上是小于 perm 因为 jfs cache 类型算 perm 不算 client 这部分往往在非计算内存中是最大的 client 只是 nfs cdrfs 所用 这部分不算 file page 也 不算 noncomputational 因为没有本地硬盘数据对应 但这部分内存可以被 steal 被 steal 时也不需 要占用 paging space 因为也只是 cache 而已 noncomputational 从文档用语的理解看来 我的理 解是只包含本机硬盘有对应数据的内容 对于远程有的 NFS CDRFS 的 而一般来说 NFS 和 CDRFS 的访问量远远比不上本地 JFS 的访问量 其 cache 占用也就很少 3 如果 JFS2 用量很大 client 可能超过 noncomp 比较多 因为 JFS2 CACHE 算 client 不算 perm 而 noncomp 一般来说就是 perm 其实我觉得造成疑惑的应当是 IBM 对 noncomp 在实践中的定义不清 到底是内存只有 comp 与 noncomp 组成 还是不是 按理说应当是所有的 noncomp comp lruable 但如果发生 numclient numperm 而系统性能检查命令把 perm 当作 noncomp 这就有偷换概念的嫌疑 某些 cache 性质的不算 noncomp 而显然这些也不能算 comp 好在多数时候这种现象不严重 所以 client 应当是 noncomp 的一部分 今天在客户现场调试监控系统时 另外一个项目组有一台主机的 DB2 出现问题 希望我们对其主机的性能进行一些检测 问题是否解决目前还不知道 但通过这件事 对 AIX 系统内存使用情况有了更 清楚的了解 通常 使用 vmstat 指令可以查看系统的空闲内存 但 UNIX 系统的空闲内存普 遍都比较低 但相关指令的 man page 中声明这属于正常现象 比如今天这台主 机 有 8G 内存 但 Free 只有 160M 左右 那么 剩余的内存都到哪里去了 实际上 内存被分为两类 一种为工作区 用于存放进程数据 堆栈 核心 Kernal 数据以及共享内存 工作区的数据如果需要换页 只会交换到 paging space 另一类为持久存储区 主要是文件数据在内存中的缓冲 当持久存储区 的数据需要换页 则会交换到其所归属的文件 持久存储区的页又被分成 Client pages 和 Non client pages 其中 None client page 只能缓冲 Journaled File System JFS 文件系统的文件数据 而 Client page 缓冲所有其它类型文件系统的数据 如 NFS 上述对内存的两种分类 是因为内存页用途不同 AIX 内存管理程序为了提高 系统效率 从页交换的角度 将内存页又分为 Computational Non computational 两种 所有的工作区内存页都是 computational 而持久存储区的内存页则要根据其 缓冲的文件情况而定 当文件被打开且第一次被缓存时 默认定为 Non computational 但当某个进程尝试将该文件作为可执行代码进行执行时 该文 件所有的页都被标记为 computational 所以一个文件的所有页只能属于一种类型 且在系统重启之前不会改变 内存页的分类有助与通过参数调整内存交换程序的效率 详情参见 AIX topas 命令中的 Memory 项 Comp Noncomp Client 如何理解和分析 Memory 显示实际内存大小和使用中的内存分布 Real MB 以 MB 为单位的实际内存大小 Comp 当前分配给计算性页帧的实际内存百分比 计算性页帧一般是由分页空间支持的页帧 Noncomp 当前分配给非计算性页帧的实际内存百分比 非计算性页帧一般是由文件空间 无论是数 据文件 可执行文件还是共享库文件 支持的页帧 Client 当前分配用于缓存远程安装的文件的实际内存百分比 文档上都这么说 小弟就是无法理解 我看到的现象也是 comp 类型 但是就是原因搞不清楚 了解有关 AIX 虚拟内存管理器 AIX VMM 如何工作 以及如何利用可调参数来调整 AIX VMM 操 作的详细信息 AIX VMM 负责管理系统中所有的内存 AIX VMM 的操作对于系统性能来说是至关重要 的 并且它还提供了几个可调参数 对于不同的工作负载 您可以使用这些参数对其操作进行优化 引言 AIX 虚拟内存管理器 AIX VMM 是一种基于分页的虚拟内存管理器 一个分页就是一个固定大小的 数据块 分页既可以位于内存中 也就是说 映射到物理内存中的某个位置 也可以位于磁盘中 也就 是说 从物理内存中替换到分页空间或者文件系统 AIX VMM 有一个非常独特的方面 即缓存的文件数据的管理 AIX VMM 将缓存的文件数据与对其它类 型虚拟内存 例如 进程数据 进程堆栈等等 的管理集成到了一起 它将文件数据缓存为分页 就如同 进程的虚拟内存一样 AIX 根据需要将分页映射到实际内存 如果应用程序引用了某个分页 而该分页并没有映射到实际内存 中 那么系统将产生一个缺页 为了解决缺页 AIX 内核会将所引用的分页加载到实际内存中的某个位 置 如果所引用的分页是一个新的分页 也就是说 位于先前从未引用过的进程数据堆中的分页 那么 加载 所引用的分页只需要用零来填充一个实际内存位置 也就是说 提供一个填满零的分页 如果所 引用的分页是一个预先存在的分页 也就是说 文件中的某个分页 或者先前换出的某个分页 那么加 载所引用的分页需要从磁盘 分页空间或者磁盘文件系统 中将该分页读入到实际内存中的某个位置 在将分页加载到实际内存中之后 它将被标记为未经修改的 如果某个进程或者内核修改了该分页 那么 该分页的状态将更改为已修改的 这允许 AIX 跟踪在将某个分页加载到内存之后是否对其进行过修改 随着系统将更多的分页添加到实际内存中 实际内存中空闲位置 可以包含分页 的数目将会减少 也可 以将空闲位置的数目称为空闲分页框架的数目 当空闲分页框架的数目达到某个较低的值时 AIX 内核 就必须清空实际内存中的某些位置 以便重用新的分页 这个过程也称为分页替换 AIX VMM 提供了一些后台守护进程 专门负责进行分页替换 其中一个分页替换守护进程称为 lrud 显示为 ps k 的输出中的 lrud lrud 守护进程负责在内存分页中进行扫描 并回收某些分页以 便为实际内存腾出空间 当分页替换守护进程确定它希望回收某个特定的分页时 这个分页替换守护进程 将执行下面两项操作中的一项 如果该分页经过了修改 那么分页替换守护进程将该分页写入到辅助存储位置 例如 分页空间 或者文件系统磁盘 将包含该分页的物理内存块标记为空闲 并为其它的分页做好重用的准备 如果该分页没有经过修改 那么分页替换守护进程可以简单地将物理内存块标记为空闲 这样一 来 就可以将该物理内存块重用于另一个分页 在这种情况下 分页替换守护进程不需要将该分页写入到 磁盘 因为该分页在内存中的版本并没有经过修改 因此与位于磁盘中 在分页空间中 或者在磁盘文件 系统中 的分页副本完全相同 分页替换守护进程可以根据系统内存的使用情况和可调参数 选择不同类型的分页进行回收 本文剩下的 部分将详细地介绍分页替换守护进程如何选择要进行回收的分页 分页类型 从本质上看 AIX 中一共有两种分页类型 工作存储分页 Working storage pages 永久存储分页 Permanent storage pages 工作存储 工作存储分页是一些包含易变 数据 换句话说 即重新启动后将不复存在的数据 的分页 在其他的平 台中 工作存储内存有时也称为匿名 内存 下面提供了一些由工作存储分页组成的虚拟内存区域的示例 进程数据 堆栈 共享内存 内核数据 当需要将经过修改的工作存储分页替换出 从内存移动到磁盘 时 它们将被写入到分页空间 不会将工 作存储分页写入到文件系统 当进程退出时 系统将释放其所有的私有工作存储分页 因此 当进程退出时 系统将释放进程数据和堆 栈的工作存储分页 对于共享内存区域 直到删除共享内存区域之后 才会释放其工作存储分页 永久存储 永久存储分页是一些包含永久数据 也就是说 重新启动后仍然存在的数据 的分页 这种永久数据就是 文件数据 因此 永久存储分页就是缓存在内存中的部分文件 当经过修改的永久存储分页需要换出 从内存移动到磁盘 的时候 会将它写入到文件系统中 如前所述 可以直接释放没有经过修改的永久存储分页 无需将其写入到文件系统中 因为文件系统包含该数据的原 始副本 例如 如果一个应用程序正在读取某个文件 那么该文件数据将缓存于永久存储分页的内存中 这些永久 存储分页没有经过修改 这意味着并没有在内存中对这些分页进行修改 因此 内存中的永久存储分页与 磁盘中的文件数据完全相同 当 AIX 需要清空内存的时候 它只需要 释放 这些分页即可 而不将任何 内容写入到磁盘 如果应用程序对某个文件进行写操作 而不是读操作 那么永久存储分页将是 经过修 改的 并且 AIX 必须在释放这些分页之前将其刷新到磁盘 您可以将永久存储分页划分为两种子类型 客户端分页 非客户端分页 非客户端分页是一些包含缓存的日志文件系统 JFS 文件数据的分页 非客户端分页有时也称为持久性 分页 客户端分页是一些包含所有其他文件系统 例如 JFS2 和网络文件系统 NFS 的缓存数据的 分页 分页分类 为了帮助分页替换守护进程更好地选择用来进行替换的分页 AIX 将分页分为下面两种类型 计算性分页 非计算性分页 计算性分页是一些用于文本 数据 堆栈和进程的共享内存的分页 非计算性分页是一些包含正在进行读 取和写入的文件的文件数据的分页 如何对分页进行分类 所有的工作存储分页都是计算性的 不会将工作存储分页标记为非计算性的 永久存储分页既可以是计算性的 也可以是非计算性的 这取决于您使用这些分页的方式 如果一个文件 包含某个进程的可执行文本 那么系统会将该文件视为计算性的 并且将该文件中的所有永久存储分页都 标记为计算性的 如果该文件不包含可执行文本 那么系统会将该文件视为非计算性的 并且将该文件中 的所有永久存储分页都标记为非计算性的 当您第一次打开一个文件的时候 AIX 内核将创建一个内部 VMM 对象以代表该文件 并且将其标记为 非计算性的 这意味着所有的文件在一开始都是非计算性的 随着程序对该文件进行读写操作 AIX 内核将该文件的数据作为非计算性的永久存储分页在内存中进行 缓存 如果关闭该文件 那么 AIX 内核将继续在内存中 在永久存储分页中 缓存该文件的数据 内核继续缓 存该文件是为了提高性能 例如 如果稍后出现了另一个进程 并且它也使用了相同的文件 那么该文件 数据仍然位于内存中 并且 AIX 内核不需要从磁盘读入该文件的数据 如果某个文件因为指令取出发生了缺页 那么会将非计算性文件转换为计算性状态 当对某个文件出现进 程缺页 意味着该进程引用了文件的部分内容 而这部分内容当前没有缓存在永久存储分页的内存中 的 时候 该进程将产生一个缺页 如果是由于指令取出而导致的缺页 意味着该进程正在尝试加载来自该分 页的指令 以便进行相关操作 那么内核会将该文件标记为计算性的 这涉及到将该文件中的所有分页 都标记为计算性的 一个文件要么完全是计算性的 要么完全是非计算性的 在将文件标记为计算性文件之后 它将一直保持为计算性文件 直到删除该文件 或者重新启动系统 因此 即使移动了该文件 或者对它进行了重命名 该文件仍然标记为计算性的文件 分页替换 AIX 分页替换守护进程一次扫描内存的一个分页 找出要回收的分页以释放内存 分页替换守护进程必 须仔细地选择分页 以便将分页对系统的性能影响降到最低 并且分页替换守护进程将根据可调参数设置 和系统情况来选择不同类型的分页 您可以使用大量的可调参数来控制 AIX 选择分页进行替换的方式 minperm 和 maxperm minperm 和 maxperm 是两个最基本的分页替换可调参数 这两个可调参数用于指出 AIX 内核应该 使用多少内存来缓存非计算性的分页 maxperm 可调参数指出应该用于缓存非计算性分页的最大内存 量 在缺省情况下 maxperm 是一个 非严格的 限制 这意味着在某些情况下可以超出这个限制 将 maxperm 设定为非严格的限制 这允许在具有可用空闲内存的时候 可以在内存中缓存更多的非计算 性文件 通过将 strict maxperm 可调参数设置为 1 就可以使 maxperm 限制成为 严格 的限制 当 maxperm 是严格限制的时候 即使有可供使用的空闲内存 内核也不允许非计算性分页的数目超出 maxperm 的限制 因此 将 maxperm 作为严格限制的缺点是 非计算性分页的数目不能超出 maxperm 的限制 并且在系统中具有空闲内存的时候 也不能使用更多的内存 minperm 限制指出应该用于非计算性分页的最低内存量 非计算性分页的数目称为 numperm vmstat v 命令可以显示系统的 numperm 值所占系统实际内 存的百分比 按上面的理解 oracle 引用到的分页属于 工作存储分页 Working storage pages 而工作存储分页都属计算性分页 所以 oracle 引用到的分页就属于 计算型分页 还有 2 个疑问 1 那么非计算型的分页是不是就只属于以下 2 种类型中 不包含可执行分页 指令取出 的部分 客户端分页 非客户端分页 非客户端分页是一些包含缓存的日志文件系统 JFS 文件数据的分页 非客户端分页有时也称为持久性 分页 客户端分页是一些包含所有其他文件系统 例如 JFS2 和网络文件系统 NFS 的缓存数据的 分页 分页分类 2 如果内存足够大 是不是在一个只有 oracle 应用的系统中 paging space 的使用率就会变的很低 因为不存在缺页的情况 缺页已经被 oracle 处理了 它自己有自己的 LRU list 引入和刷出 data block 已经不会出现操作系统层面上的缺页 这个概念很绕口 其实简单一点说 非计算就是 AIX 的文件系统缓存 因为 oracle 有自已的缓存机制 所以在纯数据库服务器 上应该降低文件缓存数量 以避免重复缓存 所 以在 aix 需要用 vmo 将 maxperm 等值调低 原创原创 非计算内存和计算内存的概念非计算内存和计算内存的概念 看到有 XD 发帖说这个问题 我也想详细给大家一个说明 请各位老手新手指教 通俗的说法 通俗的说法 凡是硬盘上有对应的数据 占用的内存 就是非计算内存 非计算内存需要被别的进程用 到时 其中的数据无需 page out 因为再次需要读取的时候从硬盘文件中拿出来即可 凡是硬盘上没有数据对应的内存占用叫做计算内存 例如用 C 写个程序 分配一块 1MB 的 内存 这部分内存不管其中数据是否有意义 硬盘上没有文件对应 叫做计算内存 以上所谓 硬盘上有无对应数据 的前提是 计算内存 非计算内存是操作系统的分类 所以操作系统知道硬盘上有对应 才叫非计算内存 虽然任何数据库的内存占用绝大部分 是磁盘缓冲 按理说其中的数据硬盘上有对应 但是 这些内存是数据库管理的 操作系 统只知道这些内存是 DBMS 主动向操作系统申请的 其中放的什么 操作系统并不知道 所以是计算内存 breakdown breakdown 计算内存 非计算内存都是指物理内存占用 而物理内存的情况 由于 VMM 机制 是时刻 在变化的 所以只能说某一瞬间 计算内存 非计算内存各占用多少 计算内存 凡是进程 程序运行中用程序代码向操作系统申请的内存 全部是计算内存 也就是说除 非这个程序运行起来 除了自身代码占用的内存 一点额外的内存也不用 否则它几乎必 然会造成计算内存占用的 说 几乎 是因为计算内存 非计算内存都是指物理内存 如果一个程序申请了 1MB 内存 但一段时间没有用这部分内存 很可能在其他进程需要内 存 且物理内存比较紧张时 按照 LRU 算法 Latest Recently Unused 最近最少使用 被操作系统部分或全部 page out 到 paging space 中 如果全部被 page out 了 可以说 这个时刻 此进程没有使用计算内存 换句话说 就是程序申请了 1MB 内存 那么它在某 一时刻占用的计算内存从 0 字节 1MB 都有可能 进程主动向操作系统申请分配的内存 从程序编码上来看 以 C 为例 典型的就是 malloc 当然 还有程序语言中的隐式分配 反正对于操作系统来说都一样 例如 char string1 ABCDEFG int number 22222 前者会导致自动向操作系统申请 8 个字节 后 一个会申请一个字 两个字节 当进程退出 或者意外崩溃 对于操作系统来说 它知道进程不在了 而进程申请的内存 操作系统明确知道是哪些的 在资源回收的过程中 会自动把这个进程申请的内存释放掉 这个过程是很快的 所以我们可以看到 如果计算内存高企 我们把应用一停 也就是把 使用计算内存最多的进程停止 计算内存占用率立刻就下来了 非计算内存 操作系统明确知道这部分内存的用途是放硬盘对应数据的 所以 显然这部分内存不是任 何进程可以控制 也就是说不可能一个程序主动要求分配多少非计算内存或者释放多少 这部分完全是操作系统在直接管理 分配 记录状态 使用 释放 其他进程只可能用间 接手段影响非计算内存 例如读写文件 非计算内存我们常见的是如下用途 程序代码 当运行程序时 代码初始装入到物理内存的什么地方 重定位到什么地方 是操作系统管理的 它会记住程序代码放在物理内存什么地方 及其对应程序文件的位置 当程序代码占用的 page frame 需要被其他用途使用时 操作系统直接把这个 page frame 转给要使用这部分内存的进程 并记录标志 下次要是这个 page 原来的内容需要被引用 从对应程序文件中的对应位置读取进入物理内存 有些进程的某些计算内存占用是不能被 替换的 例如执行 VMM 管理任务的操作系统核心进程 所以这部分会有操作系统机制设置 标志 这个就是常说的 pin 住某些内存不准替换掉 磁盘访问缓冲区 这个不是常说的缓存区 缓存区 英文 Cache 的目的是用来提高 性能 而缓冲区 英文 Buffer 是为了块设备访问特点的要求 比如硬盘块设备 逻辑 卷块设备 必须读写的基本单位是一个块 一般是 512 字节 哪怕你只读写一个字节 也 必须一次读进 512 字节 修改特定的那一个字节 然后再整个 512 字节块全部写出到硬盘 这就需要缓冲区的存在 缓冲区的总个数 是不固定的 操作系统可以根据同时在访问的 块的数量随时调整 NFS 访问缓冲区 原理基本同上 文件系统缓存 这个肯定是每一个字节都有硬盘文件对应的 显然是非计算内存 我的理解 计算内存 Work segment 临时的 没有对应的持久磁盘存储位置 一个进程结束 将释放物理和分页空间 当空闲物理内存较少时 将 page out 到分页空间 以帮助释放更多物理内存 非计算内存 Persistent segment 持久段 在磁盘上有持久存储位置 数据文件 or exe 程序通常都映射为非计算内存 数据文件 jfs jfs2 nfs 等 所以 当物理内存较少 计算内存将 page out 到 pagingsapce 主机性能下降 这就是我们通常 看到的内存瓶颈 我们需要保护计算内存 限制非计算内存 这是我们愿意看到的情况 AIX5 3 以前的调整参数方法 maxperm maxclient 设置较低通常在 20 左右 minperm 设置的更低一点 通常可以是 maxperm 的一半 5 10 AIX5 3 以后的调整参数方法 maxperm maxclient 设置的比较高 90 左右 minperm 还是设置的比较低 通常可以设置为 5 20 左右 lru file repage 0 而 lru file repage 1 是 AIX 系统的 default 的值 lru file repage 参数存在的意义 1 是否应该考虑 VMM 重分页计数 2 替换什么类型的内存 当 lru file repage 0 的时候将只替换非计算内存 这显然达到了我们需要保护计算内存的目的 最近看了些资料 发现 AIX5 3 相对于以前的版本在多方面有提高和改变 绝对是一个好版本 不得不佩服 IBM 开发人员 非计算内存在开通 ftp 或者 nfs 服务的时候 可能会影响到 oracle 内存性能 当然了 象我 条件不允许 生产库的小鸡又不能随便动 郁闷 有一点似乎需要纠正有一点似乎需要纠正 对于 AIX 可执行程序文件的代码段 属于计算内存 虽然对于这些段来说 代码 段和初始数据段 其实是有文件部分在磁盘上对应的 但是最后 还是会变成计算内存 这里有个转化的概念 OS 的 Loader 在装入可执行文件时 因为从 disk 装入 这时所使用 的还是属于 NonComp 一旦发生指令预取的 page fault 则 NonComp 会转为 Comp pageOut 去 swapdevice 的 pages 对 AIX 叫 WorkingStoragePages 所有的 WorkingStoragePages 都是 Comp 然而不是所有的 Comp 都是 WorkingStoragePage 应该说 Disk 上有文件对应的就叫 PermanentStoragePages 无文件对应的叫 WorkingStoragePages 对不起 各位老大 水一下 程序中 char string1 ABCDEFG int number 22222 属于初始化定义 也就是 static 的代码 到底是计算内存还是非计算内存 看以后是否有 改写 由编译程序在编译的时候决定到低是什么 如果以后虽然有引用 但是没有改写 则在程序代码段 非计算内存 例如类似 char string2 string2 string1 的引用 其实这个变 量是个常量 ABCDEFG 保存在代码段中 非计算内存 string1 作为指针本身并不存在 因为 指向是个常量 程序可以优化 把这个指针省略掉 如果以后有改写 例如 string1 string2 则在程序初始化会在堆中申请空间 也就是计算内 存 同时程序代码段还是有该常量 ABCDEFG 22222 这部分还是非计算内存 另外非计算内存并非完全可以丢弃 其中还有是否 dirty 如果 dirty 等同于计算内存处理 我还没有证据说明 aix 足够聪明到对于 dirty 的非计算内存会直接写磁盘原数据区还是写 paging space 但以我个人推断 由于写磁盘数据区的是 syncd 而处理 pagingspace 的是 swap 两个截然不同的进程 他们在那么短暂的时间内 没有道理会相互通信 而且很有 可能死锁 最好的办法就是 dirty 非计算内存完全等同于计算内存 paging 到交换区 以上一段严重错误 又是中午吃多了惹得祸 今天老板请吃自助餐 经过 larry 老大当头 棒喝 醍醐灌顶 七窍顿开 lrud 是唯一的对内存进行检验的程序 而是否 sync 到磁盘或 者交换区 syncd 自己是不管的 它尊从内存页标记 因此不会出现两个程序争相处理一 块内存的情况 再次感谢 larry 老大高风亮节 不耻屈尊与我等小辈讨论 不过经过刚刚专 研 发现依然有疑惑 很多说法比较模糊 继续研究之中 预知后事如何 请看下集 由此 如果有大量的数据文件改写操作 例如 copy tar 的目标文件 都会造成内存消耗 而且无法通过参数优化 只能增加 syncd 的写操作频繁程度或者增加并行数来解决 这段没有大问题 但前提条件正如 larry 老大所说 系统有足够的 fremem 的时候才会等待 syncd 被动刷新 否则 lrud 会主动调用 syncd 刷新 由于有 fremem 存在 通常不会系统有 太大影响 优化不优化没什么意义 除非此时系统紧跟 在几分钟之内 着要进行大量申 请内存的操作 例如 load 数据等批量操作 启动数据库等等 由于系统会 lazy 清理内存 只有申请的时候才会清理 所以后续程序会稍慢 如果非常必要 就差几分钟 一般没必 要 可以主动进行内存清理 把用于文件系统的内存 writeback 并释放 释放的方式有 1 删除刚刚进行操作的大文件 文件没了 内存中的 cache 就没了 自然变成 fremem 2 抖动系统 就是更改 maxfre minfre 之类的参数 改成很大的值 然后再改回来 最后感谢一次 Larry 老大 您的光辉形象将永远成为激励我们前进的原动力 原帖由 orian 于 2008 6 20 00 21 发表 另外非计算内存并非完全可以丢弃 其中还有是否 dirty 如果 dirty 等同于计算内存处 理 我还没有证据说明 aix 足够聪明到对于 dirty 的非计算内存会直接写磁盘原数据区还 是写 paging space 但以我个人推断 由于写磁盘数据区的是 syncd 而处理 pagingspace 的是 swap 两个截然不同的进程 他们在那么短暂的时间内 没有道理会相 互通信 而且很有可能死锁 最好的办法就是 dirty 非计算内存完全等同于计算内存 paging 到交换区 syncd 只是确保 flush 文件系统 cache 的最后一道防线 缺省 syncd 间隔是 60 秒 这中间 syncd 肯定是不干活的 但我们知道 文件系统 cache 必须以 60 秒进行 flush 而中间绝 对不 commit 任何 cache page 这显然不符合常理 当遇到 dirty 的 fs cache page 是一定会自动先 flush 它们的 以下说法来自 AIX Information Center 文件同步性能调整文件同步性能调整 JFS 的非顺序文件 I O 会一直存储在内存中直到满足一定条件 空闲列表缩小到 minfree 以致需要进行页替换 syncd 守护程序按固定调度间隔刷新页 执行了 sync 命令 随机后写在达到随机后写阈值后清空脏页面 顺序后写顺序后写 如果簇的所有 4 页都是脏页 那么只要修改了下一个分区中的页 会调度将该簇中的 4 个脏页写入磁盘 如果不具备这一功能 那么直到 syncd 守护程序运行前 该页都会留存 于内存 导致可能的 I O 瓶颈和文件碎片 缺省情况下 一个 JFS 文件划分成 16 KB 大小的分区或 4 页 每一个这样的分区被称为 一簇 VMM 用于充当阈值的簇数是可调整的 缺省值是一簇 使用 ioo o numclust 命令增大 numclust 参数可延迟后写入 对于增强型 JFS ioo o j2 nPagesPerWriteBehindCluster 命令用来指定每次调度的页 数 而不是簇数 增强型 JFS 簇的缺省页数为 32 意味着增强型 JFS 的缺省大小为 128 KB 随机后写随机后写 后写功能提供了这样一种机制 即当给定文件在内存中的脏页数超过规定阈值后 那么会 调度所写的后续页面以写到磁盘上 可能存在一些应用程序执行大量的随机 I O 即 I O 模式不满足后写算法的要求 因而导 致所有页面驻留在内存中 直到 syncd 守护程序运行为止 如果应用程序修改了内存中的 很多页面 那么在 syncd 守护程序发出 sync 调用时 这会使得向磁盘写入大量页 将 ioo 命令与 JFS maxrandwrt 参数一起使用 可调整阈值 缺省值为 0 表示随机后写 是禁用的 将该值增加到 128 表示一旦文件驻留于内存的页达到 128 页 随后的任何脏 页都将被调度写入磁盘 而这些页将在调用 sync 后刷新 对于增强型 JFS ioo 命令选项 j2 nRandomCluster z 标志 和 j2 maxRandomWrite J 标志 用于调整随机后写 两个选项缺省值都为 0 增强型 JFS 的 j2 maxRandomWrite 选项和 JFS 的 maxrandwrt 功能相同 即它限定了每个文件可以 留在内存中的脏页数 j2 nRandomCluster 选项指定了可以被视为随机的两次连续写入之 间的簇数 也就是说 一个规则先说 这是前提 当一个 fs cache page 必须被另外使用时 一定是 minfree 已 经达到了 否则系统只用从 free list 中取未用页来用即可 顺序后写造成的 dirty page 当真正需要用到这些页时 minfree 已经达到 而 minfree 达到时 一定会做先做 commit dirty page 的事情 所以不用占用 paging space 缺省情况下 随机后写完全是关闭的 所以随机后写不会导致 fs cache 被使用 也就不 可能产生 dirty 非缺省情况下 随机后写打开 那么情形同顺序后写 所以您设想的 dirty fs cache page 需要换出到 paging space 的可能性并不存在 本帖最后由 larryh 于 2008 6 20 01 36 编辑 原帖由 FromHell 于 2008 6 19 21 54 发表 对于 AIX 可执行程序文件的代码段 属于计算内存 虽然对于这些段来说 代码 段和初始数据段 其实是有文件部分在磁盘上对应的 但是最 后还是会变成计算内存 这里有个转化的概念 OS 的 Loader 在装入可执行文件时 因为从 disk 装入 这时所 使用的还是属于 NonComp 一旦发生指令预取的 page fault 则 NonComp 会转为 Comp 这一点 我倒没有看到有足够详细的官方资料来证明是或否 由此我引申想到两个有趣的问题 1 某个页当前属于非计算内存还是计算内存 是否有专用的页标志来标明 我怀疑没有 因为 IBM 自己 都可能对内存页的那么多种用途到底算什么类型没有完全一致意见 除了 典型的 占用量大的类型没有什么异议外 比如 nmon 和 topas 显示的非计算内存和计算 内存比例就不同 2 这个更加有趣 而且有兴趣有精力的可以做做试验 需要 POWER 汇编的知识 至少可以 查看特定代码的十六进制数据体现是什么 以在内存中定位出来 我没做 有没有用户 进程可访问的非计算内存 按照概念来说不应该有 那么如果用户进程去写非计算内存 应当会被操作系统发现越权访问不属于自己的内存 而把它干掉同时产生 coredump 如果您说的代码实际被引用到 会导致其转化为计算内存这一点 确实是 AIX 的标准行为 那么这个计算内存算不算这个进程自有 这样会有这么几种情况 代码已经被执行过 所以它是计算内存 如果它属于用户进程自有 自然这个进程可以修改已经被执行过的自身代码 可以设计 一个试验来验证 如果它不属于用户进程 则必然属于系统进程 这个进程修改已经被执行过的自身代码的 尝试将导致 coredump 代码尚未被执行过 所以它是非计算内存 非计算内存不应该属于进程自有 所以试图修改它会造成 coredump 又要翻船 在 infocenter 找到明确说明 Pages that are part of working segments are written to paging space persistent segments are written to disk 不过没有写是 paging space 还是 file 还有机会 中午吃多了 嗨 怎么没想起来 lrud 是罪魁祸首 它会根据 page 情况调用磁盘写 否 则也不会猜想两个进程争相刷新磁盘 原帖由 larryh 于 2008 6 20 02 40 发表 1 某个页当前属于非计算内存还是计算内存 是否有专用的页标志来标明 我怀疑没有 因为 IBM 自己 都可能对内存页的那么多种用途到底算什么类型没有完全一致意见 除了 典型的 占用量大的类型没有什么异议外 比如 nmon 和 topas 显示的非计算内存和计算 内存比例就不同 2 这个更加有趣 而且有兴趣有精力的可以做做试验 需要 POWER 汇编的知识 至少可以 查看特定代码的十六进制数据体现是什么 以在内存中定位出来 我没做 有没有用户 进程可访问的非计算内存 按照概念来说不应该有 那么如果用户进程去写非计算内存 应当会被操作系统发现越权访问不属于自己的内存 而把它干掉同时产生 coredump 如果您说的代码实际被引用到 会导致其转化为计算内存这一点 确实是 AIX 的标准行为 那么这个计算内存算不算这个进程自有 这样会有这么几种情况 代码已经被执行过 所以它是计算内存 如果它属于用户进程自有 自然这个进程可以修改已经被执行过的自身代码 可以设计 一个试验来验证 如果它不属于用户进程 则必然属于系统进程 这个进程修改已经被执行过的自身代码的 尝试将导致 coredump 代码尚未被执行过 所以它是非计算内存 非计算内存不应该属于进程自有 所以试图修改它会造成 coredump 发扬一不怕死 二不怕水 死猪不怕开水烫的精神 继续水 偷偷跟您说一声 为了保证 灌水质量 我连晚饭都没吃 只喝水 力争保持清醒 忽然想起来 刚说了一句 现在 LU 高手越来越多 保不准什么时候就被一刀毙命 乌鸦嘴啊 以下来自 infocenter 和我自己的理解 请大家多多水场 memory mngment htm VMM 管理将 memory 分成 page 缺省 page 大小 4KB 但 aix 操作系统支持更大的 page 例 如 16M 但对于非 4k 的 page aix 不能处理 page in out 只能将其 pin 在 real memory 中 aix 中每 256M 的 memory 只能采用一种 page size aix 支持混合使用 而且不需要 重新启动 需要预先将 vmo 参数 large page heap size 1 以允许其它 page 只需更 改 vmo 参数到需要的大小 但注意 使用其他大小的 page 不能交换 与 vmm 不同 real memory RAM 只有 4k page vmm 管理程序需要将其 page 与 real memory 的 4k 对应 或者与磁盘交换区对应 就是 page out 出去了 vmm 使用一些算法来进行对应 Virtual memory segments 分为 persistent segments 或者 working segments Virtual memory segments 同时同时还被分为 computational or file memory 如果需要访问的 Virtual memory pages 不在 real memory 则引起 page fault 中断 Page faults 又可能是 new page faults 或者 repage faults 最近一段时间 这个时间长 短好像是 lrud 扫描完一遍内存 pool 的时间 有待确认 lrud 不停地循环扫描内存 pool 内存 pool 的大小根据机器拥有的物理内存多少和 cpu 数量有关 vmstat v 可以看到 memory pool 的数量 每个 pool 对应 lrud 的一个线程 第一次访问此页是 new page fault 如果在这段时间第二次发生此 page faults 则是 repage faults 如果发生 repage fault 系统会记录下来 vmstat 1 的 re 一项既是 Persistent 和 working segments Persistent 内存页如 larry 老大所说 就是在磁盘上有对应的 无论程序 数据文件还是 cache 其实也是为数据文件准备的 working segment 是临时生成 例如 malloc 申请的 但由于单位是 segment 256M 所 以并不能按照 4k 断定那个是 persistent 那个是 working 而是 vmm 根据内存申请的特点 来存放对应的 page 我猜想 不确定 有待探讨 也就是说 系统一定知道那些 page 是 persistent 那些是 working 因为这些 page 在初始化使用的时候 是在不同的段里面 申请的 如果读写文件 vmm 就在 persistent segment 分配 page 给请求者 打开文件通 常由 lvm 内核操作 所以是系统调用 而程序通过 malloc 申请 即使保存的是文件的一 部分 通过 memcpy 过来 但系统依然认为是 working 在 working 段分配 如果 persistent 里面的 page 被修改并且并且不能在 real memory 保存 什么情况下不能保存 待确定 则 vmm 将其写回到磁盘上对应的数据文件区 如果没被修改 则直接丢弃 不 需要 io 以后再有需求 重新读回来 因为磁盘上有对应文件 数据 c 程序在执行的时候 操作系统 vmm 会自动分配 stack data 段 working heap 段 working program text 段 persistent shared lib 段 persistent 每段 256M 但只是一个虚拟空间 程序真正使用的时候 才会占据一个又一个 4k 才会对应到 real memory Working segments 是个临时区域 仅仅存活于程序执行期间 磁盘上也没有对应的数据文 件 一点例外 系统内核的 text 和 shared library 本来应当保存在 persistent 段 因为 内核也是程序 而程序的这些区域应当是 persistent 内存 但是他们也被算作 working 的 难道是防止系统运行过程中系统内核文件被误删除直接导致系统崩溃 而给大家留个 缓冲时间 因为这些文件不会再从磁盘读入 只读一次 以后即使内存不够 也不会如同 其他程序文件直接丢弃 而是交换到 paging space 推论 如果误删除了系统 内核文件 限于执行文件和调用库 参数文件不算 千万别停机 系统还会正常工作 想办法还能从内存中找回来 Persistent segment 还有更多的类型 Client segments 是用于远程文件 例如 nfs mount 过来的 这些 page 如果需要交换出去 则写回原位置或者丢弃 如果没有修改 而不会交换到交换区 我印象中 4 3 3 似乎是写本地交换区 估计是现在认为网络足够快 了 Journaled 和 deferred segments 是 persistent segments 必须进行原子操作写 原子操作大家都知道 就是同时只允许一个线程进行写 别的必须等待 不能并行写 如果 journaled 或者 deferred segment 需要从 real memory 偷页 paged out itit mustmust bebe writtenwritten toto diskdisk pagingpaging spacespace unlessunless itit isis inin a a statestate thatthat allowsallows itit toto bebe committedcommitted written written toto itsits permanentpermanent filefile location location 这是真正的疑点所在 哪些数据属于这是真正的疑点所在 哪些数据属于 JournaledJournaled 和和 deferreddeferred 我猜想是 我猜想是 jfsjfs 的的 inodeinode 之类之类 的数据 的数据 deferreddeferred 呢 不确定 先放到这 回去找呢 不确定 先放到这 回去找 aixaix kernalkernal internalinternal 继续专研 继续专研 Computational 和 file memory Computational memory 也就是 computational pages 包含 working storage segments 或 者 program text executable files segments 也就是说计算内存包括 working 段或者 程序代码 又出现疑点 程序代码以往我是当成非计算内存的 难道又疏忽了 又出现疑点 程序代码以往我是当成非计算内存的 难道又疏忽了 file memory 是所有其他的内存页 交换到自己原有对应的文件 这没什么说的 但愿是 5 3 与以往版本有出入 否则误人子弟 诲人不倦啊 专研几天先 多谢 Larry 老大给我们指出了一条康庄大道 道上还堆砌了无数荆棘 原帖由 larryh 于 2008 6 20 21 12 发表 jfs2 用的是 client 段 这个和 jfs 不同 也就是说应当和 NFS 的处理方法完全一样了 至于 fs cache 在 NFS 和 JFS 之间表现有什么不同我还不清楚 黄老大能详细指点一下 永久存储 永久存储分页是一些包含永久数据 也就是说 重新启动后仍然存在的数据 的分页 这 种永久数据就是文件数据 因此 永久存储分页就是缓存在内存中的部分文件 当经过修改的永久存储分页需要换出 从内存移动到磁盘 的时候 会将它写入到文件系 统中 如前所述 可以直接释放没有经过修改的永久存储分页 无需将其写入到文件系统 中 因为文件系统包含该数据的原始副本 例如 如果一个应用程序正在读取某个文件 那么该文件数据将缓存于永久存储分页的内 存中 这些永久存储分页没有经过修改 这意味着并没有在内存中对这些分页进行修改 因此 内存中的永久存储分页与磁盘中的文件数据完全相同 当 AIX 需要清空内存的时候 它只需要 释放 这些分页即可 而不将任何内容写入到磁盘 如果应用程序对某个文件进 行写操作 而

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论