अधिक सीपीयू और रैम आवंटित करने के बाद धीमी SQL सर्वर प्रदर्शन


33

हमारे पास SQL ​​Server 2008 R2 (10.50.1600) वर्चुअल Windows 2008 R2 सर्वर पर चल रहा है। सीपीयू को 1 कोर से 4 में अपग्रेड करने और 4 जीबी से 10 जीबी तक रैम के बाद, हमने देखा है कि प्रदर्शन बदतर है।

कुछ अवलोकन जो मैं देख रहा हूँ:

  1. एक क्वेरी जिसे चलाने में <5 सेकंड का समय लगता है, अब> 200 सेकंड लग रहे हैं।
  2. सीपीयू अपराधी के रूप में sqlservr.exe के साथ 100 पर आंकी गई है।
  3. 4.6 मिलियन पंक्तियों वाली मेज पर एक चुनिंदा गिनती (*) 90 सेकंड से अधिक थी।
  4. सर्वर पर चल रही प्रक्रियाएँ परिवर्तित नहीं हुई हैं। एकमात्र बदलाव सीपीयू और रैम को बढ़ाना था।
  5. अन्य sql सर्वरों में एक स्थिर पेजिंग फ़ाइल होती है, जहाँ यह सर्वर इसे स्वयं प्रबंधित करने के लिए सेट किया जाता है।

किसी को इस मुद्दे में पहले चला है?

प्रति sp_BlitzErik, मैं भागा

EXEC dbo.sp_BlitzFirst @SinceStartup = 1;

मुझे ये परिणाम देना

प्रतीक्षा आँकड़े


9
पिछली बार मैंने एसई पर एक समान प्रश्न देखा था, यह इसलिए था क्योंकि किसी ने वीएम सीपीयू और रैम को बदल दिया था, लेकिन वीएम होस्ट में वास्तव में कई सीपीयू और इतनी रैम नहीं थी । तो मैं पहले जाँच करूँगा।
user253751

जवाबों:


55

यहाँ बहुत कुछ चल रहा है, और इसमें से अधिकांश बहुत व्यापक और अस्पष्ट है।

  1. 2008R2 RTM 21 अप्रैल, 2010 को सामने आया। यह पूरी तरह से समर्थन से बाहर है। आप नवीनतम सर्विस पैक पर प्राथमिकता प्राप्त करना चाहते हैं, जो लगभग 3 साल पहले दिन के लिए निकला था। यदि आप एक अजीब बग या कुछ मार रहे हैं तो इस तरह से आपको कवर किया जाएगा। पर प्रमुख यहाँ पर यह पता लगाने की क्या आप डाउनलोड करने की जरूरत है।

  2. चूँकि आपने vCPUs (1 से 4 तक) जोड़े हैं और किसी भी सेटिंग को नहीं बदला है, अब आपके प्रश्न समानांतर जा सकते हैं। मुझे पता है कि यह लगता है कि वे सब तेज़ हो जाएंगे, लेकिन रुको!

  3. आपने RAM को जोड़ा हो सकता है, लेकिन आपने Max Server Memory को नहीं बदला होगा, ताकि आपका सर्वर इसका लाभ उठा सके।

  4. पता लगाएँ कि आपका सर्वर किस पर इंतज़ार कर रहा है। मैं जिस ओपन सोर्स प्रोजेक्ट पर काम करता हूं, वह आपके एसक्यूएल सर्वर को मापने में मदद करने के लिए मुफ्त स्क्रिप्ट प्रदान करता है। पर सिर यहाँ पर अगर तुम उन्हें आजमाइए चाहता हूँ।

आप अपने सर्वर के प्रतीक्षा आँकड़े देखने के लिए sp_BlitzFirst हड़पना चाहते हैं। आप इसे कुछ तरीके से चला सकते हैं।

यह आपको दिखाएगा कि आपका सर्वर क्या शुरू होने के बाद से इंतजार कर रहा है।

EXEC dbo.sp_BlitzFirst @SinceStartup = 1;

यह आपको दिखाएगा कि 30 सेकंड की विंडो के दौरान अब कौन से प्रश्नों की प्रतीक्षा की जा रही है।

EXEC dbo.sp_BlitzFirst @Seconds = 30, @ExpertMode = 1;

एक बार जब आप यह पता लगा लेते हैं कि किस प्रश्न पर प्रतीक्षा की जा रही है (वहां प्रतीक्षा आंकड़ों के बारे में लिखा गया एक टन सामान है), तो आप नियंत्रण के साथ चीजों को प्राप्त करने के लिए बदलाव करना शुरू कर सकते हैं।

