可见我们在优化数据库性能的时候,有时还不能够光从数据库服务器着手。必要的时候,我们需要换一个角度,从操作系统出发,调整操作系统的相关配置,也能够明显的提高数据库的性能。

  要实现这个转变,其实很简单。在Windows操作系统中,有一个BOOT启动配置文件。为了让数据库服务器支持3GB的用户模式进程空间,必须在这个配置文件中,加入一个/3gb的参数,然后重新启动操作系统即可。这么设置之后,应用程序就可以寻址3GB的进程地址空间
,而为操作系统保留1GB的内存空间。

误区八:如果其他应用程序也需要内存,SQL server会释放一部分自己的内存,以保证其他应用程序能够正常运行。

SQL
Server不会为其他程序释放自己以占用的内存,只有在操作系统遇到内存压力时,才会根据操作系统的要求减少自己的内存占用量。

但如果SQL
server启用了锁定内存页的,那即使是操作系统有要求,其内存也不会释放。因为锁定内存页会使SQL
server占用的内存长久保留在物理内存中,避免被分页到虚拟内存中去,这是提升SQL
server性能的常见做法。在SQL
Server的推荐配置中,我们经常建议客户这样做。不够为了避免内存占用太大,可以通过设置最大内存来限定内存的使用上限。

不过在调整这个配置后,如果在站台服务器上还部署有文件服务器的话,那么这个文件服务器的性能就会受到比较大的影响。因为对于文件服务器应用来说,需要比较大的文件缓存量。为此在某种程度上来说,数据库服务器与文件服务器在这方面是相互冲突的。数据库管理员就需要相互权衡,然后确定一个最佳的处理方案。不过一般情况下,不建议将数据库服务器与文件服务器、打印服务器等等部署在同一个服务器上。因为这三种不同的应用,彼此之间的资源争用还是很厉害的。为此会给数据库的性能带来比较大的负面影响。

  二、为SQLServer启用更高的内存支持

误区七:增加内存一定能够提升SQL server的性能。

数据库虽然会尽可能多的占用内存,但并不意味增加内存就一定是越多越好,就如同上文说的,如果数据库的内存长期没有什么压力,增加内存也不会带来性能的提升。

另外,在32位 的SQL
server中,在数据库启动时就为连接、查询计划、第三方dll、链接服务器等分配了固定大小的multi-page(上文在介绍AWE时已有介绍),因为multi-page的大小不会随着内存的增加而改变,所以即使增加内存,也无益于这些功能、组件,而只是为增大了数据缓存。

备注:在64位的SQL server中,multi-page的大小没有限制。

 

这个处理策略对于远程客户端来说确实有用,至少可以在感觉上缩短用户的等待时间。而且可以让用户先进行其他的操作。但是如果在本地客户端上,处理某些作业的时候,可能并不希望如此。如在本地客户度进行物料需求计划测试,数据库管理员希望即时把这个计划放置在后台运行,其也能够与前台应用程序具有相同的优先级,以减少这个处理时间。所以,当数据库管理员遇到类似情况时,就需要调整操作系统的相关设置,让作为在后台运行的应用程序,也能够与前台运行的其他应用程序具有相同的优先级。

  默认情况下,即使服务器操作系统支持4GB以上的内存空间,可是数据库应用程序并不一定支持。为了让SQLServer应用程序也支持这个,就必须更改数据库的配置参数。也就是说,需要将这个选项的值设置为1,然后重新启动数据库系统。这个配置比较简单,只需要利用命令sp_configure
‘awe enabled’,
1即可。不过在进行这个配置之前,需要注意两个细节方面的内容。一是数据库用户需要这个操作的权限。二是这里有一个BUG,即在SQL
Server数据库中会有一个错误信息。数据库管理员可以忽略这个信息。

误区三:SQL Server进程不会使用超过最大内存设置的内存大小。

在SQL server的sp_configure中有一个max server memory
(MB)的配置项(SSMS中右击实例,在属性中选择内存也可以看到),我们很多人以为设置了这个值以后SQL
server的进程不会使用超过这个大小的内存。

其实不然,max server memory (MB)只是buffer pool的上限。但是在SQL
server的内存中,不仅仅包括buffer
pool,还有multi-page的内存,对于这部分内存,是无法通过max server memory
(MB)来限制的,所以,在实际环境中,我们可能会看到sqlservr.exe这个进程会占用的内存会超过max
server memory (MB)设定的值。

备注:一般情况下,multi-page占用的空间不会很大,因此,通常我们将max
server memory (MB)约等于SQL server进程占用的内存大小。

 

