限制疑难解答(Windows Server AppFabric 缓存)

当某个 Windows Server AppFabric 缓存主机上的物理内存不足时,该缓存主机可以进入称为“限制”的状态。 缓存群集将不会向受限制的缓存主机上的任何缓存写入数据,直到可用物理内存增加解决了受限制的状态。

诊断限制

限制的最明显正矿将来自应用程序。 尝试写入缓存将生成 DataCacheException 错误。 有关此异常的详细信息,请参阅RetryLater(限制)(Windows Server AppFabric 缓存)。 要确认缓存群集上限制是否已成为问题,您可以使用下列一个或多个测试。

  • 使用 Get-CacheClusterHealth Windows PowerShell 命令。 查看任何缓存主机是否拥有在 Throttled 类别中有百分比的缓存。

  • 在每个缓存主机上在事件查看器中启用操作日志,并查找状态为“服务处于限制状态”的事件 116。

  • 使用性能监视器跟踪每个缓存主机上的内存 | 可用的 MB 字节。 当它下降到总物理内存的 15% 时,缓存主机进入限制状态。 当缓存主机内存位于 CacheSize 设置的 4% 之内时,也会发生限制。

请注意,处于受限制状态的服务器将也会显示运行增加的逐出。 有关逐出问题的详细信息,请参阅逐出疑难解答(Windows Server AppFabric 缓存

备注

有关上述工具的详细信息,请参阅运行状况监控工具(Windows Server AppFabric 缓存)

解决限制

决定解决限制之前,最好了解发生这个问题的原因,这一点非常重要。 下表提供了可能的原因以及建议的解决方案。

限制原因 描述和解决方案

其他进程使用了太多内存。

可能是缓存主机上的其他进程使用了大量内存。 这可能会导致内存不足情况(取决于为缓存服务保留的内存数量)。 您可以通过使用性能监视器中的 Process | Private Bytes 计数器查看用于每个进程的内存,从而检测这种情况。 如果缓存服务 DistributedCacheService.exe 不是主要内存使用者,则查找使用高内存百分比的其他进程。 一个解决方案是将有问题的进程移动到非缓存主机的其他服务器。 还可以向计算机中添加更多物理内存。

备注

尽管您可以使用 Set-CacheHostConfig 来设置缓存主机的缓存大小,但该限制仅决定何时触发逐出运行。 不保证缓存服务的内存将停留在该级别。 有关详细信息,请参阅 逐出疑难解答(Windows Server AppFabric 缓存

缓存服务使用了太多内存。

这可以通过使用任务管理器或性能监视器查看缓存服务 DistributedCacheService.exe 使用的内存来识别。 有可能是一个或多个缓存禁用了过期和或逐出。 这可能会导致内存不足的情况。 可以使用 Windows PowerShell 命令 Get-Cache -MaxRegions 0 查明群集中的缓存。 可以使用 Get-CacheConfig 命令查看每个缓存的设置。 有关过期和逐出的详细信息,请参阅过期和逐出。 也有可能是缓存群集的需求超过了容量。 可以向缓存主机中添加更多物理内存,也可以向群集中添加其他缓存主机。

未收集 .NET 内存。

尽管 .NET 垃圾收集自动进行,但有时在收集之间未收集的内存也会导致缓存主机的内存不足情况。 在这种情况下,在限制缓存主机上使用 Windows PowerShell 命令 Invoke-CacheGC 以强制完整的垃圾收集循环。 如果内存不足情况仍然存在,则未收集的 .NET 内存不是导致这种情况的因素。

自定义区域。

应用程序可以使用 CreateRegion 方法创建自定义区域。 这些区域在特定缓存主机上始终作为一个整体存在。 如果应用程序在一个区域中放置了大量数据,则有可能一个缓存主机将变为限制状态,即使其他缓存主机上有可用内存。 一个解决方案是向群集中的每个缓存主机添加更多内存,因为您无法确切知道选择了哪个缓存主机用于自定义区域。 另一个解决方案是重新设计应用程序,以使其在该区域内存储少量数据或者创建和使用多个区域。

标记哈希表

可以使用多种 AppFabric 缓存方法将项目存储在具有关联标记的缓存中。 使用标记创建内部哈希表,即使在删除关联的项目之后也不会删除这些表。 这不是内存泄漏,但它可能会贡献于 AppFabric 缓存服务使用的全部内存。 如果应用程序使用随时间而改变的标记,则该方法可能会造成内存压力。

另请参阅

概念

解决服务器问题(Windows Server AppFabric 缓存)

  2011-12-05