SQL सर्वर कैश फ़्लश और डिस्क I / O


11

हम .NET 4.0 में विकसित ओएलटीपी सिस्टम को लोड करने में व्यस्त हैं और पीठ में SQL सर्वर 2008 R2 चलाते हैं। सिस्टम SQL सर्वर सेवा ब्रोकर कतारों का उपयोग करता है, जो बहुत प्रदर्शन कर रहे हैं, लेकिन हम प्रसंस्करण के दौरान अजीबोगरीब प्रवृत्ति का सामना कर रहे हैं।

SQL सर्वर प्रक्रिया 1 मिनट के लिए ब्लिस्टरिंग दर पर अनुरोध करती है, जिसके बाद डिस्क लेखन गतिविधि में ~ 20 सेकंड की वृद्धि हुई है। निम्नलिखित ग्राफ समस्या का चित्रण करता है।

SQL OLTP सिस्टम - प्रदर्शन काउंटर

Yellow = Transactions per second
Blue   = Total CPU usage
Red    = Sqlsrv Disk Write Bytes/s
Green  = Sqlsrv Disk Read Bytes/s

समस्या निवारण के दौरान, हमने पैटर्न में कोई महत्वपूर्ण बदलाव किए बिना निम्नलिखित की कोशिश की:

  • बंद SQL सर्वर एजेंट।
  • लगभग हर दूसरे चलने की प्रक्रिया को मार डाला (नो ए / वी, एसएसएमएस, वीएस, विंडोज एक्सप्लोरर, आदि)
  • अन्य सभी डेटाबेस को हटा दिया गया।
  • सभी वार्तालाप टाइमर अक्षम करें (हम किसी भी ट्रिगर का उपयोग नहीं करते हैं)।
  • एक सरल / क्रूड टेबल मॉनिटरिंग डिज़ाइन के लिए संदेश कतार संचालित दृष्टिकोण से दूर चला गया।
  • हल्के से भारी तक विभिन्न भार का उपयोग किया।
  • सभी गतिरोधों को ठीक किया।

ऐसा लगता है जैसे कि SQL सर्वर अपने कैश का निर्माण कर रहा है और इसे विशिष्ट समय-आधारित अंतराल पर डिस्क पर लिख रहा है, लेकिन मुझे इस सिद्धांत का समर्थन करने के लिए ऑनलाइन कुछ भी नहीं मिल रहा है।

अगला, मैं इस समस्या को दोहराने के लिए यह देखने के लिए हमारे समर्पित परीक्षण वातावरण पर समाधान को स्थानांतरित करने की योजना बना रहा हूं। अंतरिम में किसी भी मदद की बहुत सराहना की जाएगी।

अपडेट 1 , अनुरोध के अनुसार, एक ग्राफ जिसमें चेकपॉइंट पृष्ठ / सेक , पृष्ठ जीवन प्रत्याशा और कुछ डिस्क विलंबता काउंटर शामिल हैं।

SQL OLTP सिस्टम - प्रदर्शन काउंटर - चेकपॉइंट

ऐसा प्रतीत होता है जैसे चेकपॉइंट (हल्की नीली रेखा) कम प्रदर्शन (पीली लाइन) का कारण है जिसे हम देख रहे हैं। ^

डिस्क विलंबता प्रसंस्करण के दौरान अपेक्षाकृत सुसंगत रहती है और पृष्ठ जीवन प्रत्याशा पर कोई ध्यान देने योग्य प्रभाव नहीं पड़ता है। हमने SQL सर्वर के लिए उपलब्ध RAM की मात्रा को भी समायोजित किया, जिसका बड़ा प्रभाव नहीं पड़ा। से वसूली मॉडल बदलने SIMPLEके लिए FULLभी किया जाता कम अंतर।

अपडेट 2 "रिकवरी इंटरवल" को निम्नानुसार बदलकर, हमने उन अंतरालों को कम करने में कामयाबी हासिल की है जिन पर चौकियों का निर्माण होता है:

EXEC sp_configure 'show advanced options',1
GO 

RECONFIGURE
GO

EXEC sp_configure 'recovery interval', '30'
GO

RECONFIGURE 
GO

EXEC sp_configure 'show advanced options',0
GO
RECONFIGURE

मैं अनिश्चित हूं कि क्या यह बुरा अभ्यास है?


1
चेकपॉइंट पृष्ठ / सेकंड काउंटर जोड़ें। और फिर से परीक्षण करें और ग्राफ दिखाएं। और जब आपके लेन-देन नीचे जाते हैं और लिखते हैं - क्या आप प्रदर्शन के मुद्दों को देख रहे हैं? मैं कुछ डिस्क लेटेंसी काउंटर्स भी जोड़ूंगा - avg sec / read और avg sec / लिखना
माइक वॉल्श

