【问题标题】:AppFabric caching expiring suddenlyAppFabric 缓存突然过期
【发布时间】:2011-11-04 19:01:18
【问题描述】:

我目前正在测试 AppFabric 缓存,但我的缓存有一个奇怪的问题。尽管我说他需要缓存一个简单的对象 3 分钟,但他只缓存了大约 3 秒。

我的缓存设置如下:

PS C:> Get-CacheConfig 默认 缓存名称:默认 生存时间:100 分钟 缓存类型:分区 次级:0 IsExpirable : 真 驱逐类型:LRU NotificationsEnabled : 假

我使用以下 3 个命令行开关构建了这个缓存:

Use-CacheCluster 
Start-CacheCluster
Grant-CacheAllowedClientAccount <myAccount>

之后我尝试运行以下程序(program.cs):

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("Press any key to continue, Q to quit");
        while (Console.ReadKey() != new ConsoleKeyInfo('q', ConsoleKey.Q, false, false, false))
        {
            DoStuff();
        }
    }

    static void DoStuff()
    {
        Person p = null;
        DataCacheItem cacheItem = CacheUtility.CurrentCache.GetCacheItem("jebas");
        if (cacheItem != null)
        {
            Console.WriteLine("V - Got my stuff from cache");
            p = (Person)cacheItem.Value;
        }

        if (p == null)
        {
            Console.WriteLine("! - I just did an expensive call");
            p = GetPerson();
            CacheUtility.CurrentCache.Add("jebas", p, new TimeSpan(0, 30, 0));
        }
    }

    private static Person GetPerson()
    {
        return new Person() { FirstName = "Jeroen", LastName = "Van Bastelaere", Id = Guid.NewGuid() };
    }
}

CacheUtility 类:

sealed class CacheUtility
{
    private static DataCacheFactory _factory;
    private static DataCache _cache;
    private static readonly object _lock = new object();

    CacheUtility() { }

    public static DataCache CurrentCache
    {
        get
        {
            lock (_lock)
            {
                if (_cache == null)
                {
                    List<DataCacheServerEndpoint> servers = new List<DataCacheServerEndpoint>();
                    servers.Add(new DataCacheServerEndpoint("demo2010a", 22233));
                    DataCacheFactoryConfiguration config = new DataCacheFactoryConfiguration()
                    {
                        Servers = servers
                    };
                    _factory = new DataCacheFactory(config);
                    _cache = _factory.GetDefaultCache();
                }
                return _cache;
            }
        }
    }
}

使用这个程序,我只是运行它并按一个随机键一段时间:大多数时候它会说“我从缓存中获取它”,但每 3 秒它会执行一次昂贵的调用。 当我检查 Get-CacheStatistics default 当他错过缓存时,他有这个:

PS C:> Get-CacheStatistics 默认

尺寸:0 项目数:0 区域数:1 请求数:1543 MissCount : 75

当它在缓存中时,它会给我这个:

尺寸:566 项目数:1 区域数:1 请求数:1553 MissCount : 77

使用 perfmon,我可以知道我的对象被驱逐了,因为当我运行我的程序时计数器 Total Evicted Objects 会上升(它突然不再在缓存中了)。

我不知道为什么它会被驱逐,这是我目前缓存的唯一对象,服务器还有足够的内存 (4GB+)

谁能帮我让我的对象缓存 30 分钟,而不是 3 秒?

非常感谢您的帮助。 :-)

提前致谢,

杰伦

【问题讨论】:

  • 显然资源限制已经到位,我有大约 6 个 w3wp 进程、1 个 sql 和一个占用大量内存(占总物理内存的 90%)的 owstimer 进程,并且当总可用内存低于它开始节流的物理内存的 15%。杀死进程为我解决了这个问题(或者实际上:iisreset :-))
  • 我无法将其标记为已解决,尽管它确实已解决。

标签: c# caching powershell console appfabric


【解决方案1】:

当 Windows Server AppFabric 缓存上的物理内存变低时 主机,缓存主机可以进入一种称为节流的状态。缓存 集群不会将数据写入任何位于受限制的缓存中 缓存主机直到可用物理内存增加来解决 节流状态。

http://msdn.microsoft.com/en-us/library/ff921030.aspx

;)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-24
    • 2011-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多