数码资讯
SQLServer内存管理的探讨
理解SQL Server对内存的管理是SQL Server问题处理和性能调优的基本问题。本文介绍了SQL Server内存管理的原理,二级存储(二级存储) 计算机的存储系统是分层的,越靠近CPU是愉快的,但容量较小(如图1所示)。例如,传统的计算机存储体系结构由近至CPU依次是:寄存器在CPU一级缓
选购提示
关注价格、性能、续航、售后和真实使用场景,理性比较后再下单。
理解SQL Server对内存的管理是SQL Server问题处理和性能调优的基本问题。本文介绍了SQL Server内存管理的原理,二级存储(二级存储)
计算机的存储系统是分层的,越靠近CPU是愉快的,但容量较小(如图1所示)。例如,传统的计算机存储体系结构由近至CPU依次是:寄存器在CPU一级缓存,两级缓存,内存,硬盘,但同时,远离CPU,存储系统将一个数量大于前级存储系统,例如,硬盘通常是大于同一时间记忆一个量级。
图1。计算机存储系统
因此,SQL Server,通过正常的生产系统分配的内存通常无法加载所有数据,因此它将涉及两级存储是磁盘。磁盘存储部件机械最后的现代计算机,读取数据需要移动头磁盘(具体原理,可我以前写的一个文章),因为访问数据库中的数据是随机分布在磁盘的各个位置,所以如果你需要移动磁头频繁读盘频繁。演出将非常精彩。
计算机存储系统可以知道,计算机在硬盘操作中首先需要读入内存中的所有数据,因此充分利用缓冲存储器,减少磁盘IO访问量是提高服务器SQL性能的关键问题之一,这是本文写作的出发点。
一个自调整引擎
因为SQL Server已面向中小企业是市场的原因,SQL Server存储引擎被设计成一个不需要太多的配置就可以使用的产品,从而降低部署成本,但这个配置也被很多人批评微软开放的太少,几乎没有没有直接配置SQL Server使用的内存空间。惟一的开放配置是是否使用敬畏和实例占用的最大或最小内存,如图2所示。
图2.sql服务器控制的存储器控制
具体的SQL服务器,如何使用内存,如多少分配给执行计划缓存和多缓冲区分配给数据,不可控制的配置。这也是为什么许多其他技术开发者使用微软技术的开发者有一种优越感,但在我看来,虽然SQL Server提供可配置的地方很少,而且很多地方都是间接配置在知道原理的情况下,还需要知道Windows的一些原则。SQL Server如何使用内存
SQL Server存储引擎本身是Windows下的一个过程,所以SQL Server使用的内存和其他Windows程序一样,都需要Windows申请内存。从Windows存储应用程序后,SQL Server可以用粗糙的记忆分为两个部分:缓冲池内存(数据页和页,无缓冲免费)记忆(线、DLL、链接服务器,等等)。缓冲池的内存占用了大部分的SQL Server的内存使用,缓冲池占用的内存也设置了最大和图2的最小内存,所以内存占用sqlservr.exe可能大于设置图2中的最大内存。
还有一点是SQL Server使用内存特性:它使用了多少,将来不会发布(除非收到Windows内存压力的通知)。例如,我公司的开发服务器,如图3所示,在几乎没有负载的情况下查看内存的使用情况。
图中的3.sql服务器进程内存使用情况
您可以看到,当CPU是0的负载时,内存占用13 G。这实际上是以前的SQL Server到Windows的应用程序未发布的结果。
特定SQL Server可以使用多少内存由以下因素决定:
1。物理内存的大小
2。安装的Windows版本的内存限制(如Windows Server 2008标准的限制,最大限度的记忆只有32GB)
3.sql服务器是32位或64位
4。SQL Server使用的内存量被配置,如图2所示。
对5.sql服务器版本(例如,快捷版只能使用1G内存)
SQL Server操作系统的三层内存分配
SQL Server操作系统被划分为三个级别的内存分配,如图4所示。
图4.sql服务器操作系统内存的依赖
存储节点
第一个底部是存储节点和存储节点的作用是使分配的内存是从Windows SQL Server操作系统。每一个SQL Server实例通常只有一个存储节点和存储节点的数量只取决于NUMA架构的硬件配置,我们可以通过DBCC memorystatus看到一些关于记忆的节点信息,如图5所示。
图5。查看内存节点信息
我们可以看到,根据应用程序内存大小的分类,它可以分为两部分。
1。应用小于等于8kb作为一个存储单元,用于缓存。(分页分配图5)
2。申请的内存超过一个单位的8KB,称为Multi Page(或MemToLeave)(页分配器图5)
为什么叫它为MemToLeave,叫做MemToLeave,因为SQL服务器用于缓存的大部分,但还需要一些连续的内存SQL CLR,链接服务器,备份缓冲,SQL 32服务器将保留虚拟地址的一部分以实例的启动(VAS)MultiPage Allocator。多少具体的预订可以通过以下公式计算:
保留地址=((CPU核数- 4)+ 256)* 0.5mb + 256MB,通常在384mb。
记忆的职员
让我们看看内存办事员,分配内存的内存管理员,用于分配分配出去的内存。我们可以简单地做下面的语句,如图6所示。
图6。根据内存管理员的类别进行分类
注意:如图4所示,内存管理员只是内存分配的一部分,另一个是数据缓存(缓冲池)。
缓冲池
在你开始告诉Buffer Pool之前,你首先要讨论的是虚拟内存。
在Windows中,每个进程都有一个虚拟内存(虚拟地址空间VAS)。32位系统是2 32种权力,即4G。4G是窗口分为两个部分,一个是Windows和其他应用程序,虚拟内存是不是实际的物理内存,但物理内存的映射,当物理内存中不存在的虚拟内存的内容,生成一个页面故障的内存页面置换的一部分,然后将需要从读入内存,硬盘的部分,可以阅读我之前写过的一篇文章:操作系统的内存管理。
因此,缓冲池的效果被数据页缓冲,从而减少了在将来读取数据时对磁盘的访问。
缓冲池的这一部分是图2中的最大最小服务器内存占用的空间,这个最小值并不意味着SQL Server在启动时占用了大量内存,但是一旦超过了这个值,SQLServer缓冲池的使用就不会被释放。
有一部分DBCC memorystatus我们可以看到缓冲池的信息,如图7所示。
图7缓冲池相关信息
在SQL Server实例开始,VAS地址空间缓冲池的保留取决于多个因素,包括:物理内存和SQL Server 32或64(32的极限是4G,还指定了Windows的一半减去MemToLeave,用于空间)和实际的SQL服务器的物理内存,可以通过下面的语句是,如图8所示。
图8。查看缓冲池使用的物理内存。
缓冲池将继续按需应用内存。如果需要,Buffer Pool缓冲池将继续消耗内存。除非Windows通知SQL Server内存太低,缓冲池将能够释放内存,否则缓冲池将占用内存而不会释放。
另外,缓冲池和SQL Server操作系统分配的页大小是一样的,这是8192个字节,当SQL Server和其他部分需要借内存缓冲池,只有按照8K借款,这部分的记忆是不连续的物理内存中,这听起来像一个缓冲池内存管理自成体系
通过SQL Server占用的内存大致可以通过这个公式估算:通过缓冲池和缓冲池借的页面缓冲池内存占用非记忆+ multipageallocator分配占用的内存,如图9所示。
图9。可以近似SQL Server占用的内存
内存对象
记忆对象本质上是一堆,由页面分配器分配,可以由sys.dm_os_memory_objects DMV认为,车管所可以看到列表的page_allocator_address柱,柱是记忆的职员,内存对象的标识,这是分配的内存的职员。
32位sql服务器的内存瓶颈
前面的基本原则可以被看作是一个32位SQL服务器使用VAS地址分配,因此地址空间限制为4GB,4GB将有一半的窗户,使缓冲池只能使用2G内存,使得32位SQL服务器即使有额外的物理内存不能为用。
解决方案之一是通过降低Windows的默认2G到1g减少SQL Server到3G的默认内存。这套increaseuserva选项键入BCDEdit /设置在Windows Server 2008的命令行,将值设置为3072mb,和Windows Server 2003中,我们需要添加 / 3GB启动参数为Boot.ini。
另一种方法是使用AWE(地址窗口扩展)分配memory.awe加4位通过计算机物理地址扩展(物理地址扩展PAE),使32位CPU的地址范围增加到36倍的2,那是64GB,寻址范围不足的问题已基本解决。
allocateuserphysicalpages VirtualAlloc和
allocateuserphysicalpages VirtualAlloc和由SQL Server用于申请内存窗口的方法。默认情况下,所有的记忆,SQL Server需要使用VirtualAlloc Windows内存。这个应用程序是在操作系统层面,即虚拟内存直接对应于它。这导致了所有的内存分配在VirtualAlloc可以在虚拟内存时,Windows面临的内存压力更换问题。这会导致IO职业。
要求allocateuserphysicalpages内存直接与底页的页表匹配。因此,内存要求用这种方法不会被取代的记忆。在SQL Server 32中,通过在缓冲池开放AWE内存分配,数据缓存将使用这个功能,和其他部分的内存缓冲池和MemToLeave部分(主要是计划缓存的实现)还是通过VirtualAlloc分配内存。
因此,在通过敬畏打开内存之前,SQL Server首先需要相应的权限,否则将在日志中报告错误,如图10所示。
图10。打开敬畏但不打开相应的权限
我们可以设置一个帐户,使组策略中的SQL服务器具有此权限,如图11所示。
图11。锁定内存页(内存中的锁定页)
64位sql服务器的问题
64窗户有记忆问题,但仍然需要注意,默认情况下,64位SQL Server仍然使用VirtualAlloc分配内存,这意味着所有的内存分配在Windows将面临压力,当页面置换出来,这可能会导致抖动(缓冲池流失这是SQL),在服务器的页面缓冲池已被交换到硬盘,导致大量IO占用(从sys.dm_exec_query_memory_grants DMV查看查询,所以等待内存)64 SQL Server缓冲池的内存分配日期在页面allocateuserphysicalpages可以避免这个问题。与32位SQL Server 64位SQL服务器不需要打开的敬畏,只是在记忆的锁打开的页面如图所示在图11中。
但它也揭示了另一个问题,因为SQL Server锁定内存页,当Windows内存在一个急救,SQL Server将无法应对急救Windows内存(当然在池中的一部分非数据缓存和MemToLeave Buffer还是可以的,但往往是不够的,因为这部分的内存消耗相比于数据缓存很小),因为SQL Server的特点是多少记忆,因此可能导致Windows无法响应Windows内存不足时的不稳定甚至崩溃。后在内存中锁定页面打开SQL Server缓冲池,限制使用的内存,在图2的前面已经说了,这里就不细说了。
有一个问题,当缓冲池,通过allocateuserphysicalpages内存分配,在任务管理器中看到我们sqlservr.exe记忆只包含非缓存数据缓冲池和MemToLeave部分,不包括数据缓存,所以它可能会导致sqlservr.exe占内存和内存使用几百兆是此时G.几十个,我们需要看的SQL服务器:内存管理服务器总内存计数器在Perfmon.exe找到的SQL server.summary真实记忆
本文介绍了SQL Server内存管理的基本原理和SQL Server内存使用的部分。对于SQL Server性能调优,它是理解内存使用的关键部分。许多IO问题可能是由记忆引起的。
单击此处下载本文的PDF版本。
计算机的存储系统是分层的,越靠近CPU是愉快的,但容量较小(如图1所示)。例如,传统的计算机存储体系结构由近至CPU依次是:寄存器在CPU一级缓存,两级缓存,内存,硬盘,但同时,远离CPU,存储系统将一个数量大于前级存储系统,例如,硬盘通常是大于同一时间记忆一个量级。
图1。计算机存储系统
因此,SQL Server,通过正常的生产系统分配的内存通常无法加载所有数据,因此它将涉及两级存储是磁盘。磁盘存储部件机械最后的现代计算机,读取数据需要移动头磁盘(具体原理,可我以前写的一个文章),因为访问数据库中的数据是随机分布在磁盘的各个位置,所以如果你需要移动磁头频繁读盘频繁。演出将非常精彩。
计算机存储系统可以知道,计算机在硬盘操作中首先需要读入内存中的所有数据,因此充分利用缓冲存储器,减少磁盘IO访问量是提高服务器SQL性能的关键问题之一,这是本文写作的出发点。
一个自调整引擎
因为SQL Server已面向中小企业是市场的原因,SQL Server存储引擎被设计成一个不需要太多的配置就可以使用的产品,从而降低部署成本,但这个配置也被很多人批评微软开放的太少,几乎没有没有直接配置SQL Server使用的内存空间。惟一的开放配置是是否使用敬畏和实例占用的最大或最小内存,如图2所示。
图2.sql服务器控制的存储器控制
具体的SQL服务器,如何使用内存,如多少分配给执行计划缓存和多缓冲区分配给数据,不可控制的配置。这也是为什么许多其他技术开发者使用微软技术的开发者有一种优越感,但在我看来,虽然SQL Server提供可配置的地方很少,而且很多地方都是间接配置在知道原理的情况下,还需要知道Windows的一些原则。SQL Server如何使用内存
SQL Server存储引擎本身是Windows下的一个过程,所以SQL Server使用的内存和其他Windows程序一样,都需要Windows申请内存。从Windows存储应用程序后,SQL Server可以用粗糙的记忆分为两个部分:缓冲池内存(数据页和页,无缓冲免费)记忆(线、DLL、链接服务器,等等)。缓冲池的内存占用了大部分的SQL Server的内存使用,缓冲池占用的内存也设置了最大和图2的最小内存,所以内存占用sqlservr.exe可能大于设置图2中的最大内存。
还有一点是SQL Server使用内存特性:它使用了多少,将来不会发布(除非收到Windows内存压力的通知)。例如,我公司的开发服务器,如图3所示,在几乎没有负载的情况下查看内存的使用情况。
图中的3.sql服务器进程内存使用情况
您可以看到,当CPU是0的负载时,内存占用13 G。这实际上是以前的SQL Server到Windows的应用程序未发布的结果。
特定SQL Server可以使用多少内存由以下因素决定:
1。物理内存的大小
2。安装的Windows版本的内存限制(如Windows Server 2008标准的限制,最大限度的记忆只有32GB)
3.sql服务器是32位或64位
4。SQL Server使用的内存量被配置,如图2所示。
对5.sql服务器版本(例如,快捷版只能使用1G内存)
SQL Server操作系统的三层内存分配
SQL Server操作系统被划分为三个级别的内存分配,如图4所示。
图4.sql服务器操作系统内存的依赖
存储节点
第一个底部是存储节点和存储节点的作用是使分配的内存是从Windows SQL Server操作系统。每一个SQL Server实例通常只有一个存储节点和存储节点的数量只取决于NUMA架构的硬件配置,我们可以通过DBCC memorystatus看到一些关于记忆的节点信息,如图5所示。
图5。查看内存节点信息
我们可以看到,根据应用程序内存大小的分类,它可以分为两部分。
1。应用小于等于8kb作为一个存储单元,用于缓存。(分页分配图5)
2。申请的内存超过一个单位的8KB,称为Multi Page(或MemToLeave)(页分配器图5)
为什么叫它为MemToLeave,叫做MemToLeave,因为SQL服务器用于缓存的大部分,但还需要一些连续的内存SQL CLR,链接服务器,备份缓冲,SQL 32服务器将保留虚拟地址的一部分以实例的启动(VAS)MultiPage Allocator。多少具体的预订可以通过以下公式计算:
保留地址=((CPU核数- 4)+ 256)* 0.5mb + 256MB,通常在384mb。
记忆的职员
让我们看看内存办事员,分配内存的内存管理员,用于分配分配出去的内存。我们可以简单地做下面的语句,如图6所示。
图6。根据内存管理员的类别进行分类
注意:如图4所示,内存管理员只是内存分配的一部分,另一个是数据缓存(缓冲池)。
缓冲池
在你开始告诉Buffer Pool之前,你首先要讨论的是虚拟内存。
在Windows中,每个进程都有一个虚拟内存(虚拟地址空间VAS)。32位系统是2 32种权力,即4G。4G是窗口分为两个部分,一个是Windows和其他应用程序,虚拟内存是不是实际的物理内存,但物理内存的映射,当物理内存中不存在的虚拟内存的内容,生成一个页面故障的内存页面置换的一部分,然后将需要从读入内存,硬盘的部分,可以阅读我之前写过的一篇文章:操作系统的内存管理。
因此,缓冲池的效果被数据页缓冲,从而减少了在将来读取数据时对磁盘的访问。
缓冲池的这一部分是图2中的最大最小服务器内存占用的空间,这个最小值并不意味着SQL Server在启动时占用了大量内存,但是一旦超过了这个值,SQLServer缓冲池的使用就不会被释放。
有一部分DBCC memorystatus我们可以看到缓冲池的信息,如图7所示。
图7缓冲池相关信息
在SQL Server实例开始,VAS地址空间缓冲池的保留取决于多个因素,包括:物理内存和SQL Server 32或64(32的极限是4G,还指定了Windows的一半减去MemToLeave,用于空间)和实际的SQL服务器的物理内存,可以通过下面的语句是,如图8所示。
图8。查看缓冲池使用的物理内存。
缓冲池将继续按需应用内存。如果需要,Buffer Pool缓冲池将继续消耗内存。除非Windows通知SQL Server内存太低,缓冲池将能够释放内存,否则缓冲池将占用内存而不会释放。
另外,缓冲池和SQL Server操作系统分配的页大小是一样的,这是8192个字节,当SQL Server和其他部分需要借内存缓冲池,只有按照8K借款,这部分的记忆是不连续的物理内存中,这听起来像一个缓冲池内存管理自成体系
通过SQL Server占用的内存大致可以通过这个公式估算:通过缓冲池和缓冲池借的页面缓冲池内存占用非记忆+ multipageallocator分配占用的内存,如图9所示。
图9。可以近似SQL Server占用的内存
内存对象
记忆对象本质上是一堆,由页面分配器分配,可以由sys.dm_os_memory_objects DMV认为,车管所可以看到列表的page_allocator_address柱,柱是记忆的职员,内存对象的标识,这是分配的内存的职员。
32位sql服务器的内存瓶颈
前面的基本原则可以被看作是一个32位SQL服务器使用VAS地址分配,因此地址空间限制为4GB,4GB将有一半的窗户,使缓冲池只能使用2G内存,使得32位SQL服务器即使有额外的物理内存不能为用。
解决方案之一是通过降低Windows的默认2G到1g减少SQL Server到3G的默认内存。这套increaseuserva选项键入BCDEdit /设置在Windows Server 2008的命令行,将值设置为3072mb,和Windows Server 2003中,我们需要添加 / 3GB启动参数为Boot.ini。
另一种方法是使用AWE(地址窗口扩展)分配memory.awe加4位通过计算机物理地址扩展(物理地址扩展PAE),使32位CPU的地址范围增加到36倍的2,那是64GB,寻址范围不足的问题已基本解决。
allocateuserphysicalpages VirtualAlloc和
allocateuserphysicalpages VirtualAlloc和由SQL Server用于申请内存窗口的方法。默认情况下,所有的记忆,SQL Server需要使用VirtualAlloc Windows内存。这个应用程序是在操作系统层面,即虚拟内存直接对应于它。这导致了所有的内存分配在VirtualAlloc可以在虚拟内存时,Windows面临的内存压力更换问题。这会导致IO职业。
要求allocateuserphysicalpages内存直接与底页的页表匹配。因此,内存要求用这种方法不会被取代的记忆。在SQL Server 32中,通过在缓冲池开放AWE内存分配,数据缓存将使用这个功能,和其他部分的内存缓冲池和MemToLeave部分(主要是计划缓存的实现)还是通过VirtualAlloc分配内存。
因此,在通过敬畏打开内存之前,SQL Server首先需要相应的权限,否则将在日志中报告错误,如图10所示。
图10。打开敬畏但不打开相应的权限
我们可以设置一个帐户,使组策略中的SQL服务器具有此权限,如图11所示。
图11。锁定内存页(内存中的锁定页)
64位sql服务器的问题
64窗户有记忆问题,但仍然需要注意,默认情况下,64位SQL Server仍然使用VirtualAlloc分配内存,这意味着所有的内存分配在Windows将面临压力,当页面置换出来,这可能会导致抖动(缓冲池流失这是SQL),在服务器的页面缓冲池已被交换到硬盘,导致大量IO占用(从sys.dm_exec_query_memory_grants DMV查看查询,所以等待内存)64 SQL Server缓冲池的内存分配日期在页面allocateuserphysicalpages可以避免这个问题。与32位SQL Server 64位SQL服务器不需要打开的敬畏,只是在记忆的锁打开的页面如图所示在图11中。
但它也揭示了另一个问题,因为SQL Server锁定内存页,当Windows内存在一个急救,SQL Server将无法应对急救Windows内存(当然在池中的一部分非数据缓存和MemToLeave Buffer还是可以的,但往往是不够的,因为这部分的内存消耗相比于数据缓存很小),因为SQL Server的特点是多少记忆,因此可能导致Windows无法响应Windows内存不足时的不稳定甚至崩溃。后在内存中锁定页面打开SQL Server缓冲池,限制使用的内存,在图2的前面已经说了,这里就不细说了。
有一个问题,当缓冲池,通过allocateuserphysicalpages内存分配,在任务管理器中看到我们sqlservr.exe记忆只包含非缓存数据缓冲池和MemToLeave部分,不包括数据缓存,所以它可能会导致sqlservr.exe占内存和内存使用几百兆是此时G.几十个,我们需要看的SQL服务器:内存管理服务器总内存计数器在Perfmon.exe找到的SQL server.summary真实记忆
本文介绍了SQL Server内存管理的基本原理和SQL Server内存使用的部分。对于SQL Server性能调优,它是理解内存使用的关键部分。许多IO问题可能是由记忆引起的。
单击此处下载本文的PDF版本。
声明:本文内容用于数码产品信息整理与选购参考,具体价格、库存、售后政策以官方渠道和电商页面实时信息为准。