SQL सर्वर पर उच्च CPU उपयोग - धीमी क्वेरी [बंद]


11

हमारा MS SQL Server लगभग 95% CPU-पॉवर का उपयोग कर रहा है।

सर्वर (हार्डवेयर) पुनरारंभ, या SQL- सेवा पुनरारंभ के बाद, उपयोग 0% है और धीरे-धीरे 1-3 दिनों के दौरान बढ़ जाता है। यह कितना उपयोग किया जाता है पर निर्भर करता है।

जब यह 80% से अधिक है, तो प्रत्येक क्वेरी बेहद धीमी है।

हमारी वेबसाइट बड़े प्रश्नों का सामना कर रही है, इसलिए उनमें से कुछ को 45-60 सेकंड लगते हैं। पुनरारंभ (80% से कम CPU उपयोग) के बाद, उसी क्वेरी के लिए 11-20 सेकंड लगते हैं।


मैं इसे कैसे ठीक करूं? मैंने ऑनलाइन पढ़ा है कि एफिनिटी मास्क CPU उपयोग को समायोजित कर सकते हैं, लेकिन एफिनिटी सेटिंग्स अक्षम हैं। मैं उन्हें बदल नहीं सकता। क्या यह इसलिए है क्योंकि मेरे पास केवल 1 प्रोसेसर है?

प्रश्नों को करने के लिए बहुत सारी तरकीबें हैं, लेकिन हमारी वेबसाइटें और सेवाएं काफी बड़ी हैं, और बदलने के लिए बस बहुत कुछ है।

उनमें से ज्यादातर पहले से ही बहुत अच्छी तरह से अनुकूलित हैं।


मैं SQL-Service को पुनरारंभ नहीं कर सकता, भले ही इसमें केवल 2 सेकंड लगते हों, क्योंकि हमारे पास एक अलार्म सेवा है जो लोगों को कॉल करने और एक संदेश रिकॉर्ड करने की अनुमति देती है, फिर एक चयनित समूह को कॉल किया जाएगा और रिकॉर्ड किए गए संदेश को सुनेंगे।

इस प्रणाली का उपयोग सैकड़ों खोज और बचाव टीमों द्वारा किया जाता है, और यदि SQL-Service अलार्म के दौरान पुनरारंभ होता है, तो यह समाप्त हो जाएगा और इसे कॉल करने वाले व्यक्ति को सूचित नहीं किया जाएगा।


मैंने सभी जगह खोज की है, लेकिन "एफिनिटी मास्क" के बारे में सामान के अलावा कुछ नहीं मिला, जिसे मैं बदल नहीं सकता।

वर्तमान प्रश्नों को समाप्त किए बिना, CPU कैश को खाली करने का एक तरीका होना चाहिए ... सही?


SQL: Microsoft SQL Server 11.0.2100.60
OS: Windows Server 2012 x64
Processor: 2.30 GHz
RAM: 4.00 GB

टिप्पणियाँ विस्तारित चर्चा के लिए नहीं हैं; इस वार्तालाप को बातचीत में स्थानांतरित कर दिया गया है ।
पॉल व्हाइट 9

जवाबों:


7

यह एक लंबा शॉट है, लेकिन आप अपनी मजबूर पैराट्रिजेशन सेटिंग पर एक नज़र डालना चाहते हैं। यदि आप प्रदर्शन के खराब होने पर बड़ी संख्या में क्वेरी प्लान देख रहे हैं, तो आपके प्रश्नों को आपके द्वारा अपेक्षित तरीके से कैश नहीं किया जा रहा है और कैश के माध्यम से स्कैन करने में लंबा समय लग रहा है, यह देखने के लिए कि क्या पहले से ही उपयोग करने की योजना है। यदि कैश साफ़ करना इस समस्या को हल करता है, तो आप मजबूर पैरामीटराइज़ेशन सेटिंग को बदलना चाह सकते हैं। आप कैश का उपयोग करके साफ़ कर सकते हैं:

DBCC FREEPROCCACHE

आप यह देखने के लिए जांच कर सकते हैं कि क्या कैद क्लीयर करने के लिए मजबूर पैरामीरिजेशन सेटिंग है:

SELECT name
     , is_parameterization_forced
  FROM sys.databases;

यह संभवतः 0 पर सेट है, डिफ़ॉल्ट। यदि वे चाहें, तो आप ऐसा करके इसे सच कर सकते हैं:

ALTER DATABASE [database_name] SET PARAMETERIZATION FORCED;