最后需要说明的一点就是,虚拟内存并不是越大越好。如果设置为10倍、20倍,那么这是浪费。以往内存中没有这么多的内容可以往虚拟内存中存放。所以,针对SQL
Server数据库与Windows服务器来说,4倍于物理内存的虚拟内存已经足够了。设置的再大的话,就没有多少的实际意义了。

  但是,在实际应用中,操作系统往往用不着多大2G的内存。根据笔者的经验,一般只要为操作系统保留1G的内存已经足够其使用。只要没有病毒等不良因素作怪,这个内存不会被完全适用。如此的话,应用程序可以采用的内存空间就会多达3G,比原先整整多出一个G来。

误区四:设置了SQL Server的最小内存,表示SQL server启动时就会使用到这个大小的内存。

在SQL server的最小内存也是通过sp_configure配置,配置项为min server
memory
(MB)。该配置项默认为0,表示不限定最小内存,如果设置成某个具体值时,比如2G,表示当SQL
server占用的内存超过这个大小后,就不会再低于这个值。而不是说SQL
server启动时就马上达到这个值。

这种机制的好处就是避免SQL
server的内存被操作系统不断挤占,这样当负载一旦起来,数据库可以立即使用内存而不需要向操作系统申请内存。(当数据库申请时不见得操作系统有多余的内存分配给数据库,这时数据库就只能歇菜了)。

因此合理设置数据库的最低内存也是十分重要的。微软建议的最小内存值为服务器总内存减去1-2G,跟最大内存的值差不多。(前提是这个服务器制作数据库服务器)

参考资料:

 

具体来说,可以按如下步骤来调整这个选项,以提高服务器的性能。首先,依次打开控制面板、选择网络连接、单击本地连接。然后打开常规选项卡,选择属性。在本地连接属性对话框中选择常规选项卡,选择微软网络的文件和打印机共享,并单击属性。在弹出来的对话框中,去掉“最大化文件共享数据吞吐量”选择,可以选择“最大化网络应用程序的数据吞吐量”。然后按确定即可。如此操作系统就会自动调整内存的分配,不会给文件缓存保留很大的空间,从而可以提高数据库内部处理的性能。往往这对于事务性的应用系统很有作用,能够在很大程度上提高数据库的性能。

  一、让数据库应用程序支持3GB的内存空间

 

虚拟内存简单的来说就是内盘中的一块空间。当物理内存不够时,操作系统会自动把某些驻留在内存中暂时不用的内容移植到这个在硬盘上的虚拟内存中,以释放更多的空间给新的应用程序使用。也就是说,当物理内存使用完时操作系统会拿出一部分硬盘空间来充当内存使用,以缓解内存的压力。为此从某种程度来说,这个虚拟内存的设置也会影响到数据库服务器的性能。那么这个虚拟内存到底该设置多少为好呢?这没有一个固定的标准。这需要数据库管理员根据部署的应用来确定。

  有时候,这个小小的配置可以在很大程度上提高数据库的性能。记得有一次,笔者为一家企业优化数据库性能。笔者查看了用户的数据库环境之后,就建议用户增大数据库服务器的内存,从2G增加到4G.可是,效果并没有很大的改善。正当笔者束手无措的时候,就想到了改变操作系统与应用程序的内存分配方式。为此,笔者就更改了BOOT启动配置文件,只给操作系统保留1G的内存空间。重新启动后,数据库性能得到了很大的改善。

误区二:在开启了AWE后,SQL Server的所有功能一定能使用超过2G的内存。

在SQL server进程中,内存并非全部由SQL
server的数据缓存所使用,部分通过SQL server调用的第三方代码、加载在SQL
server内部的其他dll、SQL
server连接、链接服务器、编译缓存、查询计划缓存等也会使用SQL
server进程中的内存。

这部分组件或者功能在申请内存时与传统的数据缓存申请的方式不同,因为他们通常会申请大于8KB的内存页,这种内存区域为multi-page(以前叫memtoleave)。对于multi-page占用的内存,是没法使用SQL
Server的AWE特性的,也就是说,在32位的SQL
Server中,数据库即使开启了AWE,也只能使用到2G的内存(用户态)。由此可见,AWE更多的是提升了data
page buffer pool的内存空间。

备注:在32位的SQL
Server中,multi-page的默认大小为256MB+sp_configure配置的最大线程数X512KB,它是SQL
server启动时就已经设定好的。

备注:在64位的SQL server中,multi-page的大小没有限制。

 

