【问题标题】:AppFabric Cache memory very intensiveAppFabric 缓存内存非常密集
【发布时间】:2013-11-21 07:33:20
【问题描述】:

问题:我做错了吗?配置设置不正确? AppFabric 显示的内存使用量是否正常?

问题:我正在将 SQL 数据库表中的数据读取到 AppFabric 缓存中。似乎 AppFabric 对一个相当小的对象使用了大量内存,我不明白为什么(我最近开始使用 ApppFabric-所以我是个菜鸟)

描述:大约 60MB 的 SQL 表在 AppFabric 缓存中一次转换为大约 800MB。

详情:

我打算加载的表的 SQL 数据大小:

App Fabric 空闲内存使用情况:

服务器配置:

<?xml version="1.0" encoding="utf-8"?>
    <configuration>
        <configSections>
            <section name="dataCache" type="Microsoft.ApplicationServer.Caching.DataCacheSection, Microsoft.ApplicationServer.Caching.Core" />
        </configSections>
         <dataCache size="Small">
<caches>
  <cache consistency="StrongConsistency" name="MobileCache" minSecondaries="0">
    <policy>
      <eviction type="None" />
      <expiration defaultTTL="1" isExpirable="false" />
    </policy>
  </cache>
  <cache consistency="StrongConsistency" name="default" minSecondaries="0">
    <policy>
      <eviction type="Lru" />
      <expiration defaultTTL="10" isExpirable="true" />
    </policy>
  </cache>
</caches>
<hosts>
  <host replicationPort="22236" arbitrationPort="22235" clusterPort="22234"
    hostId="1073911731" size="1000" leadHost="true" account="BGZA\accName"
    cacheHostName="AppFabricCachingService" name="hostname.domain.co.za"
    cachePort="22233" />
</hosts>
<advancedProperties>
<transportProperties connectionBufferSize="131072" maxBufferPoolSize="2147483647" 
                   maxBufferSize="2147483647" maxOutputDelay="2" channelInitializationTimeout="60000" 
                   receiveTimeout="600000"/>
  <securityProperties>
    <authorization>
      <allow users="Rossp0033" />
    </authorization>
  </securityProperties>
</advancedProperties>
<deploymentSettings>
  <deploymentMode value="RoutingClient" />
</deploymentSettings>

客户端配置:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="dataCacheClient"
         type="Microsoft.ApplicationServer.Caching.DataCacheClientSection, Microsoft.ApplicationServer.Caching.Core,Version=1.0.0.0,Culture=neutral, PublicKeyToken=31bf3856ad364e35"
          allowLocation="true"
          allowDefinition="Everywhere"/>
  </configSections>
  <dataCacheClient>
    <hosts>
      <host
         name="HostName.DomainName.co.za"
         cachePort="22233"/>
    </hosts>
    <transportProperties connectionBufferSize="131072" maxBufferPoolSize="2147483647"
                      maxBufferSize="2147483647" maxOutputDelay="2" channelInitializationTimeout="60000"
                      receiveTimeout="600000"/>
  </dataCacheClient>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
  </startup> 
</configuration>

C# 代码:

public static void ReadPortedNumbers()
{
    MobileDataContext mdc = null;
    List<PortedNumberCollection> col;

    try
    {
        mdc = new MobileDataContext(strConnString);

        col = (from RN in mdc.tblRoutedNumbers
               select Convert(RN)).ToList();

        var CacheFactory = new DataCacheFactory();
        var myCache = CacheFactory.GetCache("MobileCache");

        myCache.Put("PortedNumberCollection", col);

    }
    catch (Exception E)
    {
        throw new System.Exception(E.GetType().ToString() + " in BG.Mobile.DAL.ReadPortedNumbers, Message : " + E.Message, E);
    }
    finally
    {
        if (mdc != null) mdc.Dispose();
    }
}

public static PortedNumberCollection Convert(tblRoutedNumber DataClass)
{
    try
    {
        PortedNumberCollection BusinessClass = new PortedNumberCollection();

        BusinessClass.PortedID = DataClass.PortedID;
        BusinessClass.MSISDN = DataClass.MSISDN;
        BusinessClass.RoutingLabel = DataClass.RoutingLabel;
        BusinessClass.RouteAction = DataClass.RouteAction;

        return BusinessClass;
    }
    catch (Exception E)
    {
        throw new System.Exception(E.GetType().ToString() + " in BG.Bus.Mobile.DALConvertor.Convert(tblRoutedNumber DataClass): " + E.Message);                

    }
}