यदि आप उन्हें प्रतीक्षा करते हुए देखते हैं CXPACKET, तो इसका मतलब है कि आपके प्रश्न समानांतर चल रहे हैं, और शायद एक दूसरे पर रौंद रहे हैं। यदि आप इसे मारते हैं, तो आप शायद 50 तक के समानांतरवाद के लिए लागत थ्रेसहोल्ड पर विचार करना चाहते हैं, और शायद MAXDOP को 2 तक नीचे गिरा सकते हैं।

इस चरण के बाद जब आप क्वेरी योजनाओं पर कब्जा शुरू करने के लिए sp_WhoIsActive या sp_BlitzWho (बाद वाला पहले से GitHub रेपो में है) जैसे कुछ का उपयोग करना चाहते हैं । प्रतीक्षा आंकड़ों के अलावा, वे सबसे महत्वपूर्ण चीजों में से एक हैं जिसे आप देख सकते हैं कि क्या गलत हो रहा है।

आप SQL सर्वर के संबंध में जाँच करने के लिए VMWare काउंटरों के बारे में जोनाथन केहियास के इस लेख को भी देखना चाह सकते हैं ।

अद्यतन करें

प्रतीक्षा आँकड़े और लड़के की समीक्षा करना वे अजीब हैं। वहाँ निश्चित रूप से CPUs के साथ कुछ है। आपका सर्वर ज्यादातर ऊब के आसपास बैठा रहता है, लेकिन जब चीजें गर्म होती हैं, तो चीजें खराब हो जाती हैं। मैं इसे आसानी से तोड़ने की कोशिश करूंगा।

  1. आप एक जहर इंतजार नामक मार रहे हैं THREADPOOL। आपके पास इसका एक टन भी नहीं है, लेकिन इससे समझ में आता है क्योंकि आपका सर्वर बहुत सक्रिय नहीं है। मैं समझाता हूँ कि एक मिनट में क्यों।

  2. आप पर बहुत लंबा औसत प्रतीक्षा करता है SOS_SCHEDULER_YIELDऔर CXPACKET। आप वीएम पर हैं, इसलिए आप यह सुनिश्चित करना चाहते हैं कि एसक्यूएल सर्वर में आरक्षण है, या यह कि बॉक्स बहुत बुरी तरह से बंद नहीं है। एक शोर पड़ोसी वास्तव में यहाँ आपका दिन बर्बाद कर सकता है। आप यह भी सुनिश्चित करना चाहते हैं कि सर्वर / VM अतिथि / VM होस्ट संतुलित शक्ति मोड में नहीं चल रहे हैं। यह आपके CPU को अनावश्यक रूप से कम गति के लिए स्पिन करता है, और वे तुरंत पूरी गति तक स्पिन नहीं करते हैं।

  3. वे कैसे टाई करते हैं? 4 सीपीयू के साथ आपके पास 512 कार्यकर्ता धागे हैं। ध्यान रखें, आपके पास एक ही सीपीयू के साथ एक ही राशि थी , लेकिन अब जब आपके प्रश्न समानांतर हो सकते हैं, तो वे कई और कार्यकर्ता थ्रेड्स का उपभोग कर सकते हैं। आपके मामले में एक समानांतर क्वेरी की समानांतर शाखा प्रति 4 धागे।

क्या समानांतर चल रहा है? सबसे अधिक संभावना है सब कुछ। समानांतरवाद के लिए डिफ़ॉल्ट लागत सीमा 5 है। यह संख्या 90 के दशक के उत्तरार्ध में डिफ़ॉल्ट रूप से बनाई गई थी जो एक डेस्कटॉप पर काम कर रहा था जो इस तरह दिखता था

पागल

दी, आपका हार्डवेयर अधिकांश लैपटॉप से ​​छोटा है, लेकिन आप अभी भी उस चीज़ से थोड़ा आगे हैं।

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

तुम क्या कर सकते हो?

  1. सुनिश्चित करें कि कुछ भी बैलेंस्ड पावर मोड में नहीं है
  2. MAXDOP को 2 में बदलें
  3. समानता के लिए लागत सीमा को 50 में बदलें
  4. VM के स्वास्थ्य को मान्य करने के लिए ऊपर दिए गए जॉन के। लेख का अनुसरण करें
  5. sp_BlitzIndexकिसी भी अनुपलब्ध अनुक्रमणिका अनुरोध को देखने के लिए कॉल की गई स्क्रिप्ट का उपयोग करें ।

अधिक गहन समस्या निवारण के लिए, Google द्वारा क्लाउड में हार्डवेयर आकार देने के लिए मेरे द्वारा लिखे गए श्वेतपत्र की जांच करें ।

