Page Life Expectancy พูดถึงเรื่องนี้อย่างไร


9

ฉันได้ติดตั้งซอฟต์แวร์ตรวจสอบในอินสแตนซ์ของ SQL Server สองสามตัวในสภาพแวดล้อม ฉันพยายามค้นหาคอขวดและแก้ไขปัญหาด้านประสิทธิภาพ ฉันต้องการตรวจสอบว่าเซิร์ฟเวอร์บางแห่งต้องการหน่วยความจำเพิ่มเติมหรือไม่

ฉันสนใจในหนึ่งเคาน์เตอร์: อายุขัยหน้า มันดูแตกต่างในทุกเครื่อง ทำไมมันถึงเปลี่ยนบ่อยในบางกรณีและมันหมายถึงอะไร?

โปรดดูข้อมูลจากสัปดาห์ที่แล้วที่รวบรวมบนเครื่องที่แตกต่างกันสองสามเครื่อง คุณจะพูดอะไรเกี่ยวกับแต่ละตัวอย่าง

ใช้ตัวอย่างการผลิตอย่างหนัก (1): ใช้ตัวอย่างการผลิตอย่างหนัก (1)

istance การผลิตที่ใช้ในระดับปานกลาง (2) istance การผลิตที่ใช้ในระดับปานกลาง (2)

ตัวอย่างการทดสอบที่ใช้ไม่ค่อย (3)

ตัวอย่างการทดสอบที่ใช้ไม่ค่อย (3)

ใช้ตัวอย่างการผลิตอย่างหนัก (4) ใช้ตัวอย่างการผลิตอย่างหนัก (4)

ตัวอย่างทดสอบที่ใช้ในระดับปานกลาง (5) ตัวอย่างทดสอบที่ใช้ในระดับปานกลาง (5)

ใช้คลังข้อมูลอย่างหนัก (6) ใช้คลังข้อมูลอย่างหนัก (6)

แก้ไข: ฉันกำลังเพิ่มเอาต์พุตของ SELECT @@ VERSION สำหรับเซิร์ฟเวอร์เหล่านี้ทั้งหมด:

Instance 1: Microsoft SQL Server 2008 R2 (SP1) - 10.50.2500.0 (X64) 
Jun 17 2011 00:54:03 Copyright (c) Microsoft Corporation
 Standard Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) (Hypervisor)


Instance 2: Microsoft SQL Server 2012 (SP1) - 11.0.3000.0 (X64) 
Oct 19 2012 13:38:57 
Copyright (c) Microsoft Corporation
 Standard Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) (Hypervisor)


Instance 3: Microsoft SQL Server 2012 - 11.0.5058.0 (X64) 
May 14 2014 18:34:29 
    Copyright (c) Microsoft Corporation
 Developer Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) (Hypervisor)

Instance 4: Microsoft SQL Server 2008 R2 (SP2) - 10.50.4000.0 (X64) Jun 28 2012 08:36:30 
Copyright (c) Microsoft Corporation
 Standard Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) (Hypervisor)


Instance 5: Microsoft SQL Server 2012 - 11.0.5058.0 (X64) 
May 14 2014 18:34:29 
Copyright (c) Microsoft Corporation
 Developer Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) (Hypervisor)

Instance 6: Microsoft SQL Server 2008 R2 (RTM) - 10.50.1600.1 (X64) 
Apr 2 2010 15:48:46 
Copyright (c) Microsoft Corporation
 Standard Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) (Hypervisor)

ฉันยังเรียกใช้แบบสอบถามต่อไปนี้บนเครื่อง:

SELECT DISTINCT memory_node_id
FROM sys.dm_os_memory_clerks

และมันจะส่งคืน 2 หรือ 3 แถวสำหรับแต่ละเซิร์ฟเวอร์:

Instance 1: 0; 64; 1
Instance 2: 0; 64
Instance 3: 0; 64
Instance 4: 0; 64
Instance 5: 0; 64
Instance 6: 0; 64; 1

มันหมายความว่าอะไร? เซิร์ฟเวอร์เหล่านี้เรียกใช้ NUMA หรือไม่


อินสแตนซ์ 2 มี SQL Server 2012 และอื่น ๆ คือ SQL Server 2008 R2
BuahahaXD

ขนาดของกราฟไม่ได้ช่วยอะไรจริงๆ มันจะน่าสนใจมากขึ้นในการดูว่าเซิร์ฟเวอร์ไม่ว่างเข้าใกล้ศูนย์ได้มากแค่ไหนในระหว่างวัน
James Z

