当前位置:首页 > 内存 > 正文

服务器内存为什么要那么大(服务器内存条为什么便宜)

  • 内存
  • 2024-06-27 04:51:17
  • 1843

一、怎样解决SQLServer内存不断增加问题为此,数据库引擎会获取尽可能多的可用内存,同时保留足够的可用内存以防止操作系统交换内存。SQLServer实例在开始完成初始化过程时通常会获取8到12MB的内存。实例完成初始化后,在用户连接到实例并开始生成工作负载之前,不会获取更多内存。此时,实例将继续根据需要获取内存以支持工作负载。随着越来越多的用户连接并运行查询,SQLServer将获取满足需求所需的额外内存。实例将继续获取内存,直到达到其自己的内存分配目标,并且在达到该目标的下限之前不会释放任何内存。为了获得尽可能多的内存而不产生不必要的分页I/O,每个SQLServer实例都配置了一个内存获取目标,直到计算机的可用物理内存在4MB到10MB的范围内。选择此范围是因为测试表明WindowsNT和Windows2000都具有最小内存交换,直到内存分配等于可用物理内存减去4MB。具有繁重工作负载处理任务的SQLServer实例保留范围较低的可用物理内存(4MB);具有轻量工作负载处理任务的实例保留范围较高端的可用物理内存(10MB)。SQLServer实例的目标会随着工作负载的变化而变化。随着越来越多的用户连接并生成更多工作,实例往往会获取更多内存,以将可用内存持在4MB限制以下。当工作负载减轻时,实例将其目标调整为10MB可用空间,并将内存释放给操作系统。将可用空间量保持在10MB到4MB之间可以防止WindowsNT或Windows2000执行过多的分页操作,同时允许SQLServer获得尽可能大的缓存,而不会导致额外的交换。实例的目标内存配置与数据库缓冲池相对于可用池大小的页面需求有关。在任何实时点,总缓冲区页需求取决于满足任何当前在执行的查询所需的数据页数量。如果数据页的需求相对于高速缓存中的页数来说较大,则当前在缓冲区中的每个页都可能在相对较短的时间内被新页替换。这可以通过缓冲区管理器对象的页面生命周期性能计数器来测量。对相对较小缓冲区的高需求的情况将产生较短的生命周期,并且最终效果是I/O增加,因为通常必须重写页面才能被多个逻辑读取引用。为了缓解这个问题,数据库引擎可以获取更多内存来增加缓存大小。当页面生存期较长时,数据库引擎将可用内存定位在目标范围的高端(10MB);当页面生存期较短时,数据库引擎将可用内存定位在目标范围的低端(4MB)。当其他应用程序在运行SQLServer实例的计算机上启动时,它们会消耗内存,导致可用物理内存量低于SQLServer的目标。然后,SQLServer实例从其地址空间释放足够的内存,将可用内存量带回SQLServer的目标。如果其他应用程序停止运行并且可用内存增加,SQLServer实例将增加其内存分配大小。SQLServer每秒能够释放和获取数MB字节的内存,从而使其能够快速调整以适应内存分配的变化。您可以通过配置允SQLServer使用的最大内存来设置限制:最小和最大服务器内存影响minservermemory和maxservermemory配置选项确定SQLServer数据库引擎使用的内存量的上限和下限。数据库引擎不会立即获取minservermemory中指定的内存量。数据库引擎开始仅使用初始化所需的内存。随着数据库引擎工作负载的增加,它将不断获取支持工作负载所需的内存。在达到minservermemory中指定的内存量之前,数据库引擎不会释放任何所需的内存。一旦达到minservermemory,数据库引擎就会使用标准算法获取和释放所需的内存(将操作系统的可用内存保持在4MB到10MB之间)。唯一的区别是数据库引擎永远不会将内存分配降低到minservermemory指定的级别以下,并且永远不会获取超过maxservermemory指定的级别的内存。数据库引擎获得的内存量完全取决于实例上的工作负载。不处理大量请求的SQLServer实例可能永远不会达到minservermemory。如果为minservermemory和maxservermemory指定相同的值,一旦分配给数据库引擎的内存达到该值,数据库引擎将停止动态释放和获取内存。如果您频繁启动或停止运行SQLServer实例的计算机上的其他应用程序,则启动这些应用程序所需的时间可能会随着SQLServer实例分配和释放内存而延长。此外,如果SQLServer是在一台计算机上运行的多个服务器应用程序之一,则系统管理员可能需要控制分配给SQLServer的内存量。