उम्मीद है की यह मदद करेगा!


8

हाँ! मैंने अपने सर्वर फ़ार्म में SQL सर्वर vms पर इस प्रकार की स्थिति का अनुभव किया है। Vm के होस्ट CPU तैयार समय और मेमोरी बलून ड्राइवर काउंटर को देखें। सीपीयू तैयार समय - ब्लॉग भाग मैं और VMware को समझना मेरे Sysadmin के साथ काम करना महत्वपूर्ण था, लेकिन आसान नहीं था ...


5

एक बात जो मुझे दिखाई नहीं दी, वह यह है कि वीसीपीयू को एक वीएम में जोड़ना बहुत बार शेड्यूलिंग के कारण इसे धीमा कर सकता है।

मूल विचार यह है कि यदि एक वीएम में 4 वीसीपीयू हैं, तो हाइपरविजर को 4 भौतिक कोर के उपलब्ध होने का इंतजार करना चाहिए, ताकि सभी वीसीपीयू को शेड्यूल किया जा सके, भले ही उनमें से 3 निष्क्रिय हों।

यदि आपके पास अपने मेजबान में बहुत सारे कोर नहीं हैं, और आपके अन्य कार्यभार व्यस्त हैं, तो इसके परिणामस्वरूप अतिरिक्त प्रतीक्षा हो सकती है, और प्रदर्शन में महत्वपूर्ण गिरावट आ सकती है।

VMware ESXi में आप इसे CPU रेडी के माध्यम से उन्नत ग्राफ़ में देख सकते हैं।

यहाँ ऐसा हो रहा है और यह कैसे निदान किया गया था की एक वास्तविक दुनिया उदाहरण के साथ कई लेखों में से एक है

यदि RAM का VM आवंटन NUMA नोड से बड़ा है, तो अधिक RAM जोड़ने से अचानक प्रदर्शन ड्रॉप भी हो सकता है।

इसके अतिरिक्त, आपके vCPUs (vSockets बनाम vCores) का कॉन्फ़िगरेशन वास्तव में SQL सर्वर जैसे कुछ अनुप्रयोगों को प्रभावित कर सकता है। ऐसा इसलिए है क्योंकि SQL सर्वर स्वयं NUMA है (एक ही तरह के NUMA- फैले हुए प्रदर्शन ड्रॉप से ​​बचने के लिए) और VMware वर्चुअल NUMA नोड्स को अलग तरह से प्रस्तुत कर सकता है।

यह VMware की अपनी साइट पर एक ब्लॉग पोस्ट में कवर किया गया है


यह कहा जा रहा है, मुझे खुशी है कि आपने एरिक की मदद से मुद्दों पर काम किया है, लेकिन आप इन बातों पर भी गौर करना चाहते हैं।


3

बस एक छोटी सी मदद (इसे टिप्पणी के रूप में पोस्ट नहीं किया जा सकता है) @ sp_BlitzErik के उत्तर को जारी रखते हुए, मुझे Pinal और Max Vernon के साथ कुछ प्रश्न मिले (जहां यह याद नहीं किया जा सकता) कि आप कितना MAXDOP का उपयोग करें:

/*************************************************************************
Author          :   Kin Shah
Purpose         :   Recommend MaxDop settings for the server instance
Tested RDBMS    :   SQL Server 2008R2

**************************************************************************/
declare @hyperthreadingRatio bit
declare @logicalCPUs int
declare @HTEnabled int
declare @physicalCPU int
declare @SOCKET int
declare @logicalCPUPerNuma int
declare @NoOfNUMA int

select @logicalCPUs = cpu_count -- [Logical CPU Count]
    ,@hyperthreadingRatio = hyperthread_ratio --  [Hyperthread Ratio]
    ,@physicalCPU = cpu_count / hyperthread_ratio -- [Physical CPU Count]
    ,@HTEnabled = case 
        when cpu_count > hyperthread_ratio
            then 1
        else 0
        end -- HTEnabled
from sys.dm_os_sys_info
option (recompile);

select @logicalCPUPerNuma = COUNT(parent_node_id) -- [NumberOfLogicalProcessorsPerNuma]
from sys.dm_os_schedulers
where [status] = 'VISIBLE ONLINE'
    and parent_node_id < 64
group by parent_node_id
option (recompile);

select @NoOfNUMA = count(distinct parent_node_id)
from sys.dm_os_schedulers -- find NO OF NUMA Nodes 
where [status] = 'VISIBLE ONLINE'
    and parent_node_id < 64

