SQL सर्वर और PerfMon मित्र बनाना

फोटो में अच्छी पुरानी कॉमेडी "एयरप्लेन" का एक दृश्य है - बूमर्स इसे याद करते हैं।



वह संयोग से यहां नहीं है। लेकिन बाद में उपयोगी।

Dba perfmon पसंद नहीं है


यह बिल्कुल नहीं है क्योंकि PerfMon इंटरफ़ेस Windows NT 3.1 (?) के साथ नहीं बदला है और दो हज़ारवाँ की गर्मी वापस देता है। वैसे, शायद कोई इस अजीब तथ्य के लिए स्पष्टीकरण जानता है। नियंत्रण कक्ष को वर्ष में कई बार फिर से लिखा जाता है। यहां तक ​​कि कैलकुलेटर को फिर से लिखा गया था। लेकिन परफ्यूम नहीं।

DBA कवर शब्दों के साथ सोचता है। जब अच्छा डीबीए डॉक्टर बीमार एसक्यूएल सर्वर पर आता है, तो वह अपना ब्रीफ़केस खोलता है, और ब्रीफ़केस में बड़ी संख्या में क्वार्टर होते हैं जो उसे ईमानदारी से सेवा देते हैं। वह उनमें से सबसे छोटी स्मृति से लेता है। कभी-कभी एक डीबीए PerfMon के मेट्रिक्स - भौतिक डिस्क, या डिस्क कतार लंबाई में देख सकता है। हालांकि, एक वास्तविक डीबीए को अपने स्वयं के SQL सर्वर मेट्रिक्स परफ़ॉर्मन के माध्यम से नहीं, बल्कि कैश के साथ मिलेंगे, उदाहरण के लिए, जैसे:

select * from sys.dm_os_performance_counters 
  where object_name='SQLServer:Buffer Manager' 
    and counter_name like 'Page life expectancy%' 
	and instance_name=''

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

नतीजतन, डीबीए केरी लिखता है, जो डीबीएटेस डेटाबेस में प्रत्येक एन मिनट को किसी न किसी प्लेट पर आंकड़े लिखते हैं। क्या आप खुद को पहचानते हैं?

एडवोकेट डेविल (परफ्यूम)


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

हम SQL दुनिया और PerfMon दुनिया के साथ दोस्त बना सकते हैं!

नीचे मैं दिखाऊंगा कि कैसे।

अब बारी बारी से जाएँगे


एक उदाहरण के रूप में, हम यह दिखाएंगे कि कैसे मेट्रिक्स को निर्यात किया जाए जो एसक्यूएल खुद परफ्यूम पर प्रकाशित न करे। उदाहरण के लिए, नीचे दिया गया प्रश्न:

select
  convert(numeric(10,2),round(((sum(version_store_reserved_page_count)*1.0)/128.00),2)),
  convert(numeric(10,2),round(((sum(user_object_reserved_page_count)*1.0)/128.00),2)),
  convert(numeric(10,2),round(((sum(internal_object_reserved_page_count)*1.0)/128.00),2))
from
  tempdb.sys.dm_db_file_space_usage;

