এসকিউএল সার্ভারে এলআরইউ-কে মানগুলি দেখা কি সম্ভব?


21

এসকিউএল সার্ভারে sys.dm_os_memory_cache_entries, ক্যাশে প্রবেশের মূল ব্যয়ের পাশাপাশি ক্যাশে প্রবেশের বর্তমান ব্যয় ( original_costএবং current_costযথাক্রমে) উভয়ই দেখা সম্ভব । ডিএমভিতে sys.dm_os_buffer_descriptorsবর্তমানে সেই পৃষ্ঠাগুলির রেকর্ড রয়েছে যা বর্তমানে স্মৃতিতে রয়েছে এবং সেই সাথে পৃষ্ঠাগুলি সম্পর্কে কিছু মেটাডেটা। ডিভিএম-তে পাওয়া না যায় এমন একটি আকর্ষণীয় তথ্য হ'ল ডেটা পৃষ্ঠাগুলির জন্য LRU-K মান।

এসকিউএল সার্ভারে বাফার পুলে ডেটা পৃষ্ঠাগুলির জন্য LRU-K মান পাওয়া কি সম্ভব? যদি তাই হয়, কিভাবে?


এই সংস্করণ নির্দিষ্ট?
জেএনকে

1
@ জেএনকে - নিখুঁত বিশ্বে, না, তবে যতক্ষণ এটি এসকিউএল সার্ভার ২০১২ এ কাজ করে ততক্ষণ আমি সত্যিই চিন্তা করি না।
যেরেমিয়া পেশকা

উত্তর:


21

আমি যতদূর দেখতে পাচ্ছি বাস্তবে এটি করার কোনও কার্যকর উপায় নেই।

অন্যান্য উত্তর উল্লেখ করে DBCC PAGEএবং বিবরণটি পাঠককে ছেড়ে দেয় and পরীক্ষা-নিরীক্ষা থেকে আমি ধরে নিই তাদের অর্থ bUse1

এটি অ্যাকাউন্টটি নিতে ব্যর্থ হয় যা DBCC PAGEএটি নিজেই পৃষ্ঠার একটি ব্যবহার এবং এটি আমাদের দেখানোর আগে মানটি আপডেট হয়।

এটি প্রদর্শিত একটি স্ক্রিপ্ট নীচে রয়েছে (চালাতে 12 সেকেন্ড সময় নেয়)।

USE tempdb;

CREATE TABLE T(X INT);

INSERT INTO T VALUES(1);

DECLARE @DBCCPAGE NVARCHAR(100);

SELECT @DBCCPAGE = 'DBCC PAGE(0,' + CAST(file_id AS VARCHAR) + ',' + CAST(page_id AS VARCHAR) + ',0) WITH TABLERESULTS;'
FROM   T CROSS APPLY  sys.fn_PhysLocCracker (%%physloc%%)

DECLARE @DbccResults TABLE 
(
      ID INT IDENTITY,
      ParentObject VARCHAR(1000)NULL,
      Object VARCHAR(4000)NULL,
      Field VARCHAR(1000)NULL,
      ObjectValue VARCHAR(MAX)NULL
)    
INSERT INTO @DbccResults EXEC(@DBCCPAGE)  
WAITFOR DELAY '00:00:07'
INSERT INTO @DbccResults EXEC(@DBCCPAGE)  
WAITFOR DELAY '00:00:05'
INSERT INTO @DbccResults EXEC(@DBCCPAGE)             

SELECT *
FROM @DbccResults   
WHERE Field = 'bUse1'    
ORDER BY ID

EXEC(@DBCCPAGE) 

DROP TABLE T

সাধারণ ফলাফল হয়

+----+--------------+-------------------------+-------+-------------+
| ID | ParentObject |         Object          | Field | ObjectValue |
+----+--------------+-------------------------+-------+-------------+
|  8 | BUFFER:      | BUF @0x00000002FE1F1440 | bUse1 |       54938 |
| 49 | BUFFER:      | BUF @0x00000002FE1F1440 | bUse1 |       54945 |
| 90 | BUFFER:      | BUF @0x00000002FE1F1440 | bUse1 |       54950 |
+----+--------------+-------------------------+-------+-------------+