और जब आप अगले रेखांकन पोस्ट करते हैं तो आप संख्याओं को शामिल कर सकते हैं। वह ग्राफ़ कोई पैमाना नहीं दिखाता है।
माइक वॉल्श

5
और एक आखिरी बात (क्षमा करें!) - इस सर्वर पर मेमोरी क्या है? क्या आप पेज जीवन प्रत्याशा काउंटर को भी जोड़ सकते हैं? क्या आप भौतिक सेटअप (मेमोरी, आईओ सेटअप) का वर्णन कर सकते हैं, क्या आपने अपनी लॉग और डेटा फ़ाइलों को विभाजित किया है, आदि
माइक वॉल्श

2
किस रिकवरी मॉडल में डेटाबेस है? यह स्वचालित चेकपॉइंटिंग की तरह दिखता है क्योंकि लेन-देन लॉग भरता है। ध्यान दें कि डेटाबेस में है FULLया नहीं BULK_LOGGED, यह तब भी व्यवहार करता है SIMPLEजब तक कि आप पूर्ण बैकअप नहीं लेते।
जॉन सेइगेल

2
जॉन - चेकपॉइंटिंग अभी भी रिकवरी मॉडल की परवाह किए बिना होगा। सरलीकृत: एकमात्र अंतर यह है कि रिकवरी मॉडल में एक चेकपॉइंट के बाद लॉग में डेटा का क्या होता है .. पूर्ण में यह लॉग में रहता है और बैकअप की आवश्यकता होती है। सरल में इसे छोटा किया जा सकता है (या छंटनी के लिए चिह्नित किया गया है .. पुन: उपयोग) लेकिन चेकपॉइंट अभी भी होना है।
माइक वॉल्श

जवाबों:


11

अन्य लोगों ने पहले ही अपराधी को इंगित किया है: SQL सर्वर मेमोरी (बफर पूल में) में अपडेट जमा करता है और केवल समय-समय पर उन्हें (चौकियों पर) निकाल देता है। सुझाए गए दो विकल्प (-k और चेकपॉइंट अंतराल) पूरक हैं:

लेकिन मैंने केवल आपके द्वारा अभी तक प्राप्त की गई ठीक-ठाक टिप्पणियों को पुनः प्राप्त करने के लिए प्रतिक्रिया नहीं दी :)

आप जो देख रहे हैं, दुर्भाग्य से, कतारबद्ध प्रसंस्करण का एक बहुत विशिष्ट व्यवहार है । चाहे आप सेवा ब्रोकर कतारों का उपयोग करते हैं या कतारों के दृष्टिकोण के रूप में तालिकाओं का उपयोग करने का विकल्प चुनते हैं , इस तरह के व्यवहार से प्रणाली बहुत प्रभावित होती है। ऐसा इसलिए है क्योंकि कतार आधारित प्रसंस्करण भारी लिखा जाता है, यहां तक ​​कि OLTP प्रसंस्करण की तुलना में अधिक भारी लिखा जाता है। एन्क्यू और डेक्यू प्राइमेटिव दोनों ही ऑपरेशन लिखते हैं और लगभग कोई रीड ऑपरेशंस नहीं होते हैं। सीधे शब्दों में कहें, कतार प्रसंस्करण किसी भी अन्य कार्यभार की तुलना में सबसे अधिक लिखने (= सबसे गंदे पृष्ठ, और सबसे लॉग) उत्पन्न करेगा, यहां तक ​​कि ओएलटीपी (यानी टीपीसी-सी जैसे कार्यभार)।

बहुत महत्वपूर्ण बात यह है कि एक पंक्ति कार्यभार के लेखन एक सम्मिलित / हटाने पैटर्न का पालन करते हैं: सम्मिलित की गई प्रत्येक पंक्ति बहुत जल्दी नष्ट हो जाती है। यह एक सम्मिलित भारी (ETL) कार्यभार के केवल परिशिष्ट-पैटर्न से अंतर करना महत्वपूर्ण है। आप मूल रूप से भूत सफाई कार्य को पूरा भोजन खिला रहे हैं , और आप इसे आसानी से समाप्त कर सकते हैं। इसका मतलब क्या है के बारे में सोचो:

  • enqueue एक इंसर्ट है, यह एक गंदा पेज बनाएगा
  • dequeue एक डिलीट है, यह फिर से उसी पेज को गंदा कर देगा (यह भाग्यशाली हो सकता है और चेकपॉइंट से पहले पेज को पकड़ सकता है, इसलिए यह डबल-फ्लश से बच जाएगा, लेकिन केवल तभी भाग्यशाली होगा)
  • भूत सफाई पृष्ठ को साफ कर देगा, इसे फिर से गंदा कर देगा

