MCSE技术论坛

首页 » 解决方案&资料下载 » Windows知识库 » [KB316749]在 SQL Server 中使用大量数据库时,可能会出现虚拟内存不足的情况
洛洛 - 2007-3-13 9:44:00
症状  当您使用默认配置值运行 SQL Server 时,如果满足以下所有条件,则 Microsoft SQL Server 进程中可能没有足够的可用虚拟地址空间: 
服务器具有 2 GB 或更多的 RAM。
系统上有大量的数据库(例如,超过 500 个数据库)。
大多数数据库是更新的(例如,数据库不具有“只读”状态)。
同时有足够多的活动用户连接使用 255 个 SQL Server 工作线程中的大部分线程。
在全部 2 GB 的虚拟地址空间用完之后(对于在 Boot.ini 文件中使用 /3GB 开关的 SQL Server 企业版,则是在全部 3 GB 的虚拟地址空间用完之后),SQL Server 可能生成下列错误消息。  消息 1  Error:17802, Severity:18, State: 3
Could not create server event thread.

消息 2  SQL Server could not spawn process_loginread thread.
消息 3  WARNING:Clearing procedure cache to free contiguous memory.

Buffer Distribution:Stolen=3454 Free=2540 Procedures=138
Inram=0 Dirty=1108 Kept=35
I/O=0, Latched=0, Other=214821
Buffer Counts:Committed=222096 Target=222096 Hashed=215964
InternalReservation=547 ExternalReservation=0 Min Free=512
Procedure Cache:TotalProcs=8 TotalPages=138 InUsePages=138
Dynamic Memory Manager:Stolen=3556
OS=497 General=1706
Query Plan=755 Optimizer=0
Utilities=9 Connection=1583
Global Memory Objects:Resource=1119 Locks=163 XDES=1 SQLCache=90 Replication=5 LockBytes=2 ServerGlobal=20
Query Memory Manager:Grants=0 Waiting=0 Maximum=164370 Available=164370
回到顶端

原因  对于每个更新的数据库,SQL Server 至少会分配一个 64 KB 的块,用于在将日志记录写入磁盘前对日志记录进行格式化。当为数据库生成第一个日志记录时(例如在执行 INSERT、UPDATE 或 DELETE 语句的过程中)便会发生此分配。根据活动和生成的日志记录的大小,后续修改可能引发额外的 64 KB 分配。SQL Server 7.0 分配的 54 KB 的块不多于三个。在 SQL Server 2000 中,为每个数据库分配的上限数与为 SQL Server 配置使用的处理器数具有函数关系。  回到顶端

替代方法  使用 -g 启动参数使附加的、未保留的虚拟内存可用于这些数据库分配。-g 参数可以在 SQL Server 7.0 Service Pack 的 Readme.txt 以及 SQL Server 2000 联机丛书中找到。本文的“更多信息”一节包括 Microsoft 建议您使用的设置,以确定此设置适当的值。  回到顶端

更多信息  在具有 2 GB 或更多 RAM 的计算机上,除了 256 MB (SQL Server 7.0) 或 384 MB (SQL Server 2000) 虚拟地址空间之外,SQL Server 在启动过程中保留剩下的所有虚拟地址空间以供缓冲池使用。另外,为了存储数据和过程缓存,SQL Server 使用缓冲池内存为来自 SQL Server 进程的大多数小于 8 KB 的其他内存请求提供服务。剩下的未保留内存准备用于不能从缓冲池得到服务的其他分配。这些分配包括、但不限于以下各项: 
SQL Server 创建的所有线程的堆栈和关联的线程环境块。在 SQL Server 创建了所有 255 个工作线程之后,这大约为 140 MB。
由在 SQL Server 地址空间(根据具体系统而有所不同)中运行的其他 DLL 或进程进行的分配,如: 
任何链接的服务器中的 OLE DB 提供程序。
通过使用 sp_OA 系统存储过程或扩展存储过程加载的 COM 对象。
加载到地址空间中的任何映像(.exe 或 .dll),这些映像通常使用 20 到 25 MB,但是如果您使用链接的服务器、sp_OA 或扩展存储过程,则这些映像可能使用更多的空间。
进程堆和 SQL Server 可能创建的任何其他堆。在启动过程中,此空间通常为 10 MB,但是如果您使用链接的服务器、sp_OA 或扩展存储过程,则此空间可能更多。
来自 SQL Server 进程的大于 8 KB 的分配,例如较大查询计划、网络数据包大小配置选项接近于 8 KB 时发送和接收缓冲区等情况所需要的分配。要查看此数字,请查找在 DBCC MEMORYSTATUS 中报告的 OS Reserved 值,该值是作为 8 KB 页的数目报告的。通常,该值为 5 MB。
跟踪缓冲池中每个缓冲区状态信息的数组。该值通常约为 20 MB,除非 SQL Server 运行时启用了地址窗口化扩展插件 (AWE),在这种情况下,该值将会显著提高。
回到顶端

在拥有大量数据库的系统上,日志格式化所需的 64 KB 分配可能会占用所有剩余的虚拟内存。这之后的分配将失败,导致本文的“症状”一节中列出的一个或多个错误。

通过使用 -g 启动参数,您可以指示 SQL Server 保留附加的虚拟内存可用,以便这些与日志相关的分配和其他正常分配加在一起也不会用完虚拟地址空间。

下表根据数据库的数目和服务器版本列出 -g 值的一些建议初始值:  Databases SQL Server 7.0 SQL Server 2000
250 -g134 N/A
500 -g185 N/A
750 -g237 N/A
1000 -g288 -g288
1250 -g340 -g340
1500 -g392 -g392
此表是使用列出的典型值进行计算的,并且此计算是基于没有使用链接的服务器活动、sp_OA 或扩展存储过程这一假设的。它还假设您没有使用 AWE 和 SQL 事件探查器。出现以上任意一种情况都需要您增加 -g 的值。

如果服务器上数据库的数目超过此数目,Microsoft 建议您在运行该服务器之前进行慎重的考虑,因为系统上具有如此数目的数据库所需的系统开销将占用缓冲池中的大量虚拟内存,从而可能导致系统整体性能下降。  回到顶端


  这篇文章中的信息适用于:
Microsoft SQL Server 7.0 标准版
Microsoft SQL Server 2000 标准版
Microsoft SQL Server 2005 Developer Edition
Microsoft SQL 2005 Server Enterprise
Microsoft SQL Server 2005 Standard Edition
txdyr - 2007-5-29 16:18:00
谢谢了.
数码猫 - 2007-6-10 20:52:00
多加内存在行不?
genius - 2008-1-15 2:10:00
晕咯晕咯
1
查看完整版本: [KB316749]在 SQL Server 中使用大量数据库时,可能会出现虚拟内存不足的情况