[DataContract][Serializable]
public class PortedNumberCollection
{
    [DataMember]        
    public Int64 PortedID;

    [DataMember]        
    public string MSISDN;

    [DataMember]        
    public string RoutingLabel;

    [DataMember]
    public string RouteAction;
}   

加载(放置)数据后 AppFabric 内存使用情况

【问题讨论】:

  • 我不知道它是否解释了它,但大多数内存缓存 over allocate 以防止大量分配。尝试加载 half 表(最好是随机加载),看看它是否使用了 appfabric 当前使用的内存的一半,还是使用完全相同的数量。
  • 顺便说一句:用单个键 ("PortedNumberCollection") 上的大对象填充缓存是一个真的坏主意;每当您访问它时,都必须发送整个内容,这会影响带宽。
  • 附加想法:尝试用NetDataContractSerializer 序列化col(即IIRC,app-fabric 客户端库使用的内容);看看有多大
  • 我理解 AppFabric 的过度分配行为,但采纳您的建议并加载一半的表给我的内存使用量与加载整个表的内存使用量相同(这是个好问题),这让我相信出了点问题...

标签: c# windows-server-2012 appfabric-cache


【解决方案1】:

如果您使用的是 AppFabric 1.1,您需要知道它的内部 GC 不会释放任何分配的内存。因此,如果您确定要使用的内存量或启用了 LRU,则可以限制 CacheCluster 主机的内存(例如SET-CacheHostConfig -HostName ServerName -CachePort PORT -CacheSize 1024)。这将确保您的内存使用量不超过该级别。重要的是要明白它会不可避免地上升到那个水平。

【讨论】:

  • 我完全按照你说的做了。不幸的是,我没有遇到同样的结果。你的回答也没有回答这个问题。看看其他做了你提到的但不起作用的人。So why the down vote
  • @BossRoss 所以你说你有所有最新补丁的 1.1,系统补丁,低于 4 GB 内存,你不能限制它吗?我看到它有一点开销(上限在 50 到 250 Mb 之间,但它确实有上限)。你在什么操作系统上?我在 2008 R2 和 2012 都使用了这个。
【解决方案2】:

我想为阅读本文的任何未来用户回答我自己的问题。

不要使用 AppFabric,而是看看 Redis 或 MemCached 之类的产品。他们在我所看到的各个方面都更好。

AppFabric 仍然存在太多问题,无法在我的生产系统中使用。

【讨论】:

  • 您没有回答自己的问题。你的回答也不是很相关。为 appfabric 缓存服务显示多少“内存”任务管理器与存储在那里的数据量无关(以 SQL 服务器为例)。这里有几个链接可以提供帮助: 最佳实践:msdn.microsoft.com/en-us/library/hh830824(v=azure.10).aspx 有点解释:blogs.msdn.com/b/distributedservices/archive/2013/10/02/… 我不知道确切的数学,但是是的,我可以看到缓存中的数据增加了 10 倍。
  • 我已经被扔了所有这些......好几次了。即使是垃圾收集问题,所有正确的设置、足够的内存和使用 Put 选项的 CPU 总是会增加应该替换对象和内存 (IMO) 的内存。除非有人可以向我提供相同对象的工作样本,将其“放入”同一缓存区域而内存不会持续增长,否则我的答案是因为它还没有准备好用于我的生产系统。
  • 仅供参考:link
  • 我已经在生产集群上使用 AppFabric (Velocity CTP3) 超过 4 年了(是的,我知道 CTP 不应该为生产而构建),拥有超过 100 万台移动设备。我最近才迁移到 AF 1.1,所以我仍在学习其中的差异,但系统还不错。是的,内存分配的事情看起来很可怕,但我并不关心它,只要我没有看到超时和错误。我不断地按键更新内存中的对象。不确定您在寻找什么。
  • 作为仍在使用 AppFabric 的人,让我全力支持这个答案,尤其是粗体部分。此外,这个答案比以往任何时候都更相关、更正确。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-24
相关资源
最近更新 更多