เป็นไปได้ไหมที่จะดูค่า LRU-K ใน SQL Server


21

ใน SQL Server sys.dm_os_memory_cache_entriesเป็นไปได้ที่จะดูทั้งต้นทุนดั้งเดิมของรายการในแคชรวมถึงต้นทุนปัจจุบันของรายการแคช ( original_costและcurrent_costตามลำดับ) DMV sys.dm_os_buffer_descriptorsมีการบันทึกหน้าเว็บที่อยู่ในหน่วยความจำในปัจจุบันเช่นเดียวกับข้อมูลเมตาบางส่วนเกี่ยวกับหน้า ข้อมูลอันน่าสนใจอย่างหนึ่งที่ไม่มีใน DVM คือค่า LRU-K สำหรับหน้าข้อมูล

เป็นไปได้หรือไม่ที่จะรับค่า LRU-K สำหรับหน้าข้อมูลในบัฟเฟอร์พูลใน SQL Server ถ้าเป็นเช่นนั้นได้อย่างไร


เฉพาะรุ่นนี้หรือไม่
JNK

1
@JNK - ในโลกที่สมบูรณ์ไม่มี แต่ตราบใดที่มันทำงานบน SQL Server 2012 ฉันไม่ต้องกังวล
เยเรมีย์ Peschka

คำตอบ:


21

อันที่จริงไม่มีวิธีที่มีประโยชน์ในการทำเท่าที่ฉันเห็น

คำตอบอื่น ๆ กล่าวถึงDBCC PAGEและปล่อยให้ผู้อ่านหารายละเอียด 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

ดังนั้นจึงเห็นได้ชัดว่าค่า LRU เหล่านี้เป็นวินาทีตั้งแต่ยุค การเริ่มบริการ SQL Server ใหม่จะไม่เปลี่ยนช่วงเวลา แต่การรีสตาร์ทเครื่องจะไม่

ค่ามีการหมุนวนในทุก ๆ 65,536 วินาทีดังนั้นฉันจึงสันนิษฐานว่ามันใช้สิ่งที่ชอบ system_up_time mod 65536

สิ่งนี้ทำให้คำถามหนึ่งคำถามที่ยังไม่ได้คำตอบในใจของฉัน (ผู้ใด?) SQL Server ใช้LRU-KกับK=2ตามหนังสือ internals ไม่ควรจะมีbUse2? ถ้าอย่างนั้นอยู่ที่ไหน

มีวิธีหนึ่งในการสังเกตbUse1ค่าโดยไม่ต้องเปลี่ยนค่าที่ฉันรู้และนั่นแสดงให้เห็นโดย Bob Wardที่นี่

แนบดีบักเกอร์กับกระบวนการ SQL Server และแสดงหน่วยความจำอ้างอิงสำหรับที่อยู่หน่วยความจำของโครงสร้างบัฟเฟอร์ (แสดงเป็น0x00000002FE1F1440ด้านบน)

ฉันทำสิ่งนี้ทันทีหลังจากเรียกใช้สคริปต์ด้านบนและเห็นสิ่งต่อไปนี้

ป้อนคำอธิบายรูปภาพที่นี่

(จากการทดลองก่อนหน้านี้ฉันพบว่าไบต์ที่ถูกเน้นเป็นสิ่งเดียวที่เปลี่ยนไประหว่างการวิ่งดังนั้นสิ่งเหล่านี้จึงเป็นสิ่งที่ถูกต้องอย่างแน่นอน)

แง่มุมหนึ่งที่น่าแปลกใจคือ=SELECT CAST(0xc896 as int)51350

ตรงนี้เป็น 3600 (หนึ่งชั่วโมง) DBCC PAGEน้อยกว่าที่รายงานโดย

ฉันเชื่อว่านี่เป็นความพยายามที่จะลบหน้าเว็บที่ถูกเก็บไว้ในแคชด้วยการเรียกDBCC PAGEตัวเอง สำหรับหน้า "ปกติ" ให้เลือกการปรับหนึ่งชั่วโมงนี้จะไม่เกิดขึ้น หลังจากวิ่ง

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
นี่เป็นวิธีหนึ่งในการใช้คริสต์มาสของคุณ :-)
RBarryYoung

3
@RarryYoung Beats เล่น Trivial Pursuit!
Martin Smith

หากฉันสามารถให้คะแนนโบนัสสำหรับการใช้งานดีบักเกอร์ที่เหมาะสมฉันจะ
Jeremiah Peschka

1
ทำได้ดี! (และทักษะการดีบักที่ยอดเยี่ยม!)
DBArgenis

@DBArgenis - ขอบคุณ! น่าเสียดายที่ดูเหมือนว่าจะไม่มีทางแก้ปัญหาจริง มันอาจให้ข้อมูลค่อนข้างมากหากเราเห็นสิ่งนี้ได้ง่าย
Martin Smith

8

ดังที่ฉันได้พูดคุยกับ Mr. Peschka บนทวิตเตอร์ข้อมูลนี้จะถูกเก็บไว้ในโครงสร้าง BUF ที่เก็บเพจไว้ในหน่วยความจำ DBCC PAGE ให้ข้อมูลนี้แก่คุณโดยเป็นส่วนหนึ่งของส่วนหัว


3
ก่อนหน้านี้ฉันให้ "คำตอบ" แก่คุณ @DBArgenis ฉันยังคงยืนยันว่าDBCC PAGEเป็นวิธีที่น่ากลัวในการค้นหาสิ่งใด แต่คุณดูเหมือนถูกต้อง มันน่าเสียดายที่ข้อมูลจากDBCC PAGEนั้นมีประสิทธิภาพไร้สาระและไม่เกี่ยวข้องกับเวลาของระบบจริง
Jeremiah Peschka

8
ตัวอย่างจะเป็นประโยชน์เพิ่มเติมสำหรับคำตอบนี้
Mark Storey-Smith

3
@ MarkStorey-Smith - ฉันเห็นด้วย นอกเสียจาก DBArgenis จะมีแขนเสื้อของเขาหลอกขึ้นมาฉันไม่สามารถเห็นได้ว่าสิ่งนี้มีประโยชน์อย่างไร
Martin Smith

2
ไม่มีการอ้างอิงถึง DBCC PAGE ที่เคยมีประโยชน์กับสิ่งใด
Jeremiah Peschka
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.