দ্বিতীয় ফলাফল হচ্ছে

+---------+-------------------------+--------------+--------------------+
| BUFFER: | BUF @0x00000002FE1F1440 | bpage        | 0x00000002F4968000 |
| BUFFER: | BUF @0x00000002FE1F1440 | bhash        | 0x0000000000000000 |
| BUFFER: | BUF @0x00000002FE1F1440 | bpageno      | (1:120)            |
| BUFFER: | BUF @0x00000002FE1F1440 | bdbid        | 8                  |
| BUFFER: | BUF @0x00000002FE1F1440 | breferences  | 0                  |
| BUFFER: | BUF @0x00000002FE1F1440 | bcputicks    | 0                  |
| BUFFER: | BUF @0x00000002FE1F1440 | bsampleCount | 0                  |
| BUFFER: | BUF @0x00000002FE1F1440 | bUse1        | 54950              |
| BUFFER: | BUF @0x00000002FE1F1440 | bstat        | 0x9                |
| BUFFER: | BUF @0x00000002FE1F1440 | blog         | 0x1c9a             |
| BUFFER: | BUF @0x00000002FE1F1440 | bnext        | 0x0000000000000000 |
+---------+-------------------------+--------------+--------------------+

7 সেকেন্ড বিলম্বের পরে আউটপুটটি 7 এবং 5 সেকেন্ড বিলম্বের পরে 5 দ্বারা বাড়ানো হয়।

সুতরাং এটি স্পষ্ট বলে মনে হয় যে এই এলআরইউ মানগুলি কয়েক যুগের পর থেকে সেকেন্ড are এসকিউএল সার্ভার পরিষেবাদি পুনরায় আরম্ভ করা পর্বের পরিবর্তন হয় না তবে মেশিনটি পুনরায় চালু করে।

মানটি প্রতি 65,536 সেকেন্ডের মধ্যে গড়িয়ে যায় তাই আমি অনুমান করি যে এটি ঠিক এর মতো কিছু ব্যবহার করে system_up_time mod 65536

এটি আমার মনে একটি উত্তর না দেওয়া প্রশ্ন ছেড়ে দেয় (কোনও গ্রহণকারী?)। এসকিউএল সার্ভার ইন্টার্নাল বই অনুসারে ব্যবহার LRU-Kকরে K=2। সেখানে থাকা উচিত নয় bUse2? যদি তাই হয় তবে কোথায়?

bUse1মানটি পরিবর্তন না করেই পর্যবেক্ষণের একটি উপায় আছে যা আমি জানি এবং এটি বব ওয়ার্ড এখানে প্রদর্শন করেছেন demonst

এসকিউএল সার্ভার প্রক্রিয়াতে একটি ডিবাগার সংযুক্ত করুন এবং বাফার কাঠামোর মেমরি ঠিকানার জন্য রেফারেন্সযুক্ত মেমরি প্রদর্শন করুন ( 0x00000002FE1F1440উপরে দেখানো হয়েছে )।

আমি উপরের স্ক্রিপ্টটি চালানোর সাথে সাথে এটি করেছি এবং নিম্নলিখিতগুলি দেখলাম।

এখানে চিত্র বর্ণনা লিখুন

