资源供给:内存和虚拟内存

        简单案例: 某客户运行在HP Unix上的Oracle数据库周期性的出现业务系统性能下降,甚至于业务系统挂起,每次都需要重新启动服务器来完成。服务器拥有很高的内存,数据库也没有分配太高的内存,原因当然也很简单,交换空间配置太少,使进程派生受限,导致进程空间的内存不断被交换到磁盘上,性能下降甚至于挂起。这类故障在当年是极为普遍的,几乎每个HP-UX用户都会遇到,现在可能随着操作系统特性的变更消失了。HP-UX在进程派生的时候,需要在交换空间复制一份进程数据,由于交换空间的不足导致HP-UX仅仅可以使用不超过交换空间的内存空间,即使你有32GB内存,如果交换空间只有2G,那么你也只能使用2GB的进程内存空间。

      内存或者虚拟内存,Oracle业务系统运行最为重要的因素。内存无所谓多和少,在Oracle数据库中,内存更多的表现为一个调和因素,为CPU提供低级的缓存,为IO提供高级的缓存,使CPU和IO处理之间调节剂。
      虚拟内存,实际内存+交换空间一起构成虚拟内存,Oracle实际上是在虚拟内存空间运行。可以看到,当Oracle访问的数据如果处于交换空间之中,访问性能将大幅度下降,内存访问的速度将降低到磁盘访问的速度。
     讨论内存,主要是几个问题:
    (1)、多少内存才足够?
    (2)、多少内存表示不足?
    (3)、如何更好让内存在CPU和磁盘之间协调?

   (1)、 多少内存才足够
    Oracle需要多少内存? Oracle需要SGA空间和进程空间。
    Buffer Cache是作为磁盘系统的缓存,只要访问进程需要Buffer cache的时候有足够的内存可用,就意味Buffer cache的分配是足够的。free buffer waits等待事件体现了Buffer cache的内存是否足够。
    Shared Pool是作为CPU系统缓存,内存空间可多可少,只要不出现ora-4031错误就可以认为shared pool是够用的。
   SQL workarea作为访问进程的工作区域,只要大部分的排序区域可以在SQL workarea中运行,就表示足够了。
   进程私有空间,每个进程都需要一定的私有内存,多少进程数量决定了进程私有空间的大小。

   从Oracle运行来说,只要具有一定的内存就可以运行,而且可以运行的很好。

  (2)、多少内存表示不足?
   很多人用free来剩下多少内存来表示内存空间是否足够,事实上这个是不准确的。任何操作系统设计为了性能追求,都是贪婪型设计,也就是说只要有内存总会被吃完,free空间的多少并不反映内存是否足够,绝大部分系统即使你拥有几百GB的内存,内存剩余空间也是很少的。当然这个free值是我们快速获取内存是否足够的指标之一,他某种程度上反映了处于空闲列表中的内存块数量,其数量越多意味着内存分配的效率会越高。
   对于内存来说,基本上而言只有活动和脏的数据块可以被认为是被使用的,其他都可以被认为是自由空间。
   多少内存才表示不足?
   (1)、当你的进程需要内存的,发现已经没有内存可用,需要把脏块写到交换空间,等待内存空闲出来再分配。
   (2)、当你的进程访问数据的时候,发现数据不在内存空间中,需要从交换空间把数据去读出来。
   (3)、当你的进程需要内存的时候,需要扫描太多的内存块去发现自由空间以提供分配。

    也就是说:process page in(pi),process page out(po),search page depth(sr),page replace number(fr),基本决定了内存是否足够。
   主要的内存是否不足查看的命令:
   vmstat 
   free
   sar
  另外除了process page in(pi)和process page out(po)之外,page in和page out是由操作系统lru算法持续进行的工作,他总是把一些看起来不常用的页面交换到交换空间,把脏数据块写到交换空间。大家只要想象一下Oracle dbwr进程如何工作就可以了。

   (3)、内存作为CPU和IO的协调器
    服务器系统的发展,使内存成为最廉价和最容易调整的单元。CPU很难扩容,IO子系统的能力增强扩容也很难,往往涉及到大规模的投资和实施成本,只有内存的扩容在很多情况下采购成本低,业务成本低,是一种简单可以选择的方向。在现在的内存廉价时代,性能优化者可以考虑把增加内存配置作为一个重要的优化选择项。
   
   内存作为IO的缓存:
           内存和IO的速度差异至少100倍以上,甚至高达1000倍,通过更多的内存使IO结果缓存在内存中,使访问磁盘的IO数量降低而提高性能。
           分配更多的SGA区域: 减缓各种磁盘IO
           分配更多的内存:       访问进程从来不到交换空间获取数据,也从来不为了内存空间窃取内存页面。

    内存作为IO的替代:
           对于Oracle来说,直接把一些IO频繁的表格和索引Cache在内存中,使其从根本上消除IO。

     内存作为文件系统缓存:
           文件系统缓存对于Oracle全表扫描具有一定意义,但一般不建议如此,除非你有多的发闲的内存,同时缓存数据库又觉得不足。

    更多的内存访问带来的CPU压力:
  
     更多的内存访问将使CPU的压力加大,加大的压力来自于两个方面:
    (1)、内存维护操作
    更大的内存链会带来更高的维护成本,需要消耗更多的CPU
    (2)、大量内存操作将使CPU始终处于工作状态,表面看来会导致CPU使用率升高。

    更多的内存访问会带来更大的IO压力
   
    运行速度更快之后将会有更多的IO指令被压上IO子系统,可能由于缓存被消除的IO被其他IO迅速填补,表面上会发现并没有IO改善。

   总之,在当今的性能优化时代,尽可能妥善的使用内存吧,可以很大程度上简化我们的性能优化工作。
  

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/92650/viewspace-776237/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/92650/viewspace-776237/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值