เวลารอจะสูงกว่าเวลานาฬิกาได้อย่างไร


15

เมื่อฉันกำลังติดตามด้วย sp_BlitzFirst ฉันจะได้รับรายละเอียดนี้:

<?ClickToSeeDetails -- 
For 20 seconds over the last 5 seconds, SQL Server was waiting on this 
particular bottleneck.


 -- ?>

ควรที่จะอ่าน "20 ครั้งในช่วง 5 วินาทีที่ผ่านมา?" การค้นหาคือ CLR_SEMAPHORE

คำตอบ:


24

ไม่รอสถิติสามารถ (และบ่อยกว่าจะไม่) รวมมากกว่าเวลาที่ใช้ในเซิร์ฟเวอร์

ลองนึกภาพสถานการณ์ที่มี 2 เธรดแยกกันใช้เวลาวินาทีเดียวรอทรัพยากรบางอย่าง - คุณจะมีเวลารอ 2 วินาทีเป็นเวลา 1 วินาทีของเวลานาฬิกา

แต่ละเธรดมีการรอของตัวเอง - ข้อความกำลังบอกคุณว่า 20 วินาทีของเวลารอสำหรับทรัพยากรเฉพาะนั้นเกิดขึ้นในช่วง 5 วินาทีสุดท้ายของเวลานาฬิกา

หรือจะกล่าวอีกวิธีหนึ่งแต่ละคอร์สามารถรันหลายเคียวรีได้พร้อมกันและคอร์หลายคอร์สามารถรวมกันได้มากขึ้น ซึ่งก็คือการพูดหน่วยเป็นเกลียวจริง·วินาทีไม่ใช่วินาที


8

มันอาจเป็นประโยชน์ในการทำงานผ่านตัวอย่าง พิจารณาสามรัฐที่พบมากที่สุดสำหรับคนงาน :

RUNNING = ผู้ปฏิบัติงานกำลังทำงานอย่างไม่ถูกต้อง

RUNNABLE = ผู้ปฏิบัติงานพร้อมที่จะทำงานบนตัวกำหนดตารางเวลา

SUSPENDED = ผู้ปฏิบัติงานถูกระงับในขณะนี้รอเหตุการณ์ที่จะส่งสัญญาณ

คนงานที่มีสถานะRUNNINGสามารถสร้างเวลารอได้ ตัวอย่างเช่นหากผู้ปฏิบัติงานจำเป็นต้องเรียกใช้รหัสในระบบปฏิบัติการแทนที่จะเป็นใน SQLOS มันอาจเข้าสู่การรอก่อนหรือภายนอก ในช่วงเวลานั้นมันจะเรียกใช้รหัสบน CPU ที่เกี่ยวข้อง แต่มันจะยังคงสร้างเวลารอ

คนงานที่มีสถานะRUNNABLEสามารถสร้างเวลารอ (เท่าที่ฉันรู้ว่าพวกเขาทำเสมอ) หากผู้ปฏิบัติงานส่งสัญญาณว่าทรัพยากรพร้อมใช้งานก็อาจสะสมเวลารอสัญญาณตามการรอครั้งล่าสุด หากผู้ปฏิบัติงานใช้ควอนตัม 4 มิลลิวินาทีก่อนหน้าของมันแล้วมันอาจสะสมSOS_SCHEDULER_YIELDเวลารอ

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

สก์ท็อปของฉันมีสี่แกนตรรกะเพื่อให้เริ่มต้นนับคนงานสูงสุดคือ512 มันเกือบจะเป็นไปไม่ได้จริง ๆ แต่ในเครื่องนี้ฉันสามารถสร้างเวลารอ 512 วินาทีต่อวินาทีในทางทฤษฎีถ้าฉันจัดการให้คนงานทุกคนรออะไรซักอย่างในเวลาเดียวกัน ในขณะที่จำนวนคอร์ / ผู้ทำงานเพิ่มจำนวนนั้นจะสูงขึ้น

คุณสามารถรอได้มากกว่าหนึ่งวินาทีต่อวินาทีแม้ว่าคุณจะไม่ได้เรียกใช้คิวรีกับ SQL Server ก็ตาม บนเครื่องของฉันแบบสอบถามต่อไปนี้ดูเหมือนจะสร้างระหว่าง 9-14 แถว:

SELECT [state], last_wait_type, wait_started_ms_ticks
FROM sys.dm_os_workers
WHERE [state] IN ('SUSPENDED', 'RUNNABLE')
AND task_address IS NOT NULL
AND wait_started_ms_ticks <> 0
AND wait_started_ms_ticks >= start_quantum;

ฉันสามารถถ่ายภาพรวมของเวลารอทั้งหมดตั้งแต่ฉันรีสตาร์ทเซิร์ฟเวอร์ครั้งล่าสุดและเปรียบเทียบกับผลรวมใหม่หลังจากรอสิบวินาที:

DECLARE @start_wait_time_ms BIGINT;

SELECT @start_wait_time_ms = SUM(wait_time_ms)
FROM sys.dm_os_wait_stats
WHERE wait_type <> 'WAITFOR';

WAITFOR DELAY '00:00:10';

SELECT SUM(wait_time_ms) - @start_wait_time_ms
FROM sys.dm_os_wait_stats
WHERE wait_type <> 'WAITFOR';

บางครั้งคณิตศาสตร์ก็ใช้งานได้ ครั้งสุดท้ายที่ฉันวิ่งเดลต้าคือ 101339 มิลลิวินาที กล่าวอีกนัยหนึ่งฉันรอมากกว่า 10 วินาทีต่อวินาทีเพียงจากงานระบบ

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