खाली टेबल का अनुप्रयोग


10

मेरी कंपनी एक ऐसे एप्लिकेशन का उपयोग करती है जिसमें बहुत बड़ी प्रदर्शन समस्याएं हैं। डेटाबेस के साथ कई समस्याएं हैं, जिनके माध्यम से मैं काम करने की प्रक्रिया में हूं, लेकिन कई समस्याएं विशुद्ध रूप से अनुप्रयोग से संबंधित हैं।

अपनी जांच में मैंने पाया कि SQL सर्वर डेटाबेस पर लाखों क्वेरीज़ हैं जो खाली तालिकाओं को क्वेरी करती हैं। हमारे पास लगभग 300 खाली टेबल हैं और उनमें से कुछ टेबल प्रति मिनट 100-200 बार तक बोली जाती हैं। तालिकाओं का हमारे व्यावसायिक क्षेत्र से कोई लेना-देना नहीं है और मूल रूप से मूल एप्लिकेशन के कुछ भाग हैं जो विक्रेता ने तब नहीं निकाले जब उन्हें हमारी कंपनी द्वारा हमारे लिए एक सॉफ्टवेयर समाधान तैयार करने के लिए अनुबंधित किया गया था।

इस तथ्य के अलावा कि हमें संदेह है कि हमारी एप्लिकेशन त्रुटि लॉग इस समस्या से संबंधित त्रुटियों से भरी हुई है, विक्रेता हमें आश्वासन देता है कि आवेदन या डेटाबेस सर्वर के लिए कोई प्रदर्शन या स्थिरता प्रभाव नहीं है। त्रुटि लॉग उस सीमा तक भर गया है कि हम निदान करने के लिए त्रुटियों के 2 मिनट से अधिक मूल्य नहीं देख सकते हैं।

इन प्रश्नों की वास्तविक लागत स्पष्ट रूप से CPU चक्र आदि के संदर्भ में कम होने वाली है, लेकिन क्या कोई सुझाव दे सकता है कि SQL सर्वर और अनुप्रयोग पर क्या प्रभाव होगा? मुझे संदेह होगा कि एक अनुरोध भेजने, इसकी पुष्टि करने, इसे संसाधित करने, इसे वापस करने और आवेदन द्वारा रसीद स्वीकार करने का वास्तविक यांत्रिकी खुद प्रदर्शन पर असर पड़ेगा।

हम एप्लिकेशन के लिए SQL Server 2008 R2, Oracle Weblogic 11g का उपयोग करते हैं।

@ फ्रिसबी- लंबी कहानी संक्षेप में, मैंने एक तालिका बनाई थी जिसमें क्वेरीटेक्स्ट था जो ऐप के डेटाबेस में खाली तालिकाओं को हिट करता था, फिर इसे उन सभी टैबलेम्स के लिए क्वेर करता था जिन्हें मैं जानता हूं कि वे खाली हैं और बहुत लंबी सूची मिली है। शीर्ष हिट 30 दिनों के अपटाइम में 2.7 मिलियन निष्पादन पर था, ऐप को ध्यान में रखते हुए आमतौर पर 8 am-6pm का उपयोग किया जाता है, इसलिए वे संख्या परिचालन घंटों के लिए अधिक केंद्रित होती हैं। कई तालिकाओं, कई प्रश्नों, शायद कुछ जोड़ के माध्यम से relavent, कुछ नहीं। शीर्ष हिट (उस समय 2.7 मिलियन) एक खाली तालिका से एक सरल चयन था जहां एक खंड, कोई जोड़ नहीं है। मुझे उम्मीद है कि रिक्त तालिकाओं में जुड़ने से बड़े प्रश्नों को लिंक किए गए तालिकाओं में अपडेट शामिल हो सकता है, लेकिन मैं इस प्रश्न की जांच करूँगा और इस प्रश्न को अपडेट करूँगा।

अद्यतन: १०४३ - ४६२२६१४ (२.५ महीने से अधिक) के बीच की गणना के साथ १००० प्रश्न हैं। कैश्ड प्लान की उत्पत्ति कब होगी, यह जानने के लिए मुझे और खुदाई करनी होगी। यह आपको केवल प्रश्नों की सीमा का अंदाजा लगाने के लिए है। अधिकांश 20 से अधिक जोड़ के साथ यथोचित रूप से जटिल हैं।