如数据库没有一些高级的应用,如数据仓库、全文索引或者不适多个应用服务一身的话,笔者认为只要把虚拟内存设置为物理内存的1.5倍即可。但是,如果在数据库服务器上配置了数据仓库或者全文索引的话,则这个1.5倍的虚拟内存往往是不够的。此时笔者建议需要把虚拟内存配置为物理内存的3倍到四倍。同时,需要调整数据库中的最大服务器内存选项,将其设置为物理内存的1.5倍。也就是说,其在使用内存的时候,可以使用虚拟内存大小的一半。注意这个设置时必须的,否则的话,调整数据库虚拟内存很难起到应有的效果。而且当以后内存升级了,则也需要同时更改这个两个参数。

  为数据库配置比较大的内存,可以有效提高数据库性能。因为数据库在运行过程中,会在内存中划出一块区域来作为数据缓存。通常情况下,用户访问数据库时,数据先会被读取到这个数据缓存中。当下次用户还需要访问这个数据时,就会从这个数据缓存中读取。因为在数据缓存中读取数据要比在硬盘上读取数据快几百倍。所以扩大数据库服务器内存,可以有效提高数据库性能,特别是操作大型数据库时效果更加明显。

误区一:SQL Server在32位操作系统只能使用4G内存

对于这个问题,我们从两个方面来看:

1.
在32位操作系统中,应用进程可以使用的虚拟地址空间大小为4G,其中2G是给核心态(操作系统),另外2G留给用户态(应用程序)。因此,SQL
server其实能最大利用的内存只有2G。

不过,这种核心态和用户态的分配方式是可以改变的,当在操作系统的启动文件(windows
server
2003的boot.ini)中开启3G开关后,便可以使得用户态的内存增加到3G,而只留1G给核心态,这样做的好处是可以使得SQL
server使用到3G的内存,不过坏处也很明显,因为减少了核心态的地址空间,在操作系统系统负载比较大时,可能会出现不稳定的风险。

(目前使用使用32位操作系统的客户越cong来越少,而且微软新推出的操作系统也都是64位,这种问题以后几乎都碰不到了。)

  1. 从windows server 2003到windows server
    2008,只要是标准版或者WEB版,且为32位架构时,操作系统最大也只能支持4G内存,即使按照上文1介绍的方法开启了3G开关,SQL
    server也只能使用最大3G的内存。

但如果是企业版或者数据中心版的操作系统时,同样是32位的架构,操作系统却最大可以支持到64G的内存(开启PAE的前提下)。但默认情况下SQL
server依然只能使用最大2G的内存。

因此,相比64G的操作系统内存来说,2G对数据库而言简直就是杯水车薪,资源浪费。为解决这个问题,微软为企业版和标准版的SQL
server(2005、2008)引入了AWE(地址窗口扩展)功能,你可以通过开启AWE来扩展SQL
server的可用内存,使之最大可以达到64G内存(实际上会小一点,因为操作系统本身需要占用部分内存)。

总结起来,可以用一个表格来描述上面两个场景:

操作系统类别

SQL Server可用地址空间

备注

32位

2G

 

32位+/3G开关

3G

 

32位(标准版、企业版)+SQL Server AWE

64G(标准版、企业版)

 

32位(标准版、企业版)+/3G开关+SQL Server AWE

16G(标准版、企业版)

这个是参考资料的,实际场景下我没有用过。

 

三、 限制系统内存用户文件缓存的大小。

  第二步:启用Awe Enable选项。

误区五:SQL server占用内存特别大,说明SQL server有问题。

常见的关系型数据库都有这个特点:数据库就会尽可能的占用服务器的内存,而且这些占用的内存中即使很大部分空闲也不会释放,除非操作系统遇到内存压力,才会被操作系统重新分配。因此我们可以看到数据库服务器的内存使用率一般都会很高。

这其实并不是一个问题,反而是数据库的一个特性,就如文中首段说的,只有越多的数据缓存在内存中,数据库的读写效率才会越高,响应速度才会越快。这才是使用数据库的最佳方法。

不过,在很多场景下,服务器并非专用于数据库,为确保服务器上其他应用程序也能正常运行,我们必须为数据库设置最大内存,否则其他应用程序就会因为内存不足出现访问不流畅的问题。笔者曾碰到一个案例,某医院的HIS服务器必须每隔几天重启一次才能保证HIS业务能够被正常访问。原因就是因为数据库内存没有设置最大值,导致应用程序的内存被数据库挤占。

 

Author

发表评论

电子邮件地址不会被公开。 必填项已用*标注