ฉันหวังว่าฉันจะได้รับข้อมูลรายละเอียดเพิ่มเติม ฉันใช้ Solarwinds Database Performance Monitor และไม่มีวิธีการส่งออกข้อมูลไปยังไฟล์ วิธีเดียวที่จะทำเช่นนั้นคือการสืบค้นฐานข้อมูล แต่โครงสร้างจะไม่ทำให้เป็นมาตรฐานหรือง่ายต่อการเข้าใจ
BuahahaXD

1
เพื่อช่วยให้คุณเข้าใจการตกอย่างกระทันหัน: เมื่อมีการสแกนข้อมูลที่ไม่ได้รับการสแกนจำนวนมากจะถูกนำหน้าจำนวนมากออกมาเพื่อให้มีที่ว่างสำหรับหน้าใหม่ มันเป็นอัลกอริทึม LRU ที่แก้ไข หน้าใหม่วางแบบเก่า
usr

อินสแตนซ์ที่ 2 และ 6 ใช้ NUMA ส่วนที่เหลือไม่ใช้
BuahahaXD

คำตอบ:


8

นำมาจาก MSDN: - https://msdn.microsoft.com/en-us/library/ms189628.aspx

อายุการใช้งานของหน้า - ระบุจำนวนวินาทีที่หน้าจะอยู่ในพูลบัฟเฟอร์โดยไม่มีการอ้างอิง

SQL จะค้นหาหน้าข้อมูลในหน่วยความจำเสมอ หากหน้าข้อมูลไม่อยู่ในหน่วยความจำ SQL จะต้องไปที่ดิสก์ (ดำเนินการทางกายภาพ IO) เพื่อดึงข้อมูลที่จำเป็นในการดำเนินการตามคำขอ หากตัวนับ PLE ของคุณอยู่ในระดับต่ำซึ่งบ่งชี้ว่าหน้าข้อมูลในหน่วยความจำจะถูกเขียนทับอย่างสม่ำเสมอด้วยหน้าใหม่ที่มาจากการดำเนินการทางกายภาพของ IO การดำเนินการทางกายภาพของ IO มีราคาแพงหมายความว่าประสิทธิภาพของอินสแตนซ์ SQL ของคุณจะได้รับผลกระทบ ดังนั้นคุณจะต้องการให้ตัวนับ PLE ของคุณสูงที่สุดเท่าที่จะเป็นไปได้

ไม่ต้องสนใจคำแนะนำใด ๆ ที่คุณเห็นทางออนไลน์ที่กล่าวถึง 300 เป็นเกณฑ์ที่ดีสำหรับตัวนับนี้

เกณฑ์นี้มาจากวันที่หน่วยความจำถูก จำกัด (คิดว่าระบบ 32 บิต) ตอนนี้เรามีระบบ 64 บิตซึ่งสามารถมี TB ของ RAM ได้ดังนั้นคำแนะนำนี้จึงล้าสมัย

ก่อนอื่นคุณ จำกัด หน่วยความจำของ SQL หรือไม่? ถ้าเป็นเช่นนั้นหน่วยความจำที่เหลืออยู่มีเท่าไหร่? สามารถเพิ่มขีด จำกัด ได้หรือไม่

สิ่งที่สองที่ฉันต้องการค้นหาในเซิร์ฟเวอร์ของคุณคือมีงานบำรุงรักษาใด ๆ ที่เปิดใช้งานหรือไม่ ตรวจสอบงานที่มีการสร้างดัชนีใหม่อัพเดตสถิติหรือการดำเนินการ DBCC CHECKDB สิ่งเหล่านี้อ่านเป็นจำนวนมากและอาจเป็นสาเหตุให้เยื่อบุ PLE แบนของคุณ

ถัดไปขณะที่คุณใช้ SQL Server 2008 + คุณสามารถตั้งค่าเซสชันการขยายเหตุการณ์เพื่อจับภาพข้อความค้นหาที่มาพร้อมกับการอ่านจำนวนมาก นี่คือรหัสที่ต้องทำ: -

CREATE EVENT SESSION [QueriesWithHighLogicalReads] ON SERVER 
ADD EVENT sqlserver.sql_batch_completed(
   ACTION(sqlserver.client_hostname,sqlserver.database_name,sqlserver.session_id,sqlserver.sql_text,sqlserver.tsql_stack,sqlserver.username)
     WHERE ([logical_reads]>200000))
ADD TARGET package0.event_file(SET filename=N'C:\SQLServer\XEvents\QueriesWithHighLogicalReads.xel')
GO

สิ่งนี้จะดักจับข้อความค้นหาทั้งหมดบนเซิร์ฟเวอร์ของคุณที่อ่านโลจิคัลได้มากกว่า 200,000 รายการ ฉันไม่ทราบว่าคุณมีหน่วยความจำเท่าใดในแต่ละเซิร์ฟเวอร์ดังนั้นคุณอาจต้องการปรับแต่งรูปนั้น เมื่อสร้างสิ่งนี้แล้วคุณสามารถเริ่มเซสชันได้โดยการเรียกใช้: -

