betway必威-betway必威官方网站
做最好的网站

Server内部存款和储蓄器精晓的误区,大内存SQLS

核心提示:SQL Server数据库与Windows操作系统来自同一个家庭

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

 SQL Server内存理解

SQL Server数据库与Windows操作系统来自同一个家庭,在技术上具有一定的共通性。我们可以调整Windows操作系统的一些参数来提高SQLServer数据库服务器的性能,使之更高效的运行。

  但是,现在企业中普遍采用的数据库服务器都是32位的操作系统。而这个32位的操作系统却有最大内存的使用限制。通常情况下,标准的32位地址最多可以采用4GB的内存。若数据库管理员想让数据库系统采用更多的内存来提高数据库的性能,则就需要进行额外的配置。下面笔者就介绍两种常用的配置方式,让SQLServer数据库服务器支持大内存,让其成为数据库的加速剂。

内存的读写速度要远远大于磁盘,对于数据库而言,会充分利用内存的这种优势,将数据尽可能多地从磁盘缓存到内存中,从而使数据库可以直接从内存中读写数据,减少对机械磁盘的IO请求,提高数据读写的效率。

一、 提高虚拟内存来提高数据库服务器性能。

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

内存对数据库而言是如此的重要,因此只要在涉及数据库优化的地方,我们都可以看到内存的身影。我们通常会想尽各种办法来优化数据库内存的使用,比如开启AWE、设置最大内存、锁定内存页等,但在很多时候,我们实际上都不知道某个配置是否一定能够解决当前的问题,或者我们误以为会解决当前的问题,出现这种现象的原因是我们对数据库的内存理解还不够透彻或者理解存在误区,本文我希望将结合自己的经验和《SQL Server 2012实施与管理实战指南》的内容,通过以【介绍SQL server常见内存误区】的方式跟大家分享下我对SQL server内存的理解。

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

  虽然操作系统支持4GB内存。可是,这并不会全部给数据库等应用程序使用。默认情况下,在32位操作系统中,将有2GB的内存空间是为操作系统所保留的。即使没有用完,其他应用程序也是不能够染指的。而包含SQL Server数据库在内的所有应用程序,只能过采用剩余的2GB内存空间。

 

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

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

误区一: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(标准版、企业版)

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

 

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

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

误区二:在开启了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的大小没有限制。

 

二、 调整本地客户端的任务优先级。

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

误区三: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进程占用的内存大小。

 

在数据库初始化的过程中,有大部分的任务需要在本地客户端上完成。即时在后续维护中,出于某种原因仍然要在本地客户端上操作。那么什么是本地客户端呢?其实本地客户端就是跟数据库服务器部署在同一台计算机上的客户端。如我们在导入期初数据的时候,为了方便会在本地客户端上直接进行操作。因为这可以节省数据在网络上传输的时间。

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

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

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

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

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

参考资料:

 

本文由betway必威发布于编程开发,转载请注明出处:Server内部存款和储蓄器精晓的误区,大内存SQLS

TAG标签: betway必威
Ctrl+D 将本页面保存为书签,全面了解最新资讯,方便快捷。