Asp.Net MemoryCache被驱逐无缘无故

时间:2014-11-07 11:18:37

标签: c# asp.net caching memorycache

我正在测试System.Runtime.Caching.MemoryCache,看看它是如何工作的。

我创建了一个缓存,如下所示:

            NameValueCollection config = new NameValueCollection();
            config.Add("cacheMemoryLimitMegabytes", Convert.ToString(250));
            config.Add("pollingInterval", Convert.ToString("00:00:17"));
            config.Add("physicalMemoryLimitPercentage", Convert.ToString(2));
            _m_memoryCacheToUse = new MemoryCache("MemCache",config);

我创建了一个测试网页,基本上我可以在缓存中指定大约1KB内存大小(1000字节数组)的项目数量。我的机器有12GB的RAM,目前的RAM使用率约为40%,这让我有很多内存可供使用。从上面的设置中,我应该使用250MB的ram,或者我物理内存的2%。出于某种原因,当我读取设置(cache.PhysicalMemoryLimit)时,它显示3%而不是2%。 2%应该等于245MB,而3%应该等于368MB。

首先,我不确定它是如何工作的。 PhysicalMemoryLimit的默认值为99%,而我的PC上的CacheMemoryLimitMegabytes设置为7.8GB。所以我决定覆盖这两个设置。当你设置它们时我不知道它是如何工作的,所以我尝试了类似的值。

我在缓存中插入了50,000个项目,如下所示:

    void btnGenerateCacheStressTest_Click(object sender, EventArgs e)
    {
        TimeSpan slidingExpiration = new TimeSpan(24, 1, 1, 1);
        DateTimeOffset expirationDate = DateTimeOffset.MaxValue;
        int itemsToGenerate = Convert.ToInt32(txtItemsToGenerate.Text);
        var cache = MemCacheToUseToUse;

        Random rnd = new Random();

        for (int i = 0; i < itemsToGenerate; i++)
        {
            CacheItemPolicy policy = new CacheItemPolicy();
            policy.Priority = CacheItemPriority.Default;
            policy.RemovedCallback += CacheEntryRemovedCallback;
            policy.SlidingExpiration = slidingExpiration;
            policy.AbsoluteExpiration = expirationDate;

            string regionName = null;
            string rndKey = ("stressTest-Data-" + DateTime.Now.Ticks + "-" + i);

            byte[] bytesArray = new byte[1000];
            rnd.NextBytes(bytesArray);


            cache.Add(rndKey, bytesArray, policy, regionName);
        }

    }

我使用NoSlidingExpiration进行了实验,并定义了滑动过期。 50,000个项目应该相当于大约50-70MB我猜想会增加一些开销。这远远低于我允许缓存的256MB。然而,几秒钟后,CacheEntryRemovedCallback被调用,缓存有时甚至只有1000个项目。 RemovedReasonEvicted,MSDN所说的是{http://msdn.microsoft.com/en-us/library/system.runtime.caching.cacheentryremovedreason(v=vs.110).aspx

它不应该接近这样的限制。他们为什么被驱逐?

0 个答案:

没有答案