संस्करण स्टोर (स्नैपशॉट के लिए), उपयोगकर्ता ऑब्जेक्ट (#tab और ## टैब) और सॉर्ट / अस्थायी संग्रहण स्थान द्वारा उपयोग की जाने वाली टेम्पर्ड स्पेस की राशि लौटाता है। आइए उनके लिए मेट्रिक्स बनाएं (18+, टीमें अविभाजित हैं)

dbcc addinstance ('SQLServer:User Settable', 'TempDB version store KB')
dbcc addinstance ('SQLServer:User Settable', 'TempDB user store KB')
dbcc addinstance ('SQLServer:User Settable', 'TempDB sort store KB')

यह SQLServer में तीन मीट्रिक बनाएगा -> उपयोगकर्तासेटेबल -> क्वेरी। मैट्रिक्स पूर्णांक हैं - int (नहीं bigint)। इसके अलावा, उनके अर्थ की व्याख्या की जाती है। यही है, अगर आपको पिछले मूल्य से एक डेल्टा की आवश्यकता है, तो यह आपकी चिंता है। लेकिन इस मामले में, हमें केवल मीट्रिक को मान निर्दिष्ट करने की आवश्यकता है:

declare @TEMPDBver int, @TEMPDBuser int, @TEMPDBsort int
select

@TEMPDBver = convert(numeric(10,2),round(((sum(version_store_reserved_page_count) *1.0)/128.00),2)),
@TEMPDBuser = convert(numeric(10,2),round(((sum(user_object_reserved_page_count) *1.0)/128.00),2)),
@TEMPDBsort = convert(numeric(10,2),round(((sum(internal_object_reserved_page_count) *1.0)/128.00),2))
from tempdb.sys.dm_db_file_space_usage;

if @TEMPDBver is not null    
  dbcc setinstance ('SQLServer:User Settable', 'Query', 
    'TempDB version store KB', @TEMPDBver)
if @TEMPDBuser is not null   
  dbcc setinstance ('SQLServer:User Settable', 'Query', 
   'TempDB user store KB', @TEMPDBuser)
if @TEMPDBsort is not null   
  dbcc setinstance ('SQLServer:User Settable', 'Query', 
    'TempDB sort store KB', @TEMPDBsort)

दरअसल, बस इतना ही। अब बस इस कोड को नियमित रूप से कॉल करें और सब कुछ काम करेगा।

डेल्टा काउंटर


अब एक डेल्टा काउंटर बनाते हैं। यह एमएस में लॉक टाइमआउट होगा।

dbcc addinstance ('SQLServer:User Settable', 'LOCK ms per s')

यहां आप मुझ पर आपत्ति जता सकते हैं कि ऐसी मीट्रिक पहले से मौजूद है:

select * from sys.dm_os_performance_counters 
  where counter_name like 'Lock Wait Time (ms)%' 
    and instance_name='_Total'
    and object_name='SQLServer:Locks'

लेकिन यह मीट्रिक केवल अंततः सुसंगत है। जैसा कि आपको याद है, यदि प्रोटॉन अस्थिर हैं, तो ब्रह्मांड में कोई भी डेटाबेस अंततः सुसंगत है। यही है, यदि आप एक ताला बनाते हैं और इस मीट्रिक के मूल्य को देखते हैं, तो यह नहीं बढ़ेगा! और केवल लॉक के अंत में इसका मूल्य पूर्ण प्रतीक्षा समय के लिए तेजी से कूद जाएगा। ग्राफ पर, अपेक्षित 'पठार' के बजाय, आपको एक तीव्र चोटी मिलेगी, जो वाई अक्ष पर आपके पैमाने को भी

खराब कर देती है। यही समस्या kvery के साथ है:

select sum(wait_time_ms) 
  from sys.dm_os_wait_stats 
  where wait_type like 'LCK_%'

इसलिए, हमें वर्तमान के समय को 'पूर्ण' तालों के समय में जोड़ना चाहिए:

declare @NEWlock bigint
select @NEWlock=sum(wait_time_ms) 
  from sys.dm_os_wait_stats 
  where wait_type like 'LCK_%' -- finished waits
select @NEWlock=@NEWlock+isnull(sum(waittime),0) 
  from master.dbo.sysprocesses 
  where blocked>0 and lastwaittype like 'LCK_%' -- waits in progress

यह क्वारी चार्ट पर पहले से ही सही पठार देता है।

अब हमें पिछले मूल्य से डेल्टा पर विचार करने की आवश्यकता है। इसके दो तरीके हैं:

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

दूसरे मामले में, हर पांच सेकंड या उससे भी अधिक बार एक चक्र करना काफी संभव है। तो, हम प्राप्त करते हैं:

declare @OLDlock bigint, @NEWlock bigint
declare @lock int, @seconds int = 5 -- must match WAITFOR
loop:
  set @OLDlock=@NEWlock -- shift new to old
  select @NEWlock=sum(wait_time_ms) 
    from sys.dm_os_wait_stats 
	where wait_type like 'LCK_%' -- finished waits
  select @NEWlock=@NEWlock+isnull(sum(waittime),0) 
    from master.dbo.sysprocesses 
	where blocked>0 and lastwaittype like 'LCK_%' -- waits in progress
  set @lock=(@NEWlock-@OLDlock)/@seconds -- this is delta
  if @lock is not null    
    dbcc setinstance ('SQLServer:User Settable', 'Query', 
	  'LOCK ms per s', @lock)
  waitfor delay '00:00:05' 
goto loop

कृपया ध्यान दें कि पहली बार जब आप एक DBCC लूप चलाते हैं, तो इसे स्किप किया जाएगा (जो कि सही है), @ alocklock के बाद से (और ताला) अशक्त होगा।

All Articles