LoveUnix » AIX -IBM UNIX » oracle用的内存到底是属于comp还是noncomp?
让LU留住您的每

一天 让LU博客留住您的每一天
2008-6-16 10:55 kokohei
oracle用的内存到底是属于comp还是noncomp?

% Comp
The percentage of real memory currently allocated to computational page frames. Computational page frames are
generally those that are backed by paging space.
% Noncomp
The percentage of real memory currently allocated to non-computational frames. Non-computational page frames
are generally those that are backed by file space, either data files, executable files, or shared library
files.

按man的解释理解
数据文件应该是属于% Noncomp

而在下面这个系统中(上面只有数据库应用) 为什么Comp却一直很高?
MEMORY
Real,MB   16896
% Comp     79.7
% Noncomp   8.1
% Client    8.1

我自己的理解是
当oracle的操作是逻辑IO(oracle认为是逻辑IO)时候--就是说需要读取的数据可以在内存中找到时(real memory+paging space)
这时候用的内存就属于Comp

而当在内存中找不到时(real memory+paging space)
需要经过物理IO(oracle认为是物理IO)从数据文件中读入到内存中
这时候用到的内存就属于Noncomp

不知道我这样理解对不对

2008-6-16 11:20 kokohei
自己顶下

2008-6-16 11:34 orian
理解不对:lu4:

2008-6-16 11:36 kokohei
恳请赐教 斑竹

2008-6-16 13:45 kokohei
顶下  别沉了啊

2008-6-16 14:02 俊俊
了解有关 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 值所占系统实际内存的百分比。

2008-6-16 14:30 kaka_wang
楼上的解释很强大!

2008-6-16 14:52 saudi
这个应该认真学习下。。。

2008-6-16 14:53 kokohei
好象理解了一点

oracle引用到的分页属于 工作存储分页(Working storage pages)
而工作存储分页都属计算性分页

所以 oracle引用到的分页就属于 计算型分页

还有2个疑问
1
那么非计算型的分页是不是就只属于以下2种类型中 [color=Red]不包含可执行分页(指令取出)的部分[/color]?
•        客户端分页
•        非客户端分页
非客户端分页是一些包含缓存的日志文件系统 (JFS) 文件数据的分页。非客户端分页有时也称为持久性分页。客户端分页是一些包含所有其他文件系统(例如,JFS2 和网络文件系统 (NFS))的缓存数据的分页。
分页分类

2 如果内存足够大  是不是在一个只有oracle应用的系统中 paging space的使用率就会变的很低?
因为不存在缺页的情况  缺页已经被oracle处理了(它自己有自己的LRU list 引入和刷出 data block) 已经不会出现操作系统层面上的缺页

2008-6-16 15:48 kokohei
顶下  想弄清楚

2008-6-17 05:27 orian
理解还是不对,哈哈

有三点你自己想一下:
1. 系统不是只有oracle在用
2. 系统不同配置、参数之间互相关联影响
3. 文件类型的库文件还是裸设备的(其实也是参数影响,但影响太显著了,单列出来)

2008-6-17 09:20 kokohei
谢谢斑竹 抽时间来赐教
:D

不知道我哪一部分理解不对了?

斑竹你这里说的 库文件 还是裸设备
不是很明白
库文件 时候 用的是Noncomp
裸设备时  用的就是Comp了吗?

2008-6-17 09:46 diyxuwei
搞懂这个干吗?

2008-6-17 10:16 FromHell
Oracle 有自己的cache(SGA)管理,从OS角度来说 这部分的是籍由共享内存方式实现,属于comp内存
Oracle本身的代码 所谓的数据库引擎,是属于nonComp的...这个和用户应用程序是一样的道理 ,事实上oracle本身就属于application,和你自己写的一个程序来说 并没有更高的特权
Sharemem 对AIX来说 当系统内存不足时 ShareMemory 一样会被swap到swapDevice上
不过SGA有一个option可以将这部分共享内存pin在memory里;当然这种情况下可能更加糟糕 没准OS不能换你的SGA..只好换你的oracle代码
当oracle的数据文件采用文件系统的方式时,文件系统本身会cache数据 (nonComp)...当oracle flush SGA的数据去系统时 因为FS cache的存在 ,OS会写到FS的cache里...然后由OS定期往disk写入 读取数据块时 一样的道理(先读入FS cache)
coz Oracle有自己的cache管理...FS的cache从某种程度来说 是开销 这种现象即所谓的double buffer
使用裸设备 或者特别的文件系统mount option可以offset这种现象(-D -O)
所以在一个良好配置的OracleServer上....SGA的 大小被合理配置 系统pgsp很少活动
如果SGA过大...pgsp一样会被频繁使用
原则适用所有使用ShareMemory的程序