-- Report the recommendations ....
select
    --- 8 or less processors and NO HT enabled
    case 
        when @logicalCPUs < 8
            and @HTEnabled = 0
            then 'MAXDOP setting should be : ' + CAST(@logicalCPUs as varchar(3))
                --- 8 or more processors and NO HT enabled
        when @logicalCPUs >= 8
            and @HTEnabled = 0
            then 'MAXDOP setting should be : 8'
                --- 8 or more processors and HT enabled and NO NUMA
        when @logicalCPUs >= 8
            and @HTEnabled = 1
            and @NoofNUMA = 1
            then 'MaxDop setting should be : ' + CAST(@logicalCPUPerNuma / @physicalCPU as varchar(3))
                --- 8 or more processors and HT enabled and NUMA
        when @logicalCPUs >= 8
            and @HTEnabled = 1
            and @NoofNUMA > 1
            then 'MaxDop setting should be : ' + CAST(@logicalCPUPerNuma / @physicalCPU as varchar(3))
        else ''
        end as Recommendations

-------------------------------------------------- -------

--MAX VERNON 

/* 
   This will recommend a MAXDOP setting appropriate for your machine's NUMA memory
   configuration.  You will need to evaluate this setting in a non-production 
   environment before moving it to production.

   MAXDOP can be configured using:  
   EXEC sp_configure 'max degree of parallelism',X;
   RECONFIGURE

   If this instance is hosting a Sharepoint database, you MUST specify MAXDOP=1 
   (URL wrapped for readability)
   http://blogs.msdn.com/b/rcormier/archive/2012/10/25/
   you-shall-configure-your-maxdop-when-using-sharepoint-2013.aspx

   Biztalk (all versions, including 2010): 
   MAXDOP = 1 is only required on the BizTalk Message Box
   database server(s), and must not be changed; all other servers hosting other 
   BizTalk Server databases may return this value to 0 if set.
   http://support.microsoft.com/kb/899000
*/
SET NOCOUNT ON;

DECLARE @CoreCount int;
SET @CoreCount = 0;
DECLARE @NumaNodes int;

/*  see if xp_cmdshell is enabled, so we can try to use 
    PowerShell to determine the real core count
*/
DECLARE @T TABLE (
    name varchar(255)
    , minimum int
    , maximum int
    , config_value int
    , run_value int
);
INSERT INTO @T 
EXEC sp_configure 'xp_cmdshell';
DECLARE @cmdshellEnabled BIT;
SET @cmdshellEnabled = 0;
SELECT @cmdshellEnabled = 1 
FROM @T
WHERE run_value = 1;
IF @cmdshellEnabled = 1
BEGIN
    CREATE TABLE #cmdshell
    (
        txt VARCHAR(255)
    );
    INSERT INTO #cmdshell (txt)
    EXEC xp_cmdshell 'powershell -OutputFormat Text -NoLogo -Command "& {Get-WmiObject -namespace "root\CIMV2" -class Win32_Processor -Property NumberOfCores} | select NumberOfCores"';
    SELECT @CoreCount = CONVERT(INT, LTRIM(RTRIM(txt)))
    FROM #cmdshell
    WHERE ISNUMERIC(LTRIM(RTRIM(txt)))=1;
    DROP TABLE #cmdshell;
END
IF @CoreCount = 0 
BEGIN
    /* 
        Could not use PowerShell to get the corecount, use SQL Server's 
        unreliable number.  For machines with hyperthreading enabled
        this number is (typically) twice the physical core count.
    */
    SET @CoreCount = (SELECT i.cpu_count from sys.dm_os_sys_info i); 
END

SET @NumaNodes = (
    SELECT MAX(c.memory_node_id) + 1 
    FROM sys.dm_os_memory_clerks c 
    WHERE memory_node_id < 64
    );

DECLARE @MaxDOP int;

/* 3/4 of Total Cores in Machine */
SET @MaxDOP = @CoreCount * 0.75; 

/* if @MaxDOP is greater than the per NUMA node
    Core Count, set @MaxDOP = per NUMA node core count
*/
IF @MaxDOP > (@CoreCount / @NumaNodes) 
    SET @MaxDOP = (@CoreCount / @NumaNodes) * 0.75;

/*
    Reduce @MaxDOP to an even number 
*/
SET @MaxDOP = @MaxDOP - (@MaxDOP % 2);

/* Cap MAXDOP at 8, according to Microsoft */
IF @MaxDOP > 8 SET @MaxDOP = 8;

PRINT 'Suggested MAXDOP = ' + CAST(@MaxDOP as varchar(max));

पहला स्क्रिप्ट एक रिक्त परिणाम देता है। दूसरा सुझाव दिया गया है MAXDOP = 2जो @sp_BlitzErik के अनुरूप है। धन्यवाद!
जेफ़
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.