इसे पहले देव माहौल में किया जाना चाहिए और देखना चाहिए कि यह अन्य तरीकों से डेटाबेस को नकारात्मक रूप से प्रभावित करता है या नहीं। इसका उपयोग करके वापस किया जा सकता है:

ALTER DATABASE [database_name] SET PARAMETERIZATION SIMPLE;

5
ध्यान दें कि प्रक्रिया कैश को मुक्त करने से वास्तव में सीपीयू में भारी वृद्धि हो सकती है - क्योंकि सभी प्रश्नों को अब अपनी निष्पादन योजनाओं को फिर से स्थापित करना होगा।
हारून बर्ट्रेंड

18

आत्मीयता "सीपीयू उपयोग को समायोजित नहीं करता है" (जैसे आपके मामले में सीपीयू कम काम करते हैं), यह आपको या तो सीपीयू को बंद करने की अनुमति देता है (शायद इसे उसी मशीन पर किसी अन्य उदाहरण के लिए उपलब्ध कराने के लिए) या सीपीयू सेट करने के लिए केवल I / O के साथ सहायता। यहां तक ​​कि अगर आपके पास कई सीपीयू थे, तो आप अपने लक्ष्य के साथ मदद करने के लिए पूर्व का उपयोग नहीं कर पाएंगे, और हमारे लिए उत्तरार्द्ध पर अनुमान लगाना असंभव है क्योंकि हम नहीं जानते कि आपके सीपीयू उपयोग को इतना अधिक क्या है। यह बेहद खराब अनुक्रमण, अत्यधिक संकलनों, स्केलर यूडीएफ की प्रचुरता, आई / ओ थ्रैशिंग के कारण हो सकता है, कौन जानता है? (और I / O का कारण यह हो सकता है कि यदि आपका डेटाबेस 3 GB या तो बड़ा है, तो उसे लगातार बफर पूल मेमोरी में और बाहर डेटा स्वैप करना होगा, और यह CPU पर अपना टोल लेता है।)

सीपीयू कैश, भी, एक खरगोश छेद है जिसे आपको नीचे जाने की आवश्यकता नहीं है। मुझे अत्यधिक संदेह है कि आपके सीपीयू कैश की समस्याओं के कारण आपका सीपीयू 95% पर जोर मार रहा है।

सीपीयू दबाव के स्रोत को कम करने में मदद करने के लिए, और यह मानकर कि आप संग्रहीत प्रक्रियाओं का उपयोग कर रहे हैं, आप ग्लेन बेरी से इस नैदानिक ​​क्वेरी पर नज़र डाल सकते हैं ( यहाँ से खट्टा ) - सुनिश्चित करें कि आप इसे सही डेटाबेस के संदर्भ में चलाते हैं:

-- Top Cached SPs By Total Worker time (SQL Server 2012). 
-- Worker time relates to CPU cost  (Query 44) (SP Worker Time)

SELECT TOP (25) 
  p.name AS [SP Name], 
  qs.total_worker_time AS [TotalWorkerTime], 
  qs.total_worker_time/qs.execution_count AS [AvgWorkerTime], 
  qs.execution_count, 
  ISNULL(qs.execution_count/DATEDIFF(Second, qs.cached_time, GETDATE()), 0) 
    AS [Calls/Second],
  qs.total_elapsed_time, 
  qs.total_elapsed_time/qs.execution_count AS [avg_elapsed_time], 
  qs.cached_time
FROM sys.procedures AS p WITH (NOLOCK)
INNER JOIN sys.dm_exec_procedure_stats AS qs WITH (NOLOCK)
ON p.[object_id] = qs.[object_id]
WHERE qs.database_id = DB_ID()
ORDER BY qs.total_worker_time DESC OPTION (RECOMPILE);

-- This helps you find the most expensive cached stored procedures from a CPU perspective
-- You should look at this if you see signs of CPU pressure

यदि आप संग्रहीत प्रक्रियाओं का उपयोग नहीं कर रहे हैं, तो जॉन सैमसन का यह उदाहरण तदर्थ प्रश्नों को अलग करने में मदद कर सकता है ( यहाँ से प्राप्त ):

SELECT TOP (25)
    qs.sql_handle,
    qs.execution_count,
    qs.total_worker_time AS Total_CPU,
    total_CPU_inSeconds = --Converted from microseconds
    qs.total_worker_time/1000000,
    average_CPU_inSeconds = --Converted from microseconds
    (qs.total_worker_time/1000000) / qs.execution_count,
    qs.total_elapsed_time,
    total_elapsed_time_inSeconds = --Converted from microseconds
    qs.total_elapsed_time/1000000,
    st.text,
    qp.query_plan
