逐出疑难解答(Windows Server AppFabric 缓存

Windows Server AppFabric 缓存群集使用逐出来控制缓存服务在缓存主机上使用的内存数量。 在两种情况下会发生逐出:

  • 服务器上的可用物理内存严重不足。

  • 缓存服务的内存使用超过了缓存主机的高水印。

逐出并不一定是问题。 如果您在缓存群集上意外具有大量活动,则逐出可以删除最近最少使用的项目并且防止内存问题造成限制。 有关限制的详细信息,请参阅限制疑难解答(Windows Server AppFabric 缓存)。 但是,定期逐出运行可能表明缓存主机或多个缓存出现内存不足或配置问题。

有关逐出的详细信息,请参阅过期和逐出

诊断逐出问题

从应用程序的角度,逐出可能会使应用程序找不到缓存中应有的项目。 这意味着应用程序必须重新填充这些项目,否则可能会对应用程序性能产生不利影响。

要评估逐出运行的频率,您可以使用性能监视器来记录两个计数器或四个计数器。

计数器 说明

AppFabric 缓存:主机 | 逐出运行总数

自 AppFabric 缓存服务启动以来逐出运行的总数。

AppFabric 缓存:主机 | 数据总字节大小

缓存数据的总大小(以字节为单位)。

AppFabric 缓存:主机 | 逐出对象总数

自 AppFabric 缓存服务启动以来逐出对象的数量。

AppFabric 缓存:主机 | 逐出的内存总量

自 AppFabric 缓存服务启动以来逐出内存的数量(以字节为单位)。

由于自从启动缓存服务会累计逐出计数器,因此您必须随着时间的推移通知此值的更改。

还有两个事件与逐出运行相关。 这些事件发生在 AppFabric 的操作日志中。

事件 ID 说明

118

服务可用内存不足。

115

服务已进入限制状态。

118 事件表明缓存服务已达到高水印内存级别。 这会触发逐出运行,以尝试将内存级别返回到低水印内存级别。 115 事件表明服务器内存不足并且已进入限制状态。 这会触发逐出运行,以尝试解决限制状态。 有关限制的详细信息,请参阅限制疑难解答(Windows Server AppFabric 缓存)

备注

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

解决逐出问题

如果由于服务器内存不足而发生逐出运行,则服务器还可能处于限制状态。 有关如何解决限制问题的详细信息,请参阅限制疑难解答(Windows Server AppFabric 缓存)

如果当服务器未处于限制状态时发生逐出运行,则使用 Get-CacheHostConfig Windows PowerShell 命令查看缓存主机配置设置。 例如,考虑以下缓存主机设置。

Get-CacheHostConfig -HostName CacheServer1 -CachePort 22233

HostName        : CacheServer1
ClusterPort     : 22234
CachePort       : 22233
ArbitrationPort : 22235
ReplicationPort : 22236
Size            : 100 MB
ServiceName     : AppFabricCachingService
HighWatermark   : 90%
LowWatermark    : 80%
IsLeadHost      : False

在上面的示例中,在 CacheServer1 上为缓存服务保留的内存大小为 100 MB。 高水印为 90%。 这意味着当该缓存主机上使用的内存达到 100 MB 的 90% 时,缓存服务将出现内存不足并且将触发逐出。 在本示例中,问题是缓存服务的内存设置得异常低。 解决方案是增加 CacheServer1 缓存主机上缓存内存的数量。 以下示例停止缓存群集并将大小更改为 1000 MB。

Stop-CacheCluster
Set-CacheHostConfig -CacheSize 1000 -HostName CSD1516217 -CachePort 22233

警告

除非您还有可用的物理内容支持增加,否则不应增加缓存服务的可用内存数量。

备注

CacheSizeHighWatermark 组合可确定触发逐出运行的时间。 但不保证缓存内存将停留在该级别或低于该级别。 例如,查看下一部分中有关非逐出缓存的讨论。

非逐出缓存注意事项

默认情况下,新缓存启用逐出;但是,您可以创建不启用逐出的缓存。 如果不为缓存启用逐出,则逐出运行将不会从该缓存中删除任何项目。 这有几层含义:

  • 如果内存压力是由非逐出缓存造成的,则逐出运行将不会解决该问题。 在这种情况下,逐出运行将重复发生。

  • 如果内存压力是由非逐出缓存造成的,则逐出运行将删除启用逐出的其他缓存中的项目。

要确定哪个缓存启用逐出,可以使用 Get-CacheConfig Windows PowerShell 命令。 可以使用一个简单的脚本来显示每个缓存、其逐出设置及其大小。

$cache = Get-Cache
foreach($cache in $caches) { Write-Host $cache.CacheName (Get-CacheConfig $cache.CacheName).EvictionType (Get-CacheStatistics $cache.CacheName).Size }

以下示例显示来自该脚本的示例输出。

Cache1 None 20481960
Cache2 LRU 20706360
default LRU 4099920

在上面的示例输出中,您可以看到 Cache1 已禁用逐出(None 代替 LRU)并且其当前大小为 20481960 个字节。

另请参阅

概念

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

  2011-12-05