充裕的内存可以减少磁盘IO,在数据库系统中磁盘IO是极其昂贵的开销。当用户访问资料时如果在缓存中能够找到的话称之为“逻辑IO“,否则从磁盘读取称之为“物理IO“....
充裕的内存可以减少磁盘IO,在数据库系统中磁盘IO是极其昂贵的开销。当用户访问资料时如果在缓存中能够找到的话称之为“逻辑IO“,否则从磁盘读取称之为“物理IO“
内存问题大致是以下几个方面:
1.总的数据高速缓存太小。
2.过程高速缓存太小。
3.在SMP系统中只配置了缺省高速缓存,导致对高速缓存的争用。
4.高速缓存大小不适用于特殊的应用。
5.IO大小不适用于特定的应用。
高速缓存分类:
1. 数据高速缓存。用于数据,索引和日志页
2. 过程高速缓存。用于存储过程和触发器以满足短期内存需求。
确定过程高速缓存的大小可用以下办法实现:
过程高速缓存大小=最大用户并发数目*最大的计划大小*1.25
具体如下:在使用一段时间的服务器上用dbcc traceon(3604)将信息写到屏幕,然后运行dbcc memusage确定最大的查询计划的大小,然后根据应用确定并发用户数量就可以大约得到高速缓存的大小了。其实在我们的ERP应用中最大的计划所需内存在450K左右,所以,一般来说,过程高速缓存的大小到100M肯定是够用的,并且当过程高速缓存不够时会有701的错误发生。
Sybase default只有”default data cache”,并且只有一个2K的缓冲池,对于大多数的情况这都是不适合的,我们需要建立命名高速缓存并将对象绑定到高速缓存。
Sybase支持的缓冲池大小有2K,4K,8K,16K。给tempdb建立单独的命名高速缓存,并合理分配缓冲池,一般4K的log IO的大小能够得到比较好的性能。在SMP的环境中还有一个问题就是螺旋锁的竞争,当用sp_sysmon观察到资料缓存螺旋锁争夺超过10%时就需要分区。sp_cacheconfig ‘cache name’,’cache_partition=X’就可以对缓存进行分区了。
sp_sysmon是ASE用来监控服务器在特定采样期间内的数据库的活动。在典型负载情况下能够提供服务器运行状况的描述,是性能调整的重要工具。以下的一些信息不是同sp_sysmon的输出顺序一样,但需要重点注意,这些信息来自Sybase的性能调整手册,仔细看了后觉得说的很是简洁明白,也就没有加入设么自己的东西了。其用法很简单,sp_sysmon “HH:MM:SS”即可,但sp_sysmon在运行时对性能有影响,特别是在SMP环境下。还有有时sp_sysmon并不能提供完全正确的资料,例如采样时间太长或者太短。
Data Cache Management
Cache Statistics Summary (all caches)
Cache Turnover (缓存周转)
Buffers Grabbed (缓存抢夺。所有缓存中替换的缓冲区数量)
Buffers Grabbed Dirty (缓存抢夺脏页。如果此值不为0代表严重性能问题)
Large I/O Effectiveness (大I/O效率)
Page by LRG I/O cached
Page by LRG I/O used (此两条信息报告由大I/O引入到高速缓存中及使用的页)
Asynchronous Prefecth Activity (异步预取活动)
APF issued (APF成功应用的次数)
APF Denied due to (不被大I/O的原因)
APF I/O overloads (缺少磁盘I/O结构或者由于磁盘信号争用而被拒绝的次数。如果因磁盘信号争用而引起检查高I/O发生处的对象物理放置)
APF Limit overloads (超出可用于异步预取的缓冲池的百分比。此值由global async prefetch limit所影响)
APF Reused overloads (由于页链扭结或因APF引入的缓冲区在被使用前换出而使APF被拒绝)
APF buffers found in cache (报告在资料高速缓存中找到的来自APF预先设置的缓冲区数量。异步预取使用快速扫描在资料高速缓存中尝试查找其需要的页,而不持有高速缓存螺旋锁。如果此操作不成功,则持有螺旋锁全面扫描)
Other asynchronous prefetch statistics
APF used (报告由异步预取引入高速缓存并在采样期间使用的页数)
APF wait for I/O (一个进程被迫等待异步预取完成的次数。这表示欲取未能及时发生,从而使页未能在查询前位于高速缓存中。此值有一定百分比是合理的,原因如下:
1. 第一个预取请求肯定需要等待
2. 顺序扫描到新的分配单元并发出预取请求是,查询需要等待直到第一个I/O完成
3. 每次费集群索引扫描找到一组限定行并发出预取请求时,需等待
LRU buffers Grab (LRU缓存争夺。”LRU buffers grab”仅在一页代替另一页时才替增。如果内存池对吞吐量来说太小,则可能会有这样的结果:池中周转率很高,高速缓存命中率降低及I/O增加。如果某些池中周转率很高而其它池中却很低,也许希望将活动性低的池中的空间移动到活动性高的池中,尤其在能够提高缓存命中率的情况下。)
(如果池中有1000个池而ASE每秒替换100个缓冲区,则每秒有10%的缓冲区在周转。这也许说明缓冲区在高速缓存中停留的时间不足以使对象有机会使用此高速缓存)
Grabbed dirty ( 写入磁盘前到达LRU的脏缓冲区数量的统计信息。当ASE需要从高速缓存的LRU端争夺一个缓冲区用以从磁盘读取一页,却找到一个脏缓冲区而不是干净缓冲区时他必须等待脏缓冲区I/O完成。)
(如果grabbed dirty非0,表示对于池中的吞吐量来说池的清洗区太小。补救措施取决于池的配置和使用情况:
1. 如果池很大且用于大量资料更新操作则应增加清洗区大小
2. 如果有几个对象使用此高速缓存,将其中一些对象移动到其它高速缓存中能够有所帮助
3. 如果高速缓存正由create index使用则高I/O率可引起脏缓冲区争夺,尤其在较小的16K池中。此情况下,可将其清洗区设置尽可能大,可达池中缓冲区的80%
4. 如果池非常小且周转率非常高则应考虑增加池和清洗区大小
5. 高速缓存已






