Windows Server-“可用存储空间不足错误”

Windows Server-“可用存储空间不足错误”

我们有两台在网络花园中运行的 IIS 7 服务器。每台服务器上都有每个站点的副本。文件使用 DFS 同步(仅限源文件)。图像和大文件使用共享位于不同的服务器上。

每周至少有几次,我们"Not enough storage available"在读取任何文件或处理服务器代码时会出错。IIS 服务器无法将路径映射到本地磁盘(不仅仅是与 DFS 同步的磁盘),加载组策略权限似乎也存在问题(我们收到各种错误),并且我们无法在局域网上的任何服务器上打开任何共享。从其他自定义应用程序读取文件时也会出现 I/O 错误。此故障期间的磁盘速度和延迟都正常。如果我们尝试复制文件或测试驱动器速度,通常可以正常工作。有时,我们甚至无法运行“我的电脑”或任何其他软件(例如性能监视器)。只有我们“以管理员身份运行”时才能启动。每个磁盘上都有足够的可用存储空间。

大多数网站停止工作(但不是全部)。服务器重启后,一切正常,几天后问题再次出现。

服务器使用 VMWARE 进行虚拟化,每台服务器上有 50 个 IIS 池(有些有内存限制)和大约 200 个正在运行的站点。两台服务器都有 16GB 的 RAM(仅使用了约 80%)。CPU 始终处于 30-60% 之间。

我们尝试将 IRPStackSize 注册表属性更改为更高的数字,但没有任何变化。问题仍然存在。我们尝试禁用防病毒软件 (NOD) – 没有成功。

有什么提示吗?也许我们已接近 IIS 限制(对许多站点/池而言)?也许是 32 位操作系统和 16GB RAM?也许存在一些“秘密”注册表设置……我们认为每天重启并不是长期解决方案。

答案1

Not enough storage available错误与磁盘存储无关。它与内部存储器有关。

此错误很容易重现。只需选择一堆大文件(图像或 DLL 或其他),右键单击并使用打开方式选项用记事本打开它们即可。这应该会占用大量内部内存。当交换文件接近其最大容量时,随机服务将开始记录Not enough storage available到事件日志中。通常,它们将保持故障状态,直到重新启动。

我在自己的服务中遇到过这个问题,并且必须添加一些额外的错误处理,以便在线程上发生此类错误时强制服务进程退出。这样,服务就会以自动方式重新启动和恢复。

IIS 通常可以很好地处理这种情况(与普通的 Windows 服务相比)。

为了找到导致此问题(通常是内存泄漏)的进程,您应该使用性能监视器mmc 管理单元,并记录正在运行的进程的内存使用情况(在决定记录什么时要有选择性,因为这些日志文件可能会变得非常大)。另一个选择是使用性能测试,它实际上更适合调试低级驱动程序等,但在这种情况下也会有所帮助。

如果事实证明 w3wc 服务占用了所有内存,则可以使用 Microsoft 的全新应用程序洞察(或任何其他 IIS 监控工具)来找出哪个应用程序池、Web 应用程序或网站负责。然后,您可以限制该特定池的内存使用量,或安排它正常回收。

IIS 通常可以以无人注意的方式循环池(取决于应用程序处理会话的方式,如果是自定义构建的,则当所有静态变量都被刷新时,您可能会丢失会话)。通常,像这样的解决方法就足够了,并且可以避免昂贵的错误修复(免责声明:这不是解决问题的“风格”,但大多数利益相关者都喜欢这种方式)。

答案2

32 位操作系统搭配 16GB RAM 会导致 12GB 内存闲置。升级至 64 位操作系统绝对值得考虑。

使用 PAE 开关(物理地址扩展)可以提供临时解决方案。

有关操作系统可以使用的最大内存以及 PAE 开关信息的信息,请查看:

http://msdn.microsoft.com/en-us/library/windows/hardware/gg487503.aspx

问候,

答案3

会不会是内存泄漏?IIS 池数量太多,可能会发生这种情况,具体取决于它们正在执行的操作。

使用 Microsoft 的 POOLMON.EXE 轻松监控(从官方 2003 支持工具中获取)

Powershell 脚本我每小时运行一次,持续时间为“重启->崩溃”。

$date = get-date -Format ddMMyy-hhmm

.\poolmon.exe -b -n Output-$date.log

#send-mailmessage -smtpserver 10.1.1.11 -to [email protected] -from [email protected] -subject "Poolmon output $date" -attachments "Output-$date.log"

#Extract top offender

$TAG = (Get-Content Output-$date.log)[3]

$Code = $((($TAG -replace '\s+', ' ').split(" "))[1]) 
$Byte = $((($TAG -replace '\s+', ' ').split(" "))[6])

ECHO "$Code,$Byte" >>chart.csv

Chart.CSV 将显示顶部标签及其字节分配值。

他们Output-$date.log将会向你展示一切。

如果在顶部有一个罪犯,那么该罪犯将一直位于顶部并且数量不断增加直到事故发生,那么您就找到了导致事故发生的可能人选。

还可以在系统下的 Eventvwr 中查找提及SRV“资源不足”的事件

答案4

我在虚拟机上遇到了这个问题。它的空间有限,因为它是免费的低标准许可证。所有工具都是开发工具,我需要它们全部。

由于 Windows 安全更新不断,C: 盘已满。我根本无法删除任何东西。

Windows 认为它​​需要磁盘空间来复制文件,可能是因为它连接到了虚拟内存系统。我通过以下方式解决了这个问题:

1)系统上已经安装了 Cygwin

2)我将文件从源复制到目标

3)记得给文件加上引号

观察它是否成功复制。如果你想要正确完成工作,请不要使用 Windows。如果你需要安装命令行,请使用 MobaXterm(它的安装较小)。

相关内容