ALTER EVENT SESSION [QueriesWithHighLogicalReads]
ON SERVER
STATE = START;
GO

จากนั้นสอบถามเซสชันโดยใช้: -

WITH CTE_ExecutedSQLStatements AS
(SELECT
[XML Data],
[XML Data].value('(/event[@name=''sql_statement_completed'']/@timestamp)[1]','DATETIME')    AS [Time],
[XML Data].value('(/event/data[@name=''duration'']/value)[1]','int')                        AS [Duration],
[XML Data].value('(/event/data[@name=''cpu_time'']/value)[1]','int')                        AS [CPU],
[XML Data].value('(/event/data[@name=''logical_reads'']/value)[1]','int')                   AS [logical_reads],
[XML Data].value('(/event/data[@name=''physical_reads'']/value)[1]','int')                  AS [physical_reads],
[XML Data].value('(/event/action[@name=''sql_text'']/value)[1]','varchar(max)')             AS [SQL Statement]
FROM
    (SELECT 
    OBJECT_NAME              AS [Event], 
    CONVERT(XML, event_data) AS [XML Data]
FROM 
    sys.fn_xe_file_target_read_file
('C:\SQLServer\XEvents\QueriesWithHighLogicalReads*.xel',NULL,NULL,NULL)) as v)

SELECT
[SQL Statement]     AS [SQL Statement],
SUM(Duration)       AS [Total Duration],
SUM(CPU)            AS [Total CPU],
SUM(Logical_Reads)  AS [Total Logical Reads],
SUM(Physical_Reads) AS [Total Physical Reads]
FROM
CTE_ExecutedSQLStatements
GROUP BY
[SQL Statement]
ORDER BY
[Total Logical Reads] DESC
GO

ระวังเมื่อใช้งาน! ไฟล์สามารถมีขนาดใหญ่ขึ้นได้ดังนั้นลองทดสอบกับตัวอย่างการพัฒนาก่อน คุณสามารถตั้งค่าสูงสุด ขนาดของไฟล์ แต่ฉันไม่ได้รวมไว้ที่นี่ นี่คือลิงค์ MSDN สำหรับกิจกรรมเพิ่มเติม: - https://msdn.microsoft.com/en-us/library/hh213147.aspx

ตรวจสอบเซสชั่นนี้เป็นประจำและหวังว่ามันควรจะรับแบบสอบถามใด ๆ ที่เข้ามาในที่แบนซับ PLE ของคุณ

อ่านเพิ่มเติม -

บล็อก MSDN บน PLE - http://blogs.msdn.com/b/mcsukbi/archive/2013/04/12/sql-server-page-life-expectancy.aspx

วิดีโอเกี่ยวกับการตั้งค่ากิจกรรมเพิ่มเติม - https://dbafromthecold.wordpress.com/2014/12/05/video-identifying-large-queries-using-extended-events/ (มาจากบล็อกของฉันเองขออภัยเกี่ยวกับการส่งเสริมตนเองที่ไร้ยางอาย )


4

อายุขัยของเพจเป็นตัววัดระยะเวลาที่คุณสามารถคาดหวังว่าเพจที่เพิ่งถูกอ่านจากดิสก์เพื่อใช้ในหน่วยความจำก่อนที่มันจะถูกผลักออกจากสิ่งอื่นหรือถูกทำลาย (เช่นหน้านั้นถูกจัดสรรคืนบนดิสก์เพื่อไม่จำเป็น เพื่อเก็บสำเนาไว้ใน RAM)

โดยทั่วไปแล้วยิ่งรูปแบบโหลดของคุณเร็วขึ้นเท่าไหร่คุณก็จะยิ่งประมวลผลได้เพราะสิ่งต่าง ๆ จะถูกเก็บไว้ในหน่วยความจำ หากต่ำมากนี่อาจบ่งบอกถึงปัญหาด้านประสิทธิภาพที่เกิดจากความอดอยากในหน่วยความจำ

การอ่านค่าต่ำไม่ได้หมายความว่ามีปัญหาเสมอไปตัวอย่างเช่นอาจต่ำหลังจากกระบวนการที่ใช้งานจำนวนมากจำนวนมากที่ใช้หน้ากระดาษจำนวนมากจึงนำเข้ามา กราฟของคุณที่ดูเหมือนว่าจะลดลงในตอนท้ายของแต่ละวันอาจมีสาเหตุมาจากงานธุรการประจำคืน (สำรองข้อมูลเก็บถาวรข้อมูลประมวลผลข้ามคืนอื่น ๆ )

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