Làm thế nào có thể chờ thời gian cao hơn thời gian đồng hồ?


15

Khi tôi theo dõi chờ đợi với sp_BlitzFirst, tôi nhận được chi tiết này:

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


 -- ?>

Có nên đọc "trong 20 lần trong 5 giây qua không?" Tìm kiếm là CLR_SEMAPHORE.

Câu trả lời:


24

Không - thống kê chờ có thể (và thường xuyên hơn không, sẽ) tổng cộng nhiều hơn thời gian vật lý dành cho chính máy chủ.

Hãy tưởng tượng một tình huống trong đó 2 luồng riêng biệt dành cùng một giây chờ đợi một số tài nguyên - bạn sẽ có 2 giây thời gian chờ trong 1 giây thời gian.

Mỗi luồng có thời gian chờ riêng - thông báo cho bạn biết rằng 20 giây thời gian chờ cho tài nguyên cụ thể đó đã xảy ra trong 5 giây cuối cùng của thời gian.

Hoặc nói cách khác, mỗi lõi có thể chạy nhiều truy vấn cùng một lúc và nhiều lõi có thể tăng thêm nhiều lần chờ đợi hơn. Có nghĩa là, đơn vị thực sự là chủ đề · giây, không phải giây.


8

Nó cũng có thể hữu ích để làm việc thông qua một ví dụ. Hãy xem xét ba trạng thái phổ biến nhất cho một công nhân :

CHẠY = Công nhân hiện đang chạy hoặc không từ chối hoặc phòng ngừa.

RUNNABLE = Công nhân đã sẵn sàng để chạy trên lịch trình.

TẠM NGỪNG = Công nhân hiện đang bị đình chỉ, chờ đợi một sự kiện gửi tín hiệu.

Công nhân với trạng thái RUNNINGcó thể tạo ra thời gian chờ đợi. Ví dụ, nếu công nhân cần chạy mã trong HĐH thay vì trong SQLOS thì nó có thể phải chờ đợi trước hoặc chờ bên ngoài. Trong thời gian đó, nó sẽ chạy mã trên CPU được liên kết của nó nhưng nó vẫn sẽ tạo ra thời gian chờ.

Công nhân với trạng thái RUNNABLEcó thể tạo ra thời gian chờ đợi (theo như tôi biết họ luôn làm). Nếu công nhân được báo hiệu rằng tài nguyên đã có sẵn thì nó có thể tích lũy thời gian chờ tín hiệu dựa trên lần chờ cuối cùng. Nếu công nhân cạn kiệt lượng tử 4 ms trước đó thì nó có thể tích lũy SOS_SCHEDULER_YIELDthời gian chờ.

Công nhân với trạng thái SUSPENDEDcó thể tạo ra thời gian chờ đợi. Hãy xem xét một công nhân đang chờ khóa. Nó sẽ tạo ra thời gian chờ cho đến khi được báo hiệu rằng tài nguyên khóa mà nó cần có sẵn. Một số công nhân bị đình chỉ không tạo ra thời gian chờ đợi, bao gồm cả những người không liên quan đến một nhiệm vụ.

Máy tính để bàn của tôi có bốn lõi logic, vì vậy số lượng nhân viên tối đa mặc định là 512 . Điều đó gần như chắc chắn là không thực tế, nhưng trên máy này về mặt lý thuyết tôi có thể tạo ra 512 giây thời gian chờ mỗi giây nếu tôi quản lý để khiến mọi công nhân chờ đợi một cái gì đó cùng một lúc. Khi số lượng nhân viên / nhân viên tăng lên, con số đó có thể còn cao hơn nữa.

Bạn có thể thấy nhiều hơn một giây chờ đợi mỗi giây ngay cả khi bạn không chạy bất kỳ truy vấn nào đối với SQL Server. Trên máy của tôi, truy vấn sau đây dường như tạo ra giữa 9-14 hàng:

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;

Tôi có thể chụp nhanh tổng thời gian chờ kể từ lần cuối tôi khởi động lại máy chủ và so sánh nó với tổng số mới sau khi chờ mười giây:

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';

Đôi khi toán học hoạt động. Lần cuối cùng tôi chạy nó, đồng bằng là 101339 ms. Nói cách khác, tôi đã có hơn 10 giây chờ đợi mỗi giây chỉ từ các tác vụ hệ thống.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.