2012-09-28 12 views
8

मैं एक परीक्षण चला रहा हूं जहां मैं fetch time b/w appfabric और SQL Server 2008 की तुलना कर रहा हूं और लगता है कि ऐपफ़ैब्रिक SQL सर्वर से 4x समय धीमा कर रहा है।ऐपफैब्रिक कैश SQL सर्वर 2008 की तुलना में 4x धीमी गति से प्रदर्शन कर रहा है ??

मेरे पास एक SQL Server 2008 सेटअप है जिसमें 4 कॉलम के साथ केवल एक तालिका है (सभी nvarchar)। तालिका में 6000 पंक्तियां हैं। मैं ऐपफैब्रिक कैश में एक ही पंक्ति (सीएलआर सीरियलज़ेबल ओबीजे के रूप में) डालता हूं। मैं डेटा एक्स बार लाने के लिए एक लूप चला रहा हूँ।

यहाँ कोड

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)); 
} 

} 

और यहाँ है पाश कैश

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; 
} 
} 

से डेटा प्राप्त करने मैं एसक्यूएल सर्वर से डेटा पुनः प्राप्त करने बिल्कुल एक ही तर्क है। यह बनाता है एक

sqlCommand = 'Select * from TableName where posId = 'someId'' 

यहाँ के परिणाम हैं ...

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 

मैं यहाँ कुछ याद आ रही है? यह इतना धीमा क्यों है?

उत्तर

0

मुझे लगता है कि आपका परीक्षण पक्षपातपूर्ण है और आपके परिणाम गैर अनुकूल हैं।

वितरित कैश के बारे में

  • स्थानीय कैश: आप विकलांग local cache सुविधा है। कैश ऑब्जेक्ट्स हमेशा सर्वर से पुनर्प्राप्त होते हैं; नेटवर्क ट्रांसफर्ट और deserialization लागत है।
  • थोक गेट: BulkGet छोटी वस्तुओं के साथ उपयोग किए जाने पर प्रदर्शन में सुधार करता है, उदाहरण के लिए, 1 - 5 केबी या आकार में कम से कम कई वस्तुओं को पुनर्प्राप्त करते समय।
  • कोई डेटा संपीड़न: ऐपफ़ैब्रिक और कैश क्लाइंट के बीच कोई संपीड़न नहीं। this देखें।

आपका परीक्षण

एक अन्य महत्वपूर्ण बात के बारे में है कि अपनी ही बात का परीक्षण नहीं कर रहे हैं: एक तरफ आप का चयन का परीक्षण * और और दूसरी तरफ आप एन एक्स प्राप्त मद का परीक्षण करें।

+1

मुझे नहीं लगता कि आपने पहले डी-कैश का उपयोग किया है। बस कुछ सामान जानना पर्याप्त नहीं है। >> यदि मैं स्थानीय कैश सक्षम करता हूं, तो यह एक अनुचित परीक्षण होगा। >> थोक प्राप्त करें - मैं SQL सर्वर के लिए भी ऐसा ही कर सकता था और मुझे पूरा यकीन है कि यह काफी तेज़ होगा। एसक्यूएल सर्वर सिर्फ एक पंक्ति को पुनः प्राप्त करने से ज्यादा कुछ नहीं नफरत करता है। >> मैं केवल 6k रिकॉर्ड के लिए संपीड़न सक्षम क्यों करना चाहता हूं। प्रत्येक केवल 4 स्ट्रिंग स्टोरेज के साथ। – user1707312

+0

@ user1707312 मैं आपको टिप्पणी नहीं समझता। क्या आप समझाएँगे ? मैं ऐपफैब्रिक का मालिक नहीं हूं। मैंने इसे एक साल से इस्तेमाल किया। यदि आपने पहले डी-कैश का उपयोग किया है, तो आपको यह भी पता होना चाहिए कि डी-कैश का उपयोग प्रदर्शन में सुधार को लक्षित नहीं करता है, लेकिन स्केलेबिलिटी। एकल डेटा तालिका वाले एकल क्लाइंट पर लूप के लिए "लोड टेस्टिंग" सबसे अच्छा तरीका नहीं है। – Cybermaxs

+0

भूल जाओ -it इसमें शामिल नहीं होने देता है। बीटीडब्लू-फॉर्म प्रदर्शन बिंदु दृष्टिकोण मेम्केचे/कोचबेस के साथ ऐपफैब्रिक की तुलना करने का प्रयास करें। – user1707312

1

यह .Net के क्रमबद्धरण में निर्मित हो सकता है।

नेट सीरियलाइजेशन प्रतिबिंब का उपयोग करता है जो बदले में बहुत खराब प्रदर्शन करता है। मैं कस्टम लिखित क्रमबद्धता कोड के उपयोग की तलाश करने की सिफारिश करता हूं।

2

अंतर नेटवर्क ओवरहेड है। अपने एसक्यूएल उदाहरण में, आप एक बार नेटवर्क पर हॉप करते हैं और एन पंक्तियों का चयन करते हैं। अपने ऐपफैब्रिक उदाहरण में, आप थोक में बजाय प्रति रिकॉर्ड नेटवर्क पर हॉप करते हैं। यह अंतर है। इसे साबित करने के लिए, अस्थायी रूप से अपने रिकॉर्ड को ऐपफ़ैब्रिक में एक सूची के रूप में संग्रहीत करें और केवल एक बार सूची प्राप्त करें, या ऐपफ़ैब्रिक थोक API का उपयोग उन सभी को एक अनुरोध में चुनने के लिए करें - जो कि बहुत अंतर के लिए जिम्मेदार होना चाहिए।

+1

ऐसा नहीं लगता कि वह ऐसा कर रहा है: वह पंक्ति से डेटा पंक्ति पुनर्प्राप्त कर रहा है: sqlCommand = 'tableName से चुनें * जहां posId =' someId '' –

संबंधित मुद्दे