Chinaunix首页 | 论坛 | 博客
  • 博客访问: 426702
  • 博文数量: 239
  • 博客积分: 8010
  • 博客等级: 中将
  • 技术积分: 2431
  • 用 户 组: 普通用户
  • 注册时间: 2008-06-02 21:12
文章分类
文章存档

2008年(239)

我的朋友

分类: Sybase

2008-06-18 00:10:12

数据库系统

1.  系统内存的整体管理

 

SYBASE系统中,可以使用下列配置参数,对整个数据库系统的内存空间使用进行设置:

1MAX MEMORY(最大内存):设定整个数据库系统实例可以使用的最大内存数量,包括缓冲数据、程序代码的内存空间。

2TOTAL LOGICAL MEMORY(总逻辑内存):显示整个数据库系统所需内存空间的总和。该参数是一个只读的配置参数,用户无法更改。它是数据库系统根据所有和内存分配有关的配置参数的设置,进行计算而得出的系统所需内存空间的总和。这个配置参数的值必须小于或者等于最大内存,否则数据库系统无法启动。

3TOTAL PHYSICAL MEMORY(总物理内存):显示整个数据库系统在特定时刻使用的内存空间总和。该参数是一个只读的配置参数,用户无法更改。它显示数据库系统所有内存空间的总和,也即数据库系统实例在某个特定时刻所分配的内存空间总和。

4ALLOCATE MAX SHARED MEMORY:设定数据库系统启动时,是否立即为系统分配所要求的最大内存。如果该参数被设置,将按照最大内存配置参数的设置,为数据库系统分配内存空间。在这种情况下,总物理内存就等于最大内存,如果数据库系统需要的总逻辑内存小于最大内存,则为数据库系统分配的部分内存空间不会被使用。

5DYNAMIC ALLOCATION ON DEMAND:设定数据库系统启动时或者系统正常运行过程中改变了配置参数之后,是否立即按照配置参数,为系统的各个内存段分配所要求的空间。如果该参数被设置,将根据配置参数的设置,进行内存空间的分配,不管这些内存是否被用到。如果该参数没有被设置,将根据数据库系统的需要,为各个内存段分配空间。

在主机内存空间足够的情况下,为避免系统正常运行时动态的内存空间分配,导致内存空间不连续,影响到数据库系统的性能,可以设置配置参数ALLOCATE MAX SHARED MEMORY,从而在数据库系统启动时就为其分配连续的、可使用的最大内存空间。

需要说明的是,由于SYBASE系统在估计内存需求的方式和实际获取内存以供使用的方式上有一些差异,因此理论上在最大内存、总逻辑内存、总物理内存之间应当具有相等关系时,使用系统命令查看,这三个配置参数在数值上会有一些差别。

 

2.  系统内存的空间结构

 

整个SYBASE系统的内存结构大体上可以分为四个部分:数据高速缓存(data cache)、过程高速缓存(procedure cache)、内核和服务器结构(kernel and server structure)、可执行代码,具体的结构见图1-6

1)数据高速缓存

数据高速缓存用来存放用户数据、索引和事务日志,就是第3.2.3和第3.2.5两节中讲到的用户数据缓冲区和日志缓冲区

在缺省情况下,日志缓冲区并没有被设置。代理线程生成的事务日志存放在自己的私有内存空间中,由代理线程写入磁盘。为提高数据库系统的性能,可以在数据高速缓存中配置日志缓冲区。这样代理线程将事务日志写入日志缓冲区,最后由日志写线程统一写入磁盘,可以减少磁盘的I/O操作。

下列配置参数和数据高速缓存有关:

TOTAL DATA CACHE SIZE:显示数据高速缓存的大小,是一个只读参数。用户可以使用命令sp_cacheconfigsp_poolconfig,配置和管理数据高速缓存。

2)过程高速缓存

过程高速缓存用来存放存储过程、触发器、SQL语句等已编译的执行计划,就是第3.2.4一节中讲到的SQL语句缓冲区。下列配置参数和过程高速缓存有关:

procedure cache size:设定过程高速缓存的空间大小。

3)可执行代码内存区域

可执行代码内存区域用来存放数据库各种线程的执行代码,这部分加上后面的线程控制信息及堆栈缓冲,就是第3.2.1一节中讲到的进程缓冲区

这部分内存空间的分配,由用户连接数(也即代理线程数)和工作线程决定,有以下相关配置参数:

NUMBER OF USER CONNECTIONS:设定数据库系统可以建立的用户连接数目。该参数也同时决定了数据库系统可以启动的代理线程的数目。

NUMBER OF WORKER PROCESSES:设定数据库系统可以启动的工作线程数目。

4)内核和服务器结构内存区域

内核和服务器结构内存区域是SYBASE系统既关键又复杂的内存空间,除数据高速缓存、过程高速缓存、可执行代码内存区域所存放信息之外,所有其它系统信息都存放在这一内存空间。

SYBASE系统的技术资料中,没有对这部分内存的使用进行详细的描述。大体上来说,这部分内存空间包括以下的内容:

线程的控制信息及堆栈缓冲

线程的控制信息及堆栈缓冲用来存放线程的堆栈、控制信息等,这部分加上前面的可执行代码内存区域,就是第3.2.1一节中讲到的进程缓冲区。这部分内存空间的分配,由用户连接数(也即代理线程数)和工作线程决定,有以下相关配置参数:

NUMBER OF USER CONNECTIONS:设定数据库系统可以建立的用户连接数目。该参数也同时决定了数据库系统可以启动的代理线程的数目。

NUMBER OF WORKER PROCESSES:设定数据库系统可以启动的工作线程数目。

STACK SIZE:设定每个线程使用的堆栈空间。线程使用此区域存放线程环境及本地数据。

HEAP MEMORY PER USER:设定每个用户的堆内存量。需要更多堆栈中内存的任务,可以从这里获取所需内存。

USER LOG CACHE SIZE:设定每个线程的日志高速缓存空间。

数据字典(元数据)高速缓存

数据字典高速缓存用来存放数据库以及表、索引、视图等信息,3.2.2一节中讲到的数据字典缓冲区。用户可以通过间接的方式,来配置该部分的内存空间。下列配置参数和数据字典高速缓存有关:

NUMBER OF OPEN DATABASES:设置能够同时打开的数据库的最大数量。

NUMBER OF OPEN INDEXES:设置能够同时使用的索引的最大数量。

NUMBER OF OPEN OBJECTS:设置能够同时打开的数据库对象的最大数量。

锁表高速缓存

锁表高速缓存用来存放数据库系统中的所有锁信息,就是第3.2.6一节中讲到的锁表缓冲区。下列配置参数和锁表缓冲区有关:

NUMBER OF LOCKS:设定数据库系统中所有用户可用锁的总数。

 

3.  用户数据缓冲区的管理

 

SYBASE系统中,数据高速缓存就是第3.2.3一节中讲到的用户数据缓冲区SYBASE系统采用多缓冲区技术。在最初的安装、配置完成后,系统中只有一个缺省的数据高速缓存。随后用户可以根据自己的需要,创建多个数据高速缓存。可以将经常需要访问的数据库对象绑定到特定的数据高速缓存中,在做了这样的绑定操作之后,该数据高速缓存就只供被绑定的数据库对象使用,从而避免和其它数据库对象的内存竞争。没有明确进行绑定的数据库对象,就使用系统缺省的数据高速缓存。

用户可以使用以下两种方式,进一步深化对数据高速缓存的管理:

1)分区。可以将数据高速缓存分区,相当于在系统中建立了多个数据高速缓存,每一个分区都具有相同的内存空间,并独立地进行管理和维护。

2)划分缓冲池。一个数据高速缓存可以被划分为多个缓冲池,每一个缓冲池对应不同的I/O读写尺寸。例如:数据库的逻辑页为2K,可以在一个数据高速缓存中创建页尺寸分别为2K4K8K16K的四个缓冲池。由于系统一次最大可以从硬盘中将一个扩充(extent8个数据页)读入内存,如果使用16K缓冲池,则一次可以从硬盘中读取128K的数据。