FROM sys.dm_exec_query_stats AS qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS st
CROSS apply sys.dm_exec_query_plan (qs.plan_handle) AS qp
ORDER BY qs.total_worker_time DESC OPTION (RECOMPILE);

आप एडम मचानिक के sp_WhoIsActive पर भी एक नज़र रख सकते हैं , एक संग्रहीत प्रक्रिया जो वर्तमान में चल रहे सभी प्रश्नों का विश्लेषण कर सकती है, और आपको इसे अपनी इच्छानुसार सॉर्ट करने की अनुमति देती है (जैसे आपके मामले में @sort_order = '[CPU] DESC')।

पहली बात मैं, हालांकि - विशेष रूप से अगर यह वास्तव में खोज और बचाव टीमों के लिए मिशन महत्वपूर्ण है - बेहतर हार्डवेयर खरीद रहा है। अपने एप्लिकेशन को सेवा देने के लिए आपके पास अधिक CPU और अधिक RAM होना चाहिए। आपको भी बेहतर उच्च उपलब्धता (जैसे क्लस्टरिंग, मिररिंग या उपलब्धता समूह) की आवश्यकता है। कोई कारण नहीं है कि एक भौतिक मशीन का रिबूट आपके आवेदन को पूरी तरह से ऑफ़लाइन होना चाहिए - हमारे पास उस समस्या के लिए बेहतर समाधान हैं। और अंत में, मैं यह मानता हूं कि "सर्वर" में केवल एक स्पिन डिस्क ड्राइव है। इसका मतलब है कि सभी I / O - OS से, SQL सर्वर डेटा फ़ाइलों से, लॉग फाइल, टेम्पर्डब, आदि सभी एक ही नियंत्रक से गुजरते हैं और एक ही ड्राइव पर पढ़ने / लिखने की गतिविधि साझा करते हैं। अधिक डिस्क प्राप्त करें। SSDs प्राप्त करें यदि आप कर सकते हैं / जहां। RAID का उपयोग करें और I / O को यथासंभव फैलाने का प्रयास करें।

सभी ने कहा, समस्या पर हार्डवेयर फेंकना केवल फिक्स का हिस्सा नहीं है। आपको अत्यधिक सीपीयू उपयोग के कारण वास्तव में अलग करने की आवश्यकता है और फिर उन समस्याओं पर हमला करें जो कोई भी बात नहीं है कि आप किस हार्डवेयर पर हैं।

कुछ अन्य विचारों के लिए भी इस StackOverflow प्रश्न को देखें:

/programming/945063/how-do-i-find-out-what-is-hammering-my-sql-server


0

निम्नलिखित सुझाव एक 'अंधेरे में गोली मार' हैं क्योंकि मैं वास्तविक कोड नहीं देख सकता।

पहला यह है कि एक एसपी शाप देने वाले और उन्हें खुला छोड़ने वाले हो सकते हैं। खासतौर पर क्लोजर और डीललॉकेट पर पढ़ें। कोई बंद हो सकता है, लेकिन श्राप देने वालों से नहीं। अपग्रेड के कारण व्यवहार में बदलाव आया हो सकता है, 2012 2008 R2 से बचे हुए कर्सर का इलाज कर सकता है।

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

क्या आप किसी भी तरह से WinLink का उपयोग कर रहे हैं? इस बारे में कुछ अस्पष्ट सा लगता है।


-4

आपके पास प्रदर्शन को बेहतर बनाने के लिए मेमेकैच्ड की तरह कैशिंग मैकेनिज्म होना चाहिए


लेकिन यह SQL- सर्वर पर सीपीयू-उपयोग को नहीं बदलेगा, है ना? यह सिर्फ वेबसाइट पर प्रश्नों को तेजी से आगे बढ़ाएगा, और समस्याएँ हो सकती हैं किसी दिन तालिका में किसी और का उपयोग किया जा रहा है, जबकि किसी अन्य तालिका में मेमिथैड परिणाम का उपयोग करके समस्याओं को बदल दिया जाता है?
लेवी जोहानसन

@ लेवी यदि आप क्वेरी को कैश करते हैं तो मध्य स्तरीय में कहीं परिणाम निकलता है तो प्रश्न डेटाबेस से नहीं टकराते हैं (जब आपको कैश को रीफ्रेश करने की आवश्यकता होती है) को छोड़कर।
हारून बर्ट्रेंड

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