服务器无法通过系统非页面共享区来进行分配的解决方法
错误信息大致为:
事件类型:错误
事件来源:Srv
事件种类:无
描述:服务器无法通过系统非页面共享区来进行分配,因为共享区当前是空的。
官方的解释:(个人感觉这个对处理问题没什么太大用处)
-----------引用开始-----------------
CAUSE
This problem can be caused by a TCP/IP sockets program that continuously attempts to open a socket port that does not exist.
RESOLUTION
To work around this problem, correct your TCP/IP sockets program so that it does not attempt to open the unsupported socket port. To correct this problem, install the latest U.S. Service Pack for Windows NT version 3.51.
-----------引用结束-----------------
分析了故障服务器,大概配置为windows2000+iis+mssql2000+norton9
估计问题出在iis运行了大量消耗物理内存/分页内存资源的程序操作而未及时释放资源,或者是Norton9对服务器可能不够兼容,建议改用Norton8.00.9374 .
-------------以下收集的关于文件服务器出现的一些类似现象对您的分析也许有帮助---------------
文件服务器的未分页内存
在某些情况下,由 IIS 报告的与 UNC 路径名相关的错误是由于文件服务器而不是 IIS 上的问题所引发的。如前面提到的,一个 UNC 连接可引入一个 SMB 连接。结果将创建一个或更多的工作项目 用于 SMB 连接。工作项目是 SMB 针对 I/O 操作所用的数据结构对象,可以在不同的时间以各种方式加以使用。例如,对文件执行一项操作,如:CreateFile 或 GetFileAttributes,仅在短时间内占用一个 I/O 工作项目,但在一个目录结构中查询一个变更通知将在对 IIS 服务器的整个连接期间占用一个工作项目。因此,工作项目所执行的这类工作能够影响用以维持 SMB 连接的工作项目的总体可用性。
工作项目在文件服务器的未分页 池式内存(通常称为未分页池)中进行创建。这种内存之所以成为未分页内存,是因为其无法对系统页面文件进行动态交换或分页。因此,您的服务器拥有可供正常使用的充足的空余未分页池是很重要的。
在一台文件服务器上的大量的工作项目可能导致未分页池式内存的分配超支。在这种情形下,您可能在事件查看器中看到下列错误信息:
没有足够的服务器存储空间用以处理此命令。
服务器无法从系统未分页池进行分配,因为池是空的。
服务器在最后的 60 秒时间内无法分配一个工作项目。
您可以使用文件服务器打开任务管理器快速检查内存,选择执行选项卡和在核心内存框中检查未分页的值。有两种方法可解决这类问题:减少工作项目的数量或调整 IIS 和文件服务器以管理更多的工作项目。
在决定如何进行最佳处理前,您应该在模拟工作负载环境下将服务器运行几个小时,在文件服务器上检查下列计数器的性能监控计数器:
• “打开服务器\文件”提供了有助于估计正确的 SMB 设置的信息。
• “服务器\服务器会话”提供了有助于估计正确的 SMB 设置的信息。
• “服务器\工作项目缺乏”:如果该计数器增加,意味着需要更多的工作项目。
• “服务器\池式未分页字节” :如果计数器太少,服务器几乎耗尽其可用的未分页池。可能就需要减少 SMB 的工作项目。
当您调整服务器时监控这些设置,可以帮助您评估调整的效果。
重要须知: 在 x86 平台上,最大的未分页池式内存是 256 MB;然而,您的系统可能小于该数值,因为最大的内存数量是动态确定的。
减少工作项目数量
在页面服务器上通过减少分配的工作项目数量,可以影响在页面服务器上的未分页池式内存的消耗。这可以使用一些技巧来完成。
• 对 IIS 更改缓存算法;使用针对缓存更新的默认的最后一次修改时间方法,会导致所创建的工作项目减少。
• 减少连接到文件服务器的已验证的用户数量。对每个唯一的用户创建一个连接。如果您对连接指定一个用户,而不使用通行验证,连接数将减少。
• 减少使用远程资源的虚拟目录或 Web 站点的数量
调整服务器
对 IIS 服务器的调整会对文件服务器上的负载造成影响。因此,当调整这些参数时,在文件服务器上的设置就由 IIS 服务器上的设置决定。尤其,您可以控制文件服务器所需工作项目的数量,这可以通过在 IIS 服务器上调整注册表设置MaxCmds,然后在文件服务器上修改 MaxMpxCt 和 MaxWorkItems 来调节MaxCmds的设置加以实现。MaxCmds 决定允许从 IIS 服务器到文件服务器同时连接的 SMB 的数量,MaxMpxCt 在文件服务器上配置用以限制同时连接到那个服务器的数量,而 MaxWorkItems 指定一个文件服务器所能分配的接收缓冲区的最大数量。为 MaxCmds 确定正确的值是很重要的,旨在了解应该在文件服务器上将何值输入给 MaxMpxCt 和MaxWorkItems。在MaxCmds被确定后,在文件服务器上的MaxMpxCt设置,应该等同于在IIS服务器上的 MaxCmds设置。另外,MaxWorkItems的设置至少必须等于MaxCmds * IIS 服务器的数量。
表 1 显示了在 Windows Server 2003 中一些 SMB 设置的默认和最大注册表值(和 Windows 2000 一样):
表 1 SMB 注册表设置
注册表设置 默认值 最大值
HKLM\System\CurrentControlSet\Services\LanmanWorkstation
\Parameters\ MaxCmds
50
65535
HKLM\System\CurrentControlSet\Services\LanmanServer
\Parameters\MaxMpxCt.
50
65535 (Windows 2000 SP2+; max 125 on Windows 2000 pre-SP2)
HKLM\System\CurrentControlSet\Services\LanmanServer
\Parameters\MaxWorkItems
4096
65535 (see 232476 below)
为帮助确定设置了正确的值,这里提供一些关于工作项目设置的详细资料:
• 当使用通行验证访问远程内容时(如图 5 所示),对每一个唯一的已验证用户创建一个 SMB 连接。当指定一个用户访问远程内容时(如图 4 所示),仅有使用一个 SMB 连接。
• 使用文件变更通知作为缓冲更新算法,长期增加了工作项目数量的消耗,因为每个变更通知要求使用一个工作项目,直到连接中断为止。
• MaxWorkItems 在 远程文件服务器的本地注册表配置 HKLM\System\CurrentControlSet\Services\LanmanServer\参数。
• MaxCmds 和 MaxMpxCt 在IIS服务器上的本地注册表配置 HKLM\System\CurrentControlSet\Services\LanmanWorkstation\参数。
• 通常,MaxCmds不得超过 12,000,因为在 X86 平台上内存的上限为 512 MB。
• 要使 MaxWorkItems、 MaxCmds和 MaxMpxCt 注册表值生效,您必须分别在远程文件服务器和 IIS 服务器上停止和启动服务器服务和工作站服务。您可能需要重新启动独立的服务,但不需要重新启动服务器。
下列公式可以帮助您为 MaxCmds 估算起始值。为了清楚地应用这些信息,这些公式将在下一节中应用于几个方案中,即扩展 SMB 的 IIS 和文件服务器配置方案。
在使用文件变更通知时评估 MaxCmds
当对缓冲使用文件变更通知时,评估MaxCmds的公式如下:(IIS 需要针对变更通知监测的确切的物理目录数) * (1 [如果静态文件存在] + 1 [如果 ASP 内容存在] + 1 [如果 ASP.NET 内容存在]) + 50 (并行的缺省/常规文件 I/O )。
这个公式提供的值假定 100% 的 IIS 服务器连接在给定的时间内处于活动状态。一般来说,不存在这种情况,因此MaxCmds可能减少 25% 或 50%,具体情况根据您的活动的特征而定。
重要须知: 这些计算只是一个粗略估计。利用上面推荐的性能监控计数器研究,您可以进行更多的调整。
在使用最后一次修改时间时评估 MaxCmds
当为缓存使用最后一次修改时间时,评估 MaxCmds的公式如下:(每秒请求量峰值 / 用时) * 2。 用时指 IIS 检查文件变更的频率,默认为 5 秒。这个公式提供的值假定在任何时候 IIS 资源的使用比率都很高。如果不是这种情况,您可以MaxCmds降低 50% 到 75%,具体情况根据您的活动的特征而定。
重要须知: 这些计算只是一个粗略估计。利用上面推荐的性能监控计数器研究,您可以进行更多的调整。
计算 MaxWorkItems 和所用的未分页池式内存
在确定MaxCmds 的值后,您应该设置 MaxWorkItems 的值,与( MaxCmds 的值相同* [连接到文件服务器的 IIS 服务器的数量)。 如果您使用 IIS 服务器,那么 MaxWorkItems 将等同于 MaxCmds。如果您有 4 个 IIS 服务器,那么 MaxWorkItems = 4 * MaxCmds。
在一个内存为 512MB 或更多的 Windows 2003 Server 上,每个工作项目占用 20 K 的未分页池式内存。如果在服务器上的内存不足 512 MB,每个工作项目占用 8 K 的未分页池式内存。其目的在于确保有足够的未分页池式内存供其他服务器资源使用,并试图最小化工作项目占用未分页池式内存的总量。
重要须知: 在 X86 平台上未分页池式内存的最大值是 256 MB。然而,由于物理内存容量等因素,您的服务器实际可以分配量会小于该值。设置之后,可以根据系统硬件配置,包括物理内存和已安装的设备,动态调整未分页池式内存容量。您可以使用系统工具 PerfMon 观察两个计数器监控未分页池内存的使用情况:内存\未分页字节和内存\池 未分页 Alloc,可指出有多少未分页池式内存当前正在使用。有两种方法可用以间接确定什么时候未分页池式内存使用已经超过了最大值。其一,当分配未分页池式内存失效时,服务器服务会在系统事件日志中记录该事件。其二,服务器计数器工具 PerfMon\未分页池峰值表明在服务器的一生中任何时间分配的未分页池式内存的最大值。如果您认为您的服务器的未分页池式内存消耗已经达到实际的最大值,就可以粗略地表示出最大可用的未分页池式内存。
在某些情况下,您可能发现您需要大量的工作项目。但每个工作项目占用 20K,您消耗了太多的未分页池式内存。如果您的服务器有 512 MB 内存或更多,您可以配置工作项目的占用内存是8K而不是 20 K。在文件服务器中,将注册表键SizReqBuf, REG_DWORD 位于HKLM\System\CurrentControlSet\Services\LanmanServer\Parameters设为:0x1104 (4356d)。 这就允许在文件服务器上使用更多的工作项目,而不需要消耗大量的未分页池式内存。这种解决方法的代价是:对于大量目录的枚举减少,并能降低网络性能。
注意:按照本文的意图,我们假定服务器有 512 MB 或更多的内存,最大的未分页池式内存是 256 MB,一个工作项目占用 20 K 的空间。