1

質問: 私は何か間違ったことをしていますか? 構成設定が間違っていませんか? AppFabric によるメモリ使用量は通常よりも下回っていますか?

問題: SQL データベース テーブルから AppFabric キャッシュ メモリにデータを読み込んでいます。AppFabric はかなり小さなオブジェクトに大量のメモリを使用しているようですが、その理由がわかりません (最近 AppFabric を使い始めたので、初心者です)。

説明: 約 60MB の SQL テーブルは、AppFabric キャッシュで一度約 800MB に変換されます。

詳細:

ロードするテーブルの SQL データ サイズ:

SQL データサイズ

App Fabric のアイドル メモリ使用量:

AppFabric のアイドル状態の使用

サーバー構成:

<?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メモリ使用量データがロード(プット)された後の AppFabric メモリ使用量

4

2 に答える 2

1

AppFabric 1.1 を使用している場合は、内部 GC が割り当てられたメモリを解放しないことを知っておく必要があります。そのため、使用するメモリの量が決まっている場合、または LRU を有効にしている場合は、CacheCluster ホストのメモリを制限できます (例: SET-CacheHostConfig -HostName ServerName -CachePort PORT -CacheSize 1024)。これにより、メモリ使用量がそのレベルを超えていないことが保証されます。必然的にそのレベルまで忍び寄ることを理解することが重要です。

于 2014-03-06T04:04:32.187 に答える
-2

これを読んだ将来のユーザーのために、私自身の質問に答えたいと思います。

AppFabric を使用せず、Redis や MemCached などの製品を検討してください。彼らは私が見ることができるあらゆる点で優れています。

AppFabric にはまだ問題が多すぎて、本番システムに組み込むことができません。

于 2013-11-27T11:36:40.153 に答える