@ srutzky- हाँ, मेरा मानना ​​है कि जब योजना संकलित की गई थी, उस समय से संबंधित एक तारीख का कॉलम है, जो ब्याज का होगा, इसलिए मैं इसकी जांच करूंगा। मुझे आश्चर्य है कि जब SQL सर्वर एक VMware क्लस्टर पर बैठता है तो सीमाएं एक कारक होगी? जल्द ही एक समर्पित डेल पीई 730xD शुक्र है।

@ फ्रिसबी - देर से प्रतिक्रिया के लिए क्षमा करें। जैसा कि आपने सुझाव दिया, मैंने SQLQueryStress (इसलिए वास्तव में 240,000 पुनरावृत्तियों) का उपयोग करते हुए 24 थ्रेड्स पर 10,000 बार खाली टेबल से एक चयन * किया और तुरंत 10,000 बैच अनुरोध / सेकंड मारा। तब मैं 24 थ्रेड्स से 1000 गुना कम हो गया और 4,000 बैच अनुरोध / सेकंड के तहत हिट किया। मैंने केवल 12 थ्रेड्स (इसलिए 120000 कुल पुनरावृत्तियों) पर 10,000 पुनरावृत्तियों की कोशिश की और यह एक निरंतर 6,505 बैच / सेकंड का उत्पादन किया। सीपीयू पर प्रभाव वास्तव में ध्यान देने योग्य था, प्रत्येक परीक्षण चलाने के दौरान कुल CPU उपयोग का लगभग 5-10%। नेटवर्क वेट नगण्य थे (जैसे मेरे वर्कस्टेशन पर क्लाइंट के साथ 3ms) लेकिन सीपीयू प्रभाव वहाँ सुनिश्चित करने के लिए था, जो कि जहां तक ​​मेरा संबंध है, काफी निर्णायक है। यह CPU उपयोग और थोड़े अनावश्यक डेटाबेस फ़ाइल IO को उबालने लगता है। कुल निष्पादन / दूसरा काम 3000 साल से कम उम्र में हो जाता है। जो उत्पादन से अधिक है, हालांकि मैं इस तरह के दर्जनों प्रश्नों में से केवल एक का परीक्षण कर रहा हूं। सीपीयू के समय की बात करें तो 300-4000 बार प्रति मिनट के बीच खाली टेबल पर बैठे सैकड़ों प्रश्नों का शुद्ध प्रभाव नगण्य होगा। दोहरी फ्लैश सरणी और 256 जीबी रैम, 12 आधुनिक कोर के साथ एक निष्क्रिय पीई 730xD के खिलाफ किए गए सभी परीक्षण। यह SQLSentry से आउटपुट है

@ srutzky- अच्छी सोच। SQLQueryStress डिफ़ॉल्ट रूप से कनेक्शन पूलिंग का उपयोग करने लगता है, लेकिन मुझे वैसे भी एक नज़र मिला और पाया कि हाँ, कनेक्शन पूलिंग के लिए बॉक्स की जाँच की जाती है। का पालन करने के लिए अद्यतन

@ srutzky- कनेक्शन पूलिंग जाहिरा तौर पर आवेदन पर सक्षम नहीं है - या यदि यह है, तो यह काम नहीं कर रहा है। मैंने एक प्रोफाइलर ट्रेस किया और पाया कि ऑडिट लॉग इवेंट्स के लिए कनेक्शन में EventSubClass "1 - Nonpooled" है।

पुन: कनेक्शन पूलिंग- वेबलॉग की जाँच की और कनेक्शन पूलिंग सक्षम पाया। जीवित रहने के खिलाफ और अधिक निशान पाए गए और पूलिंग के संकेत सही ढंग से / बिल्कुल नहीं हो रहे हैं: यहाँ छवि विवरण दर्ज करें

और यहाँ पर ऐसा लगता है कि जब मैं एक एकल क्वेरी को बिना किसी जोड़ के एक आबादी वाले टेबल के साथ चलाता हूं; अपवाद पढ़ा "SQL सर्वर से कनेक्शन स्थापित करते समय एक नेटवर्क-संबंधित या आवृत्ति-विशिष्ट त्रुटि उत्पन्न हुई। सर्वर पाया नहीं गया था और पहुँच योग्य नहीं था। सत्यापित करें कि उदाहरण का नाम सही है और दूरस्थ कनेक्शन की अनुमति देने के लिए SQL सर्वर कॉन्फ़िगर किया गया है। (प्रदाता: नामित पाइप प्रदाता, त्रुटि: 40 - SQL सर्वर से कोई कनेक्शन नहीं खोल सकता) "बैच अनुरोध काउंटर पर ध्यान दें। समय के दौरान सर्वर को पिंग करना एक सफल पिंग प्रतिक्रिया में परिणाम उत्पन्न करता है।