हां, इसका वास्तव में मतलब है कि आप एक पेज को डिस्क पर तीन बार लिख सकते हैं, तीन अलग-अलग IO अनुरोधों में, प्रत्येक संदेश के लिए आप प्रक्रिया करते हैं (सबसे खराब स्थिति)। और इसका मतलब यह भी है कि चौकियों के यादृच्छिक IO वास्तव में यादृच्छिक होंगे क्योंकि पृष्ठ के लेखन बिंदु को दो चौकियों के बीच फिर से चल रहे प्रमुखों द्वारा दौरा किया जाएगा (कई ओएलटीपी वर्कलोड के साथ तुलना कुछ 'हॉट स्पॉट' पर लिखने के लिए करते हैं,) नहीं कतारें ...)।

तो आपके पास ये तीन राइट पॉइंट हैं, एक ही पेज को बार-बार गंदे करने के लिए रेसिंग । और इससे पहले कि हम किसी भी पृष्ठ विभाजन पर विचार करें, जो कतार प्रसंस्करण को प्रमुख कुंजी क्रम के कारण भी प्रवण हो सकता है। तुलनात्मक रूप से 'ठेठ' ओएलटीपी वर्कलोड में अधिक संतुलित रीड / राइट रेश्यो होता है और ओएलटीपी राइट्स को आवेषण / अपडेट / डिलीट में वितरित करता है, अक्सर अपडेट ('स्टेटस') में बदलाव करता है और शेर का हिस्सा लेता है। कतार प्रसंस्करण लिखते हैं, विशेष रूप से सम्मिलित करें / हटाएं, परिभाषा से, 50/50 विभाजन।

कुछ परिणाम इस प्रकार हैं:

  • चेकपॉइंट बहुत गर्म मुद्दा बन जाता है (अब आपके लिए कोई आश्चर्य की बात नहीं है)
  • आप भारी विखंडन देखेंगे (विखंडन प्रति-से ज्यादा मायने नहीं रखेगा क्योंकि आप रेंज स्कैन नहीं कर रहे हैं, लेकिन आपकी आईओ दक्षता ग्रस्त है और घोस्ट क्लीनअप में काम करना अधिक है, इसे और भी धीमा करना)
  • आपका एमडीएफ स्टोरेज रैंडम आईओ थ्रूपुट आपकी अड़चन बनने वाला है

मेरी सिफारिश 3 अक्षरों में आती है: एस, एस और डी। अपने एमडीएफ को एक भंडारण में स्थानांतरित करें जो तेजी से यादृच्छिक आईओ को संभाल सकता है। एसएसडी। अगर आपके पास पैसा है तो फ्यूजन-आईओ । दुर्भाग्य से यह उन लक्षणों में से एक है जिन्हें अधिक सस्ते रैम के साथ हल नहीं किया जा सकता है ...

संपादित करें:

जैसा कि मार्क बताते हैं कि आपके पास एक भौतिक डिस्क द्वारा समर्थित दो तार्किक डिस्क हैं। शायद आपने डी: पर सर्वोत्तम प्रथाओं और विभाजन लॉग का पालन करने की कोशिश की और सी पर डेटा: लेकिन अफसोस कोई फायदा नहीं हुआ, सी और डी एक ही डिस्क हैं। चौकियों के बीच आप अनुक्रमिक थ्रूपुट प्राप्त करते हैं लेकिन जैसे ही चेकपॉइंट शुरू होता है डिस्क हेड्स हिलना शुरू हो जाते हैं और आपका लॉग थ्रूपुट ध्वस्त हो जाता है, संपूर्ण ऐप थ्रूपुट को नीचे ले जाता है। सुनिश्चित करें कि आप DB लॉग को अलग करते हैं ताकि डेटा IO (अलग डिस्क) से प्रभावित न हो।


2
btw यह जानना दिलचस्प होगा कि चेकपॉइंट संचालित IO अनुप्रयोग काउंटरों पर इस तरह के एक नाटकीय प्रभाव का कारण बनता है। आदर्श रूप से आवेदन को आगे बढ़ना चाहिए, जबकि चौकी अपना काम करती है। बेशक, मुझे लगता है कि आप कोई साझा LDF और MDF भंडारण पहुंच पथ (यदि आप करते हैं, तो आप इसके लायक हैं ...)। शायद आपके पास आवेदन में कुछ अनावश्यक विवाद बिंदु हैं।
रेमुस रानानु

बहुत अच्छी तरह से किया जवाब रेमस।
मार्क स्टोरी-स्मिथ

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

@ MarkStorey-Smith: मुझे लगता है कि आप सही हैं, ओपी के पास एक ही भौतिक डिस्क द्वारा समर्थित C:और D:तार्किक डिस्क हैं। मुझे संदेह है कि भौतिक डिस्क 100 छोटी धारीदार स्पिंडल की बैटरी है, इसलिए शायद यही मूल कारण है।
रेमस रूसु

हां, यह परीक्षण मेरे स्थानीय देव मशीन पर किया गया था, जिसमें केवल एक ही ड्राइव है। सभी को मदद के लिए धन्यवाद।
एंड्रे हाउटफ्लेकिन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.