Estoy ejecutando una prueba en la que estoy comparando el tiempo de recuperación b/w appfabric y SQL Server 2008 y parece que appFabric está funcionando 4 veces más lento que SQL Server.Appfabric Cache funciona 4 veces más lento que SQL Server 2008 ??
Tengo una instalación de SQL Server 2008 que contiene solo una tabla con 4 columnas (todas nvarchar
). La tabla tiene 6000 filas. Inserté la misma fila (como obj serializable CLR) en la memoria caché de la aplicación. Estoy ejecutando un ciclo para obtener datos x veces.
Este es el código
public class AppFabricCache
{
readonly DataCache myDefaultCache;
public AppFabricCache()
{
//-------------------------
// Configure Cache Client
//-------------------------
//Define Array for 1 Cache Host
var servers = new List<DataCacheServerEndpoint>(1);
//Specify Cache Host Details
// Parameter 1 = host name
// Parameter 2 = cache port number
servers.Add(new DataCacheServerEndpoint(@"localhost", 22233));
//Create cache configuration
var configuration = new DataCacheFactoryConfiguration();
//Set the cache host(s)
configuration.Servers = servers;
//Set default properties for local cache (local cache disabled)
configuration.LocalCacheProperties = new DataCacheLocalCacheProperties();
//Disable exception messages since this sample works on a cache aside
DataCacheClientLogManager.ChangeLogLevel(System.Diagnostics.TraceLevel.Off);
//Pass configuration settings to cacheFactory constructor
DataCacheFactory myCacheFactory = new DataCacheFactory(configuration);
//Get reference to named cache called "default"
myDefaultCache = myCacheFactory.GetCache("default");
}
public bool TryGetCachedObject(string key, out object value)
{
value = myDefaultCache.Get(key);
bool result = value != null;
return result;
}
public void PutItemIntoCache(string key, object value)
{
myDefaultCache.Put(key, value, TimeSpan.FromDays(365));
}
}
Y aquí está el bucle para obtener los datos de la caché
public double RunReadStressTest(int numberOfIterations, out int recordReadCount)
{
recordReadCount = 0;
Stopwatch sw = Stopwatch.StartNew();
for (int i = 0; i < numberOfIterations; i++)
{
for (int j = 1; j <= 6000; j++)
{
string posId = "PosId-" + j;
try
{
object value;
if (TryGetCachedObject(posId, out value))
recordReadCount++;
}
catch (Exception e)
{
Trace.WriteLine("AS%% - Exception - " + e.Message);
}
}
}
sw.Stop();
return sw.ElapsedMilliseconds;
}
}
Tengo exactamente la misma lógica para recuperar datos de SQL Server. Se crea una
sqlCommand = 'Select * from TableName where posId = 'someId''
Éstos son los resultados ...
SQL Server 2008 R2 Reading-1(ms) Reading-2(ms) Reading-3(ms) Average Time in Seconds
Iteration Count = 5 2528 2649 2665 2.614
Iteration Count = 10 5280 5445 5343 5.356
Iteration Count = 15 7978 8370 7800 8.049333333
Iteration Count = 20 9277 9643 10220 9.713333333
AppFabric Reading-1 Reading-2 Reading-3 Average Time in Seconds
Iteration Count = 5 10301 10160 10186 10.21566667
Iteration Count = 10 20130 20191 20650 20.32366667
Iteration Count = 15 30747 30571 30647 30.655
Iteration Count = 20 40448 40541 40503 40.49733333
Me estoy perdiendo algo aquí? ¿Por qué es tan lento?
No creo que haya usado d-cache anteriormente. Solo saber algunas cosas no es suficiente. >> Si habilito la memoria caché local, sería una prueba injusta. >> Bulk get: podría haber hecho lo mismo para el servidor SQL y estoy bastante seguro de que sería significativamente rápido. Sql Server odia nada más que solo recuperar una sola fila. >> ¿Por qué querría habilitar la compresión solo para 6k registros? cada uno con solo 4 cadenas de almacenamiento. – user1707312
@ user1707312 No entiendo tu comentario. Podrías explicar ? No soy un maestro de AppFabric. Lo usé desde hace un año. Si ha utilizado d-cache anteriormente, también debe saber que el uso de d-cache no tiene como objetivo mejorar el rendimiento, sino escalabilidad. "Cargar pruebas" en un bucle for en un único cliente con una sola tabla de datos no es el mejor enfoque. – Cybermaxs
olvidar, no permite entrar en eso. Btw: forma el punto de vista del rendimiento, intenta comparar AppFabric con Memcache/Couchbase. – user1707312