यहाँ छवि विवरण दर्ज करें

अपडेट- लगातार दो टेस्ट रन, एक ही वर्कलोड (चयन * fromEmptyTable), पूलिंग सक्षम / सक्षम नहीं। थोड़ा अधिक CPU उपयोग और बहुत सी विफलताएं और कभी भी 500 बैच अनुरोधों / सेकंड से ऊपर नहीं जाता है। परीक्षण 10,000 बैच / सेकंड और पूलिंग ऑन के साथ कोई विफलता नहीं दिखाते हैं, और लगभग 400 बैच / सेकंड तब पूलिंग अक्षम होने के कारण बहुत सारी विफलताएं होती हैं। मुझे आश्चर्य है कि क्या ये विफलता कनेक्शन उपलब्धता की कमी से संबंधित हैं?

यहाँ छवि विवरण दर्ज करें

@ srutzky- sysinos_exec_connections से काउंट (*) चुनें;

  • पूलिंग सक्षम: 37 लगातार, लोड टेस्ट रुकने के बाद भी

  • पूलिंग अक्षम: 11-37 यह निर्भर करता है कि SQLQueryStress पर अपवाद हो रहे हैं या नहीं,
    यानी: जब ये कुंड Batches
    / सेकंड ग्राफ पर दिखाई देते हैं , तो अपवाद SQLQueryStress पर होते हैं, और
    कनेक्शन की संख्या 11 हो जाती है, फिर धीरे-धीरे 37 तक वापस आ जाती है जब चमगादड़ चरम पर होने लगते हैं और अपवाद नहीं होते हैं। बहुत, बहुत दिलचस्प।

0 के डिफ़ॉल्ट पर सेट किए गए दोनों परीक्षण / लाइव इंस्टेंसेस पर अधिकतम कनेक्शन।

हालांकि, एप्लिकेशन लॉग की जाँच की है और कनेक्टिविटी मुद्दों को नहीं पा सकते हैं, बड़ी संख्या में त्रुटियों के कारण उपलब्ध लॉगिंग के लायक केवल कुछ मिनट हैं: अर्थात ढेर सारी ट्रेस ट्रेस त्रुटियाँ। एप्लिकेशन समर्थन पर एक सहयोगी सलाह देता है कि कनेक्टिविटी से संबंधित HTTP त्रुटियों की एक बड़ी संख्या होती है। यह इस पर आधारित होगा, कि किसी कारण से एप्लिकेशन सही ढंग से कनेक्शन को पूल नहीं कर रहा है और परिणामस्वरूप, सर्वर बार-बार कनेक्शन से बाहर चल रहा है। मैं ऐप लॉग में अधिक देखूंगा। मुझे आश्चर्य है कि यह साबित करने का एक तरीका है कि SQL सर्वर की ओर से उत्पादन में क्या हो रहा है?

@ srutzky- धन्यवाद। मैं कल वेबलॉग कॉन्फिग पर जांच करूंगा और अपडेट करूंगा। मैं केवल 37 कनेक्शनों के बारे में सोच रहा था - अगर SQL®Stress 10,000 पुनरावृत्तियों पर 12 थ्रेड्स कर रहा है = 120,000 चयन न किए गए कथनों का, तो इसका मतलब यह नहीं है कि प्रत्येक चयन sql उदाहरण के लिए एक अलग कनेक्शन बनाता है?

@ srutzky- वेबलॉग को पूल कनेक्शन से कॉन्फ़िगर किया गया है, इसलिए इसे ठीक काम करना चाहिए। कनेक्शन पूलिंग को इस तरह से कॉन्फ़िगर किया गया है, प्रत्येक 4 लोड-संतुलित वेबलिक्स पर:

  • प्रारंभिक क्षमता: 10
  • अधिकतम क्षमता: 50
  • न्यूनतम क्षमता: 5