(পূর্বের পরীক্ষা-নিরীক্ষা থেকে আমি হাইলাইট করা বাইটগুলিই খুঁজে পেলাম যেগুলি রানের মধ্যে পরিবর্তিত হয়েছিল তাই এটি অবশ্যই সঠিক right

একটি আশ্চর্যজনক দিক হল SELECT CAST(0xc896 as int)= 51350

এটি হুবহু 3600 (এক ঘন্টা) রিপোর্টের তুলনায় কম DBCC PAGE

আমি বিশ্বাস করি এটি DBCC PAGEনিজের কল করে পৃষ্ঠাগুলি ক্যাশে রাখা হচ্ছে তা অস্বীকার করার কিছু প্রচেষ্টা be একটি "সাধারণ" পৃষ্ঠার জন্য এটি নির্বাচন করুন এই এক ঘন্টার সমন্বয় ঘটে না। দৌড়ানোর পরে

SELECT *
FROM T

SELECT ((ms_ticks) % 65536000) / 1000 AS [Roughly Expected Value]
FROM sys.dm_os_sys_info

প্রত্যাশার মতো মেমোরিতে প্রদর্শিত মান।

DBCCকমান্ড আসলে যে মান দুইবার আপডেট। একবারে

sqlmin.dll!BPool::Touch()  + 0x3bfe bytes   
sqlmin.dll!BPool::Get()  + 0x12e bytes  
sqlmin.dll!LatchedBuf::ReadLatch()  + 0x14f bytes   
sqlmin.dll!UtilDbccDumpPage()  + 0x364 bytes    
sqlmin.dll!DbccPage()  + 0xfa bytes 
sqllang.dll!DbccCommand::Execute()  + 0x153 bytes

উচ্চ মানের সাথে আবার আবার

sqlmin.dll!LatchedBuf::FreeAndUnlatch()  + 0x71 bytes   
sqlmin.dll!UtilDbccDumpPage()  + 0x545 bytes    
sqlmin.dll!DbccPage()  + 0xfa bytes 
sqllang.dll!DbccCommand::Execute()  + 0x153 bytes   

নীচের সাথে।

আমি DBCC BUFFER/ DBCC PAGEকোনও উপায়ে ব্যবহার না করেই পৃষ্ঠাগুলির জন্য বাফার ঠিকানাগুলি পাওয়ার কোনও উপায় সম্পর্কে অবগত নই এবং এই দুটি পরিবর্তনই আমরা যে মূল্যটি পরিদর্শন করার চেষ্টা করছি তা ব্যবহার করে!


3
ভাল, আপনার ক্রিসমাস কাটাতে এটি এক উপায়। :-)
আরবেরি ইয়ং

3
@ আরবেরি ইউং তুচ্ছ সাধনা খেলছেন!
মার্টিন স্মিথ

আমি যদি কোনও ডিবাগারের যথাযথ ব্যবহারের জন্য বোনাস পয়েন্ট দিতে পারি তবে আমি করব।
জেরেমিয়া পেশকা

1
সাবাশ! (এবং দুর্দান্ত ডিবাগিং দক্ষতা!)
ডিবিআরজিনিস

@ ডিবিএ আরজেনিস - ধন্যবাদ! লজ্জাজনক যে যদিও এটি ব্যবহারিক সমাধান বলে মনে হচ্ছে না। এটি যদি আমরা সহজেই দেখতে পেতাম তবে এটি বেশ তথ্যমূলক হতে পারে।
মার্টিন স্মিথ

8

আমি টুইটারে মিঃ পেছকাকে যেমন উল্লেখ করেছি, এই তথ্যটি বিইউএফ কাঠামোর উপর রাখা হয়েছে যা পৃষ্ঠাটি স্মরণে রাখে। ডিবিসিসি পৃষ্ঠা আপনাকে এর শিরোনামের অংশ হিসাবে এই তথ্য দেয় gives


3
উদ্বিগ্নভাবে, আমি আপনাকে "উত্তর" দিচ্ছি, @ ডিবিএ আরগনিস। আমি এখনও বজায় রেখেছি DBCC PAGEএটি কোনও কিছুর সন্ধানের এক ভয়ঙ্কর উপায়, তবে আপনি সঠিক বলে মনে করছেন। এটি অত্যন্ত দুঃখের বিষয় যে তথ্যগুলি DBCC PAGEকার্যকরভাবে, জিব্রিশ এবং কোনও আসল সিস্টেম সময়ের সাথে সম্পর্কিত নয়।
যেরেমিয়া পেশকা

8
এই উত্তরের একটি উদাহরণ হতে পারে দরকারী সংযোজন।
মার্ক স্টোরি-স্মিথ

3
@ মার্কস্টোরী-স্মিথ - আমি সম্মত। যদি না ডিবিএর্গেনিসের হাতের মুঠোয় কিছুটা না থাকে আমি দেখতে পাচ্ছি না এটি কীভাবে কার্যকর।
মার্টিন স্মিথ

2
ডিবিসিসি পিএজেজে কোনও রেফারেন্স কখনই দরকারী কোনও কিছুর সমান নয়।
যেরেমিয়া পেশকা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.