2008-6-17 10:50 无名小卒
帮你顶一下!:victory:

2008-6-17 11:06 yurual
Configuring a Database Server That Uses Filesystem Files
Scenario
This scenario is similar to the previous example, except that the database files are
filesystem files and not raw LVM files. In this case, double-buffering occurs; that is,
the database caches contents of the database files in its own database buffer cache,
and the VMM caches the files in the VMM file cache.
Solution
If you want to use filesystem files, tune the system with the vmtune command.
The values of maxperm and minperm should be reduced until they will be less than
the numperm value. If you keep maxperm and minperm very small (approximately
1%), you can use the same method as in the previous example to determine your
paging space requirement.
If you do not do this tuning, keep in mind that the database buffer cache could be
paged out because the VMM file cache is also caching the database files. This
would require the use of real memory, leaving less memory for the database buffer
cache. In this case, you should have at least as much paging space as you have
allocated for the database buffer cache plus the memory usage of all the database
processes.

2008-6-17 16:46 kokohei
非常感谢你的回答
比较认同下面的观点
[color=Blue][b]Oracle 有自己的cache(SGA)管理,从OS角度来说 这部分的是籍由共享内存方式实现,属于comp内存[/b][/color]


[quote]原帖由 [i]FromHell[/i] 于 2008-6-17 10:16 发表 [url=http://www.loveunix.com/redirect.php?goto=findpost&pid=798416&ptid=86018][img]http://www.loveunix.com/images/common/back.gif[/img][/url]
Oracle 有自己的cache(SGA)管理,从OS角度来说 这部分的是籍由共享内存方式实现,属于comp内存
Oracle本身的代码 所谓的数据库引擎,是属于nonComp的...这个和用户应用程序是一样的道理 ,事实上oracle本身就属于a ... [/quote]

但是
不知道你所说的
[color=Blue][b]不过SGA有一个option可以将这部分共享内存pin在memory里;当然这种情况下可能更加糟糕 没准OS不能换你的SGA..只好换你的oracle代码[/b][/color] 
是指什么意思
如果你所指的oracle代码是指oracle的后台进程
比如
  oracle   90150       1   0   May 27      - 739:01 ora_j001_HKCTS01
  oracle  110688       1   0   May 27      -  4:01 ora_cjq0_HKCTS02
  oracle  114728       1   0   May 27      -  5:06 ora_ckpt_HKCTS02
  oracle  122982       1   0   May 27      -  0:55 ora_dbw1_HKCTS02
  oracle  135188       1   0   May 27      -  0:09 ora_arc0_HKCTS02
  oracle  159814       1   0   May 27      - 700:30 ora_j002_HKCTS01
  oracle  192626       1   0   May 27      -  8:31 ora_pmon_HKCTS01
  oracle  196730       1   0   May 27      - 18:34 ora_dbw1_HKCTS01
  oracle  200828       1   0   May 27      - 17:58 ora_dbw2_HKCTS01
  oracle  204932       1   0   May 27      -  0:02 ora_s000_HKCTS01
  oracle  209032       1   0   May 27      -  0:01 ora_d000_HKCTS01
  oracle  213130       1   0   May 27      -  0:11 ora_arc1_HKCTS01
  oracle  794708       1   0 16:39:02      -  0:00 ora_j001_HKCTS02
  oracle 1151118       1   0 16:40:43      -  0:00 ora_j003_HKCTS01
  oracle  102698       1   0   May 27      -  0:51 ora_smon_HKCTS02
  oracle  143644       1   0   May 27      -  0:45 ora_lgwr_HKCTS02
  oracle  164306       1   0   May 27      -  0:56 ora_dbw0_HKCTS02
  oracle  176408       1   0   May 27      -  0:43 ora_dbw2_HKCTS02
  oracle  180518       1   0   May 27      -  0:00 ora_reco_HKCTS02
  oracle  270708       1   0   May 27      - 22:02 ora_lgwr_HKCTS01
  oracle  278916       1   0   May 27      -  1:58 ora_smon_HKCTS01
  oracle  283006       1   0   May 27      -  7:09 ora_ckpt_HKCTS01
  oracle  287108       1   0   May 27      -  2:04 ora_cjq0_HKCTS01
  oracle  291204       1   0   May 27      -  0:22 ora_reco_HKCTS01
  oracle  303544       1   0   May 27      - 1053:51 ora_j000_HKCTS01
  oracle  754080       1   0 16:39:02      -  0:00 ora_j002_HKCTS02
  oracle 1052986       1   0 16:39:03      -  0:00 ora_j004_HKCTS02
  oracle 1118596       1   1 16:27:02      -  0:05 ora_j003_HKCTS02
  oracle  131616       1   0   May 27      -  0:01 ora_d000_HKCTS02
  oracle  139894       1   0   May 27      -  0:00 ora_arc1_HKCTS02
  oracle  197260       1   0   May 27      -  0:01 ora_s000_HKCTS02
  oracle  209554       1   0   May 27      -  3:14 ora_pmon_HKCTS02
  oracle  262750       1   0   May 27      - 20:01 ora_dbw0_HKCTS01
  oracle  279150       1   0   May 27      - 14:59 ora_arc0_HKCTS01

那么这些代码 用的也是SGA 也属于共享内存

还有 
如果SGA过大...pgsp一样会被频繁使用
请说出你的理由 

2008-6-17 16:55 kokohei
[quote]原帖由 [i]yurual[/i] 于 2008-6-17 11:06 发表 [url=http://www.loveunix.com/redirect.php?goto=findpost&pid=798438&ptid=86018][img]http://www.loveunix.com/images/common/back.gif[/img][/url]
Configuring a Database Server That Uses Filesystem Files
Scenario
This scenario is similar to the previous example, except that the database files are
filesystem files and not raw LVM files. I ... [/quote]

根据你给出的文档和你楼上的解释
我是不是可以认为
(前提 系统除了oracle以外不再有其他应用 不考虑系统内核本身使用的page)
如果采用file system的话 oracle的SGA是属于Comp类型 
但是在刷数据出SGA时候 出现double cache File system会把这些数据cache起来 这部分属于Noncom类型
所以如果用raw的时候就只会有Comp类型

对吗?

2008-6-17 17:06 netbbs
我认为对,
所以如果数据库是文件系统的话,要用vmo调整

2008-6-18 09:18 kokohei
继续顶下

2008-6-18 09:23 lj_cd
使用文件系统时你不用CIO或DIO?

2008-6-18 18:04 FromHell
[b][color=Blue]Sharemem 对AIX来说 当系统内存不足时 ShareMemory 一样会被swap到swapDevice上[/color][/b]
这个就是SGA过大 pgsp被频繁使用的原因 因为SGA你设置的过大 系统本身可用内存不足 反而会引起频繁换页 SGA本身只是ShareMem,当然会被OS作为候选对象换至swapDevice 你可以想象这种情况有多糟糕

所以AIX有一个kernel parameter v_pinshm 配合系统调用shmget() 可以将用户创建的sharemem pin 在内存里..在这种情况下 system 会尽量不去碰你的sharemem 在这种option下 如果SGA设置不合理 swap频繁发生时..你的oracle后台进程就有很大的比率被换到swap...我指的代码被换 是指这些后台process本身的代码段 数据段 堆栈等等...这些后台oracle process是访问SGA 不是说他们是SGA的一部分..这种情况也很糟糕 因为oracle用来访问SGA的代码都被换到swap去了 系统可能会马上产生颠簸现象(thrash)

2008-6-18 22:23 larryh
凡是硬盘上有对应的数据,占用的内存,就是非计算内存,非计算内存需要被别的进程用到时,其中的数据无需page out,因为再次需要读取的时候从硬盘文件中拿出来即可。

凡是硬盘上没有数据对应的内存占用叫做计算内存,例如用C写个程序,分配一块1MB的内存,这部分内存不管其中数据是否有意义,硬盘上没有文件对应,叫做计算内存。

以上所谓“硬盘上有无对应数据”的前提是:计算内存、非计算内存是操作系统的分类,所以操作系统知道硬盘上有对应,才叫非计算内存。虽然任何数据库的内存占用绝大部分是磁盘缓冲,按理说其中的数据硬盘上有对应,但是,这些内存是数据库管理的,操作系统不知道其中是什么,操作系统只知道这些内存是DBMS主动向操作系统申请的,其中放的什么,操作系统并不知道,所以是计算内存

2008-6-18 23:54 小猪
学习了.:lu11: :lu11:

页: [1] 2


Powered by Discuz! Archiver 5.5.0  © 2001-2006 Comsenz Inc.