जब मैं रिक्त तालिका क्वेरी से चयन निष्पादित करने वाले थ्रेड्स की संख्या बढ़ाता हूं, तो कनेक्शन की संख्या 47 के आसपास होती है। कनेक्शन पूलिंग अक्षम होने के साथ, मैं लगातार कम से कम अधिकतम बैच अनुरोध / सेकंड (10,000 से नीचे लगभग 400) देखता हूं। हर बार क्या होगा कि SQLQueryStress पर 'अपवाद' कुछ ही समय बाद बैचों / सेकंड एक गर्त में चले जाते हैं। यह कनेक्टिविटी से संबंधित है लेकिन मैं वास्तव में समझ नहीं पा रहा हूं कि ऐसा क्यों हो रहा है। जब कोई परीक्षण नहीं चल रहा है, तो # कनेक्शन लगभग 12 हो जाते हैं।

कनेक्शन पूलिंग अक्षम होने के साथ, मुझे यह समझने में परेशानी हो रही है कि अपवाद क्यों होते हैं, लेकिन हो सकता है कि यह एडम मैकैनिक के लिए एक पूरी तरह से अन्य स्टैक एक्सचेंज प्रश्न / प्रश्न हो?

@srutzky मुझे आश्चर्य है कि जब SQL सर्वर कनेक्शन से बाहर नहीं चल रहा है, तब भी सक्षम किए बिना अपवाद क्यों होते हैं?


1
पीटर, कनेक्शन पूलिंग के संबंध में सबसे हाल के अपडेट के साथ, ऐसा लग रहा है कि अब आपको SQLQueryStress के साथ अपने परीक्षण फिर से चलाने की आवश्यकता है, लेकिन कनेक्शन पूलिंग बंद हो गई । यह इस बात का एक अधिक सटीक प्रतिबिंब होगा कि ऐप कैसे काम कर रहा है, और मुझे विश्वास है कि यह सीपीयू उपयोग और यहां तक ​​कि रैम उपयोग में वृद्धि दिखाएगा।
सोलोमन रटज़की

1
पीटर, क्या आपके पास सर्वर के लिए अधिकतम संख्या में कनेक्शन हैं? मैं अनुमान लगा रहा हूं कि पूलिंग के बिना आप बहुत अधिक कनेक्शनों के एक मुद्दे में भाग रहे हैं। मुझे आश्चर्य है कि अगर आपके ऐप को कभी वह त्रुटि मिलती है। इसके अलावा, यदि उस अंतिम परीक्षण को फिर से चलाना संभव हो, तो एक बार (सक्षम पूलिंग के साथ और बिना दोनों), जबकि परीक्षण उन दो कॉन्फ़िगरेशनों में से प्रत्येक के लिए चल रहा है, SELECT COUNT(*) FROM sys.dm_exec_connections;यह देखने के लिए कि क्या पूलिंग सक्षम होने के बीच मान बहुत भिन्न है या नहीं नहीं। उन त्रुटियों के आधार पर, मुझे लगता है कि पूलिंग अक्षम होने पर कई और कनेक्शन होंगे।
सोलोमन रटज़की

1
पीटर, 37 कनेक्शन एक भयानक कम अधिकतम की तरह लगता है। यह देखते हुए कि कनेक्शन सीमा 0 (यानी असीमित) पर सेट है, क्या सिस्टम मेमोरी बाध्य है? इसके अलावा, कनेक्शन पूलिंग डिफ़ॉल्ट रूप से होनी चाहिए, लेकिन क्लाइंट द्वारा नियंत्रित की जाती है। क्या ऐप एक .NET ऐप है? कनेक्शन पूलिंग का उपयोग करने के लिए होने की आवश्यकता नहीं है, लेकिन इसका कारण खोजने के लिए जानने में मदद मिलेगी। और क्या आप देख सकते हैं कि कनेक्शन स्ट्रिंग का क्या उपयोग किया जा रहा है? यह निर्दिष्ट करता है Pooling=falseया Max Pool Size?
सोलोमन रटज़की

1
पीटर, 12 थ्रेड्स में से प्रत्येक 10k पुनरावृत्तियों के लिए क्रमिक रूप से प्रति क्वेरी में अपना कनेक्शन बना रहा है। तो बिना पूलिंग के, जैसे ही कोड कनेक्शन बंद होता है, कनेक्शन नष्ट हो सकता है। पूलिंग फिर से उपयोग के लिए कनेक्शन रखेगा। तो यह समझ में आता है कि पूलिंग का उपयोग करते समय कनेक्शन की संख्या लगातार थी। अधिक जानकारी के बिना 37 के बारे में निश्चित नहीं है। जब कोई परीक्षण नहीं चल रहा है तो कितने कनेक्शन हैं? उस संख्या का समर्थन करना इस बात का बेहतर संकेत देगा कि परीक्षण द्वारा कितने बनाए गए हैं।
सोलोमन रटज़की

