【问题标题】:Slow AppFabric, high CPU and Memory UsageAppFabric 速度慢,CPU 和内存使用率高
【发布时间】:2014-08-05 14:33:13
【问题描述】:

我在我的 ASP.NET Web 应用程序中实现了 AppFabric 1.1。我正在使用 Read Through 方法,因为我只需要从我的 SQL 数据库中读取图像并将它们存储在缓存中。所以我将有机会尽快检索这些数据。

我正在检查 shell,如果缓存为空,我可以看到我的应用程序正在从缓存中成功读取并写入缓存。但是,AppFabric 并没有我预期的那么快。没有 AppFabric 的版本比有 AppFabric 的版本快。除此之外,当我使用 Appfabric 时,我可以看到 CPU 和内存使用率很高。

这可能是什么原因?你对我有什么建议?

感谢您的想法,

【问题讨论】:

    标签: asp.net caching appfabric


    【解决方案1】:

    因此,如果没有更多详细信息,很难确定,但我可以尝试从 AppFabric 的经验中提供帮助。我们是在谈论 AppFabric 服务器或客户端计算机上的高内存使用率(不确定您使用的是 Web 应用程序还是其他东西)

    1. AppFabric 将比进程内内存慢,AF 也不应与您的应用程序位于同一服务器上。
    2. 如何创建 AppFabric DataCacheFactory?您是否为每个请求创建?这很糟糕,因为它很昂贵,所以它应该是静态/单例。我做类似的事情

    公共类 AppFabricDistributedCacheManagerFactory {

    private static DataCacheFactory _dataCacheFactory;
        public void Initialize()
        {
            if (_dataCacheFactory == null)
            {
                _dataCacheFactory = new DataCacheFactory();
            }
        }
    ......
    
    1. 您是否在 AppFabric 中启用了本地缓存,对于图像来说似乎合适。
    2. 确保您的 Provider 没有抛出异常,并且仅在真正应该调用 Appfabric 时才调用它。将提琴手放在您的开发盒上并观察请求。所以注意

      1. 第一次调用 AF,您使用的是区域吗?让你创造它。
      2. 如果您正在创建区域?你在保存之前让它存在吗?以防万一您查看此代码..在此之前..我遇到了一些问题

        public void SaveToProvider(string key,TimeSpan duration ,string regionName,object toSave)
        try
        {
            Cache.Put(key, toSave, duration , regionName);
        }
        catch (DataCacheException cacheError)
        {
            // Look at the ErrorCode property to see if the Region is missing
            if (cacheError.ErrorCode == DataCacheErrorCode.RegionDoesNotExist)
            {
                // Create the Region and retry the Put call
                Cache.CreateRegion(_regionName);
                Cache.Put(key, toSave, duration , regionName);
            }
        }
        
    3. 当您请求的项目不是缓存时,请查看请求。看到调用 AF 然后加载图像并再次调用 AF 以保存。

    4. 当您知道项目已加载时观察请求,如果您正在使用本地缓存,您应该看不到任何 AF 请求。如果不是,则有一个。

    【讨论】:

    • 谢谢@jon,这是非常详细的信息。在我的测试版中,我在同一台服务器上使用 AF。除此之外,我没有使用区域。我创建了用于实现 ReadThrough 逻辑的提供程序文件。我使用的是 DataCacheItemFactory.GetCacheItem() 而不是 Cache.Put()。有没有机会在这种方法中使用区域?
    • @meri 如果要按标签搜索,则只需使用区域,即使用GetObjectsByTag()
    • @stuartd True Regions 对于 'GetObjectsByTag()' 在代码方面很有用,但它们对于服务器管理也很有用。管理我的 appfabric 的管理员喜欢区域,因此他们可以更详细地查看正在存储的项目。 -meri 如果您可以使用 ReadThrough 提供程序,我不是 100%。我通常不使用它们,因为部署它们很麻烦。但是,我通过在我的代码中编写一个缓存提供程序来完成非常相似的行为,它从缓存加载,但如果它是空的,则加载项目并将其存储在缓存中。恕我直言,这并不难并且更好地分离关注点。
    • @JonZ 使用区域也意味着您不能拥有高可用性缓存集群..
    • @meri 你可以将第四个参数中的标签传递给DataCacheItemFactory.GetCacheItem()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-07
    • 2022-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多