SQL Server内存理解的误区(2)

在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进程占用的内存大小。

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

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

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

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

参考资料:

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

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

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

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

误区六:内存使用率高说明数据库服务器的遇到了内存压力。

(影响SQL Server性能的因素很多,不过因为本文的中心是谈谈内存因素与SQL server的关系,所以其他因素不在本文考虑范围内。)

如果一个DBA因为数据库服务器的内存使用率很高而做出内存存在压力的判断,说明这个人还不够全面。前文已经说过,数据库“喜欢”内存是天性,几乎所有DB服务器都会出现内存使用率很高的问题(除非设置最大内存,且最大内存远低于服务器内存),因此我们不能据此来判断数据库的内存压力。

我们通常会通过一些性能计数器来监控数据库的内存使用情况,据此作出压力的判断:

SQLServer:Buffer Manager\Buffer cache hit ratio

(一般要求OLTP的cache hit ratio在95%以上,OLAP则需要在90%以上才能称之

为性能良好)

SQLServer:Buffer Manager\Page life expectancy

SQLServer:Buffer Manager\free pages

SQLServer:Memory Manager\Target Server Memory

SQLServer:Memory Manager\Total Server Memory

上述后三个指标最能直观反映SQL server是否存在内存压力,free pages表示SQL server占用的内存中,有多少页面是free状态,将这个数值乘以8KB就得到了可用缓存的大小,这个值越大,说明SQL server占用的内存有很多还未被使用,因此说明了内存没有压力问题。

Total Server Memory表示SQL server为自己分配的buffer pool的总大小(已使用和未使用)。Target Server Memory表示操作系统能够分配给SQL server的目标内存大小,其最大值约等于【误区一】中描述的SQL server可用地址空间的大小,但会随着操作系统的压力增加而减少。正常情况下,Target server memory会大于total server memory,说明SQL server为自己分配的buffer pool还比较少,小于操作系统为SQL server设定的目标内存大小,数据库此时不会有内存压力。不过,随着操作系统的压力增加,它会调小Target Server memory的值,使其小于SQL Server的Total Server Memory,这样一来,SQL Server不得不释放已占用的缓存,减小total server memory,这种情况,说明数据库服务器存在内存压力。

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

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/b153bb8056a18cdd44fd7c51131ba535.html