SYBASE系统中,使用MRU/LRU链接表管理数据高速缓存中内存页的替换。正在被访问的内存页被放入MRU的最前端,越靠近LRU端的内存页,就表明有更长的时间没有被访问。

MRU/LRU链接表的中间有一个清洗标记,清洗标记和LRU端之间的内存页称为清洗区。在清洗区中已经被更新的内存页,就要由页清除线程写入磁盘。MRU/LRU链接表的结构见图3-2。在该图中,整个数据高速缓存包含了21个内存页,数字表示内存页的指针。

 

 

代理线程在处理用户请求时,首先在整个数据高速缓存中查找所要处理的数据,有以下两种结果:

1)找到所需数据。不管该数据存放在数据高速缓存的什么位置,系统把该内存页的指针联接到MRU的最前端,整个数据高速缓存链就相应地由左向右进行移动。如果有内存页进入清洗区,并且内存页中的数据已经发生了更新,页清除线程开始把此内存页写入磁盘。

2)没有找到所需数据。代理线程从磁盘中读入数据。如果需要一个内存页的空间,系统就取出LRU端的最后一个内存页指针,找到指针所指向内存页的位置,存入刚读入的数据,然后把这个内存页的指针联接到MRU的最前端。在需要多个内存页时的处理方式,与此类似。同样,进入清洗区的内存页如果已经被更新,页清除线程开始把此内存页写入磁盘。

以上是数据高速缓存缺省的管理模式,其中包含了数据高速缓存的两种管理策略:内存替换策略和MRU数据存放策略。用户可以根据需要,改变这种管理方式。

1)内存替换策略。数据高速缓存的内存替换策略有两种:严格LRUstrict LRU)和宽松LRUrelaxed LRU),可以通过sp_cacheconfig命令来设置。

严格LRU是缺省模式。在此模式下,数据库系统严格地维护内存页的MRU/LRU链接表,根据这个链接表分配内存空间。在维护链接表时,由于内存页的移动而需要改变内存页的指针,从而需要对这个链接表加螺旋锁。如果系统中有多个引擎时,尽管链接表被锁定的时间很短,仍旧会引起对链接表的竞争。由于每个数据高速缓存、数据高速缓存中的每个分区、数据高速缓存中的每个内存池都需要建立一个链接表,因此可以通过建立多个数据高速缓存、将数据高速缓存分区、在数据高速缓存中建立多个内存池,来减少对链接表的竞争。

在宽松LRU模式下,系统并不会严格地维护这个链接表,尽可能地减少对MRU/LRU链接表的锁定竞争。在数据高速缓存中的空间能够满足该数据高速缓存所绑定的对象,或者该数据高速缓存主要用做日志的缓冲时,可以设置数据高速缓存为此模式,从而减少由于维护链接表而需要消耗的开销。

2MRU数据存放策略。通过表扫描、索引扫描访问数据时,系统会使用预读取功能,将随后要处理的数据事先读入内存。对这些预先读取的数据,可以使用、也可以不使用MRU数据存放策略。

如果使用MRU数据存放策略,被预先读入内存的数据首先链接在MRU/LRU链接表的MRU一端,被使用时就移动到清洗区。这种数据使用方式,一方面可以让这些大批量、一次性的数据尽快移出内存,避免影响其它数据的LRU替换管理;另一方面也可以防止预先读入内存的数据,还没有使用就被移出内存。

如果不使用MRU数据存放策略,被预读取数据在MRU/LRU链接表中就按照正常的数据访问方式进行管理。

用户可以在SQL查询语句中指定该语句的MRU数据存放策略,也可以使用sp_cachestrategy命令,改变某一个数据库对象的MRU数据存放策略。确省情况下,数据库对象的MRU数据存放策略被设置。

阅读(893) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~