1
कनेक्शन पूलिंग प्रति-क्लाइंट, सर्वर नहीं रखा जाता है। इसलिए WebLogics और SQLQueryStress में से प्रत्येक का अपना कनेक्शन पूल होना चाहिए (min_pool और max_pool आकार, आदि के संदर्भ में)। "कनेक्शन पूलिंग विकलांग के साथ, मैं एक निचला अधिकतम बैच अनुरोध / सेकंड देखता हूं": यह समझ में आता है क्योंकि एप्लिकेशन से प्रत्येक कनेक्शन के लिए सत्र को प्रमाणित करने और आरंभ करने में अधिक समय लगता है, आदि यही कारण है कि कनेक्शन पूलिंग मौजूद है: - )।
सोलोमन रटज़की

जवाबों:


7

मुझे संदेह होगा कि एक अनुरोध भेजने, इसकी पुष्टि करने, इसे संसाधित करने, इसे वापस करने और आवेदन द्वारा रसीद स्वीकार करने का वास्तविक यांत्रिकी खुद प्रदर्शन पर असर पड़ेगा।

हां, और कुछ अतिरिक्त कारक भी हैं, लेकिन इनमें से कोई भी डिग्री वास्तव में आपके सिस्टम को प्रभावित कर रही है, सिस्टम का विश्लेषण किए बिना कहना असंभव है।

यह कहा जा रहा है, आप पूछ रहे हैं कि क्या एक मुद्दा हो सकता है, और कुछ चीजों का उल्लेख करना है, भले ही इनमें से कुछ वर्तमान में आपकी विशेष स्थिति का कारक न हों। आप कहते हैं कि:

हमारे पास लगभग 300 खाली टेबल हैं और उनमें से कुछ टेबल प्रति मिनट 100-200 बार तक बोली जाती हैं।

  • रिक्त तालिकाएँ जिन्हें क्वेरी नहीं किया जा रहा है, कोई समस्या नहीं है। लेकिन मुझे लगता है कि आप यह भी अर्थ लगा सकते हैं कि वे सभी विचलित हो रहे हैं, बस कुछ दूसरों की तुलना में बहुत अधिक हिट हो रहे हैं।
  • यदि क्वेरी पाठ सबमिट किया जा रहा है तो कॉलिंग के दौरान क्वेरी पार्सिंग और निष्पादन योजना पीढ़ी बहुत अधिक नहीं होनी चाहिए । SQL सर्वर क्वेरी का पाठ हैश करेगा और इसे योजना कैश में देखेगा। यदि पाया जाता है, तो यह या तो पार्सिंग या संकलन चरणों को फिर से नहीं करेगा (जब तक कि योजना कैश से हटा नहीं दी जाती है)।
  • खाली या खाली नहीं रहने वाली किसी भी तालिका में संसाधन का उपयोग करने के लिए कम से कम "साझा" लॉक की आवश्यकता होगी। यह उन ऑपरेशनों को रोकता है जिनके लिए संसाधन के उपयोग के दौरान परिवर्तन करने से अनन्य ताले (कॉलम जोड़ना / बदलना / हटाना आदि) की आवश्यकता होती है। लॉकिंग और अनलॉकिंग, भले ही 1 मिलीसेकंड से कम में पूरी की गई हो क्योंकि कोई डेटा नहीं है, फिर भी उन लॉक ऑपरेशन को प्रबंधित करने के लिए सिस्टम रिसोर्स (मेमोरी और सीपीयू) की आवश्यकता होती है।
  • यहां तक ​​कि SQL सर्वर से एप्लिकेशन पर वापस आने वाले कोई परिणाम सेट नहीं होने के बावजूद, अभी भी नेटवर्क ट्रैफ़िक की समान मात्रा SQL सर्वर पर जा रही है या नहीं, क्वेरी परिणाम देती है या नहीं। संग्रहीत प्रक्रिया के प्रश्न या नाम का पाठ भेजने की आवश्यकता है। और यदि कोई परिणाम वापस नहीं आता है, तब भी SQL सर्वर को कुछ नेटवर्क पैकेट भेजने पड़ते हैं, जिसमें पैकेट सेट के अलावा परिणाम सेट संरचना होती है जो क्लाइंट को बताती है कि परिणाम सेट शुरू हो रहा है (भले ही कोई पंक्तियाँ नहीं मिली हों) और फिर परिणाम सेट है समाप्त होना चाहिए और बंद होना चाहिए। और प्रिंट स्टेटमेंट और / या पंक्ति गणना से अतिरिक्त संदेश हो सकते हैं।
  • SQL सर्वर से कनेक्ट करने के लिए सिस्टम संसाधनों की कुछ मात्रा की आवश्यकता होती है। प्रमाणीकरण को संभालने के लिए सीपीयू और मेमोरी लेता है (साथ ही नेटवर्क पैकेट आगे और पीछे) और इसके लिए समय भी लगता है। यही कारण है कि कनेक्शन पूलिंग मौजूद है: इस खर्च को कम करने के लिए।
  • कनेक्शन पूलिंग सिस्टम संसाधन उपयोग को कम करने के साथ भी, SQL सर्वर को अभी भी उन कनेक्शनों को बनाए रखने की आवश्यकता है और इसके लिए मेमोरी और कुछ न्यूनतम सीपीयू की आवश्यकता होती है।
  • यहां तक ​​कि कोई पंक्तियों के साथ और इसलिए बहुत ही त्वरित निष्पादन समय, क्वेरी अभी भी निष्पादित की गई थी। यहां तक ​​कि अगर 10 या 10,000 पंक्तियां थीं और जिन्हें बफ़र पूल (यानी मेमोरी) से खींचा गया था क्योंकि वे अक्सर उपयोग किए जाते थे, तब भी एक थ्रेड को उस काम को करने की आवश्यकता होती है। और एक धागा जो इस बेकार क्वेरी पर काम कर रहा है वह वास्तविक उपयोगी क्वेरी पर काम नहीं कर रहा है।

और भी हो सकता है, लेकिन इससे चीजों को समझने में मदद मिलनी चाहिए। और ध्यान रखें कि अधिकांश प्रदर्शन मुद्दों की तरह, यह सभी पैमाने की बात है। उपरोक्त सभी आइटम गैर-मुद्दे हैं यदि प्रति मिनट एक बार हिट किया जा रहा है। यह आपके कार्य केंद्र या विकास डेटाबेस में परिवर्तन का परीक्षण करने जैसा है: यह हमेशा तालिकाओं में केवल 10 - 100 पंक्तियों के साथ काम करता है। उस कोड को उत्पादन में ले जाएं और इसे चलाने में 10 मिनट लगते हैं, और कोई व्यक्ति यह कहने के लिए बाध्य होता है: "ठीक है, यह मेरे बॉक्स पर काम करता है" ;-) मतलब, यह केवल कॉल की भारी मात्रा के कारण है कि आप एक मुद्दा देख रहे हैं, लेकिन यह स्थिति है कि मौजूद है।

इसलिए, यहां तक ​​कि 1 मिलियन बेकार, 0 पंक्ति प्रश्नों पर, जो कि राशि:

  • अतिरिक्त 2 मिलियन लॉक ऑपरेशन (हर लॉक अनलॉक होना चाहिए, सही?)। यह ज्यादातर समय एक बेकार ऑपरेशन पर खर्च करने के बजाय एक उपयोगी ऑपरेशन पर खर्च होता है।
  • अधिक नेटवर्क यातायात कि हो सकता है आप संतृप्ति के करीब हो रही (यकीन नहीं कैसे की संभावना यह है, लेकिन अभी भी)
  • अधिक कनेक्शन बनाए रखे जा रहे हैं जो अधिक मेमोरी लेते हैं। आपके पास कितना अप्रयुक्त भौतिक रैम है? उस मेमोरी का उपयोग क्वेरी और / या क्वेरी प्लान कैश चलाने के लिए बेहतर होगा। सबसे खराब स्थिति यह होगी कि आप भौतिक मेमोरी से बाहर हैं और SQL सर्वर को वर्चुअल मेमोरी (स्वैप) का उपयोग करना शुरू करना होगा, क्योंकि यह चीजों को धीमा कर देता है (यह देखने के लिए कि क्या आपको मेमोरी के पृष्ठांकित होने के संदेश मिल रहे हैं, यह देखने के लिए अपने SQL सर्वर त्रुटि लॉग की जांच करें)।

    और अगर किसी का उल्लेख है, "ठीक है, वहाँ कनेक्शन पूलिंग है"। हां, यह निश्चित रूप से आवश्यक कनेक्शन की संख्या को कम करने में मदद करता है। लेकिन प्रति मिनट 200 से अधिक बार आने वाले प्रश्नों के साथ, यह समवर्ती गतिविधि है और वैध अनुरोधों के लिए कनेक्शन अभी भी मौजूद हैं। एक है SELECT * FROM sys.dm_exec_connections;यह देखने के लिए कि आप कितने सक्रिय कनेक्शन को बनाए रखने रहे हैं।

  • किसी और चीज की परवाह किए बिना, यह अभी भी प्रत्येक दिन के दौरान कम से कम 1 मिलियन बार है कि एक धागा जो कुछ उपयोगी कर सकता था, वह अनुपलब्ध था।

अगर मैं यहां जो कह रहा हूं, उसके बारे में गलत नहीं हूं, तो मुझे ऐसा लगता है, भले ही छोटे पैमाने पर, यह आपके सिस्टम पर एक प्रकार का DDoS हमला है क्योंकि यह नेटवर्क और आपके SQL सर्वर पर फर्जी अनुरोधों के साथ भर रहा है वास्तविक अनुरोधों को SQL सर्वर से प्राप्त करने से रोकना या SQL सर्वर द्वारा संसाधित किया जाना।


1

यदि टेबल एक मिनट में 100-200 बार हिट हो रही हैं, तो वे (उम्मीद है) स्मृति में हैं। सर्वर पर लोड बहुत कम है। जब तक आपके पास डेटाबेस सर्वर पर उच्च CPU या मेमोरी नहीं है, यह संभवतः एक गैर-मुद्दा है।

हां, क्वेरीज़ साझा लॉक लेती हैं, लेकिन उम्मीद है कि किसी भी अपडेट लॉक को ब्लॉक नहीं कर रही हैं और न ही किसी अपडेट लॉक द्वारा ब्लॉक किया जा रहा है। क्या आपके पास इन टेबल पर कोई अपडेट, इंसर्ट या डिलीट है। यदि नहीं, तो मैं इसे जाने नहीं दूंगा - यदि आपके पास प्रदर्शन के मुद्दे हैं, तो डेटाबेस सर्वर के दृष्टिकोण से तलना करने के लिए बड़ी मछली हो गई है।

मैंने एक खाली मेज पर 100,000 चुनिंदा गिनती (*) पर एक परीक्षण चलाया और यह 32 सेकंड में चला गया और प्रश्न एक नेटवर्क पर थे। तो 1/3 मिलीसेकंड। जब तक आपका नेटवर्क ओवरलोडेड नहीं हो रहा है तब तक यह क्लाइंट को प्रभावित नहीं कर रहा है। यदि आप इन 1/3 मिलीसेकंड खाली प्रश्नों के प्रमुख प्रदर्शन कर रहे हैं, तो यह नहीं है कि ऐप क्या मार रहा है।

और ये कुछ स्थैतिक प्रकार के डेटा को हथियाने वाले लेफ्ट जॉइन का हिस्सा हो सकते हैं, जो वर्तमान एप्लिकेशन का हिस्सा नहीं है। यह अन्य प्रश्नों के साथ जंजीर हो सकता है, इसलिए यह एक अतिरिक्त दौर की यात्रा नहीं है। यदि हां तो यह टेढ़ा है, लेकिन यह अधिक यातायात का कारण भी नहीं है।

इसलिए वास्तविक कथनों को देखें। क्या आप इन टेबल पर कोई अपडेट, ऐड या डिलीट देख रहे हैं?

हां कई खाली टेबल और खाली टेबल के लिए प्रश्न मैला कोडिंग के संकेत हैं। लेकिन अगर आपके पास प्रमुख प्रदर्शन के मुद्दे हैं, तो इसका कारण यह नहीं है जब तक कि आपके पास इन तालिकाओं के साथ कुछ वास्तव में सुस्त लेखन संचालन न हो।


जब आप अपने 100k प्रश्नों का परीक्षण करते हैं, तो कितने अन्य उपयोगकर्ता SQL सर्वर चल रहे प्रश्नों पर थे? मैं यह नहीं कह रहा हूं कि मैं सही हूं और आप गलत हैं, लेकिन अगर आप सिस्टम पर केवल एक थे, या बस कुछ में से एक थे, तो स्वाभाविक रूप से आपको बहुत अधिक प्रभाव नहीं दिखेगा। लॉकिंग का मुद्दा अवरुद्ध होने का मामला नहीं था, यह केवल उन संसाधनों का मामला था जिनके लिए SQL सर्वर की आवश्यकता होती है और उन डेटा पृष्ठों को लॉक और अनलॉक करने के लिए, भले ही वे हमेशा बफ़र पूल में हों। यह अभी भी काम किया जा रहा है। और अनुसूचक असीमित नहीं हैं।
सोलोमन रटज़की

और मैं यह नहीं कह रहा हूं कि आप गलत हैं। अन्य उपयोगकर्ता या नहीं यह अभी भी एक वैध उपाय है कि इसे कितने समय तक और संसाधनों का एक उपाय बताया गया है कि लोड 100-200 प्रति मिनट है। 30 सेकंड में एक ग्राहक से 100,000, 200 से 400 के एक कारक द्वारा उस भार से अधिक हो जाता है। यदि कोई अद्यतन ताले नहीं हैं, तो यदि यह एक ग्राहक से आया है या 100 से कोई फर्क नहीं पड़ता है। आपका उत्तर मानता है कि कोई अतिभारित नेटवर्क या SQL सर्वर है और उस प्रश्न के आधार पर जिसे आप नहीं जानते हैं। अगर यह DDoS हमला होता तो 100 / सेकंड (मिनट नहीं) की तरह होता और यह एक खाली मेज के खिलाफ नहीं होता।
पापाराज़ो

सही है, इस सवाल के आधार पर हम इसे संकीर्ण करने के लिए पर्याप्त नहीं जानते हैं, यही कारण है कि मैं कह रहा था कि ये चीजें परिस्थितियों के आधार पर एक मुद्दा हो सकती हैं। और DDoS की बात सिर्फ एक सादृश्य थी, मुख्य रूप से मूल प्रश्न के शब्दांकन पर आधारित थी जो यह निहित था कि उस दर पर कई हिट हो रहे थे और कई अन्य लोगों के रूप में अच्छी तरह से हिट हो रहे थे, बस कम बार।
सोलोमन रुट्ज़की

मैं इसे इस अर्थ में एक मूल्यवान उत्तर मानता हूं कि पहला पैराग्राफ इसे बहुत अच्छी तरह से बताता है: "जब तक आपके पास डेटाबेस सर्वर पर उच्च सीपीयू या मेमोरी नहीं होती है, यह संभवतः एक गैर-मुद्दा है।" हमारे मामले में, हमारे पास दिन के निश्चित समय में उच्च सीपीयू का उपयोग होता है और इसलिए अतिरिक्त सीपीयू दबाव मेरे परीक्षण के आधार पर एक कारक लगता है।
पीटर

विशेष रूप से मैंने केवल 100-200 बार / मिनट निष्पादित करने वाले प्रश्नों को उद्धृत किया, जब वास्तविक तथ्य में 200-4000 / मिनट के बीच निष्पादन की गणना के साथ इन खाली तालिकाओं के लगभग 50 प्रश्न हैं। संचयी रूप से, इस आवृत्ति के साथ खाली तालिकाओं को क्वेरी करने का प्रभाव सीपीयू को काफी प्रभावित करता है, यहां तक ​​कि बार-बार निष्पादित होने वाले गैर-पैरामीटर वाले प्रश्नों के सर्वोत्तम मामले में भी, इसलिए योजना, डेटा आदि सभी स्मृति में हैं।
पीटर

0

प्रत्येक प्रश्न पर सामान्य रूप से निम्नलिखित कदम उठाए जाते हैं:

  1. आवेदन से अनुरोध।
  2. डेटाबेस क्वेरी क्वेरी करें।
  3. डेटाबेस इंजन की जाँच करें कि क्या यह क्वेरी पहले से ही RAM में संग्रहीत है। मेमोरी में मौजूद निष्पादन योजना का उपयोग करें।
  4. यदि RAM में विद्यमान नहीं है, तो डेटाबेस इंजन क्वेरी में मौजूद वस्तुओं पर मौजूदा आँकड़ों की जाँच करता है और निष्पादन योजना निर्धारित करता है।
  5. निष्पादन योजना चलाएं, डिस्क से डेटा प्राप्त करने के लिए i / o का उपयोग करें।
  6. आवेदन पर प्रतिक्रिया।

आपके द्वारा उल्लिखित कई प्रश्न सिस्टम पर अतिरिक्त लोड का कारण हो सकते हैं जो पहले से ही भारी है - कनेक्शन, सीपीयू, रैम और आई / ओ पर अतिरिक्त भार।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.