美创科技技术社区

注册

 

发新话题 回复该主题

资源供给:内存和虚拟内存 [复制链接]

1#

      简单案例: 某客户运行在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改善。

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

分享 转发
TOP
发新话题 回复该主题