因为文件系统包含该数据的原始副本。
例如,如果一个应用程序正在读取某个文件,那么该文件数据将缓存于永久存储分页的内存中。这些永久存储分页没有经过修改,这意味着并没有在内存中对这些分页进行修改。因此,内存中的永久存储分页与磁盘中的文件数据完全相同。当 AIX 需要清空内存的时候,它只需要“释放”这些分页即可,而不将任何内容写入到磁盘。如果应用程序对某个文件进行写操作(而不是读操作),那么永久存储分页将是“经过修改的”,并且 AIX 必须在释放这些分页之前将其刷新到磁盘。
您可以将永久存储分页划分为两种子类型:
客户端分页
非客户端分页
非客户端分页是一些包含缓存的日志文件系统 (JFS) 文件数据的分页。非客户端分页有时也称为持久性分页。客户端分页是一些包含所有其他文件系统(例如,JFS2 和网络文件系统 (NFS))的缓存数据的分页。 ibm developer works上的!
正好要写aix 未公开的秘密,今天就把内存这个问题终结吧。。。哈哈,口气有点大,我没说我终结啊!等待黄老大、农老大、鸡老大、红旗老大、void老大、beginner老大以及各位隐
形埋名的世外高人老大总结
鉴于细节太多,本文为续,只针对以前疑问。具体请参考以前讨论。本文内容引自inforcenter, developerworks(为主,假定其为真实)及其它google搜索结果(为辅,参考),并且时间为今天,版本是5.3(以后ibm可能更新算法,所以不能确认永远如此)
page 虽然可以有超过4k的内存page,但为了简化讨论,一下均指4k。
PFT page frame table, 这是物理内存分配、状态表。所有物理内存都在表中有对应,大概4k的page用8位标记(这个不确认,还没来得及查找信息)。其中有内存地址、内存类型(分别是Working, Persistent, Client类型,这回答了Larry的问题)、最近是否被访问(reference)、是否被修改标记。
当由于程序看到的是全部vmm,因此无论申请内存还是访问内存,都会发生vmm地址和real mem地址的转换,这个是cpu中硬件完成,如果转换的地址不在real mem中,则发生mem fault,并触发内核处理,内核将在free memory中申请一块空间,并把需要的vmm数据读到此处(如果需要读入,如果新申请,当然就不用读入了)
根据一些参数,aix维护一个free memory的列表,这个已经讨论多次,暂时不提。如果free memory不足,试图释放一些real memory内存出来。reallrud首先开始扫描物理内存页(real memory=physical memory),检查此page最近是否被referenced,如果没有被reference,立刻释放,而并在第一次扫描的时候已经被reference,则清掉reference标记。物理内存被分为若干bucket,大小为vmo中lrubucket界定,缺省512M,第一次扫描完某个bucket之后,找不到可释放内存(这句话不确定,也可能无论怎样都扫描两遍),则重新再扫描一遍这个bucket,如果某页依然没被referenced,则释放。这两遍扫描的时间就是给内存是否被频繁referenced的缓冲时间,内存从来没reference,立刻释放,如果被reference过,则等一小段时间,再看。此内存很忙,很有可能在两遍扫描期间被referenced,这样该内存也就被保留下来,不会释放,如果没有,则释放。这种两遍扫描的策略,最大限度增加了可被释放内存的数量(如果大部分内存都不能被释放,lrud效率就变得很低),但同时给可能被频繁访问的内存留有机会。
不知道这种策略是否最好,但肯定不错。通过以上分析,如果更改lru bucket的大小可以极大地影响第二次扫描的结果,也就是如果lru bucket越小,则内存被referenced的可能性越小(扫描间隔越小,时间大约是用cpu做一遍bucket大小内存hash比较的时间,缺省是128KB,估计远在1微秒以内)。对于高速cpu系统,例如在若干GHz这种cpu速度下,这个时间可能太小,在此期间,通常都不会被reference,所以也许很没效率,就是最近被访问的页面也被弄出去了。注意,这部分不一定对应的paging space操作,但很可能对应文件系统操作。一个建议,如果系统具有极其巨大的内存,例如几百G,并且使用文件系统,不妨尽可能增大lrubucket,最大可达到系统所拥有的所有物理内存页面。反之,可以减到最小65536。本人不负责后果!haha vmstat的sr, fr可以观看结果。
有关repage, aix保存一个repage history buffer, 如果在一段时间第二次发生此page faults,则是repage faults。如果发生repage fault,系统会记录下来vmstat 1 的re一项既是。系统依然用512M大约128KB的 history buffer空间,置于能保留多长时间,那就看此page fault发生的频率了,也就是如果系统reference page越多,page fault的可能性越大,history buffer也对应的时间也就越短。
此参数在系统没有严重设计问题的时候(例如内存过小,或者分配不合理),应当没什么用,但一旦有repage(同样不能有pi, po),一定要想办法避免。
memory pools影响lrud的并行度,如果cpu多,可以最多设置为cpu数量。
strict_maxperm 影响file cache,也就是限定了系统分配给filesystem cache的最大值为maxperm。
不写了,休息,休息一会。