Tại sao tôi có THREADPOOL đang đợi mặc dù tôi có chủ đề?

Aug 16 2020

Chúng tôi đang thấy thời gian hết hạn nộp đơn và với sự trợ giúp của Bộ công cụ phản hồi đầu tiên, tôi đã nắm bắt được thông tin chi tiết. Một trong những điều thu hút sự chú ý của tôi là:

Đã phát hiện chờ chất độc: Nhóm chuỗi

Vì vậy, tôi đã chạy các truy vấn dưới đây:

---get thread pool waits---thread pool wait query
SELECT count(*) FROM sys.dm_os_waiting_tasks 
 where wait_type ='threadpool'

-- get threads available--Threads available query
 declare @max int
select @max = max_workers_count from sys.dm_os_sys_info

select 
    @max as 'TotalThreads',
    sum(active_Workers_count) as 'CurrentThreads',
    @max - sum(active_Workers_count) as 'AvailableThreads',
    sum(runnable_tasks_count) as 'WorkersWaitingForCpu',
    sum(work_queue_count) as 'RequestWaitingForThreads' ,
    sum(current_workers_count) as 'AssociatedWorkers',
    Getdate() as 'DateLogged'
from  
    sys.dm_os_Schedulers where status='VISIBLE ONLINE'

Khi tôi chạy truy vấn "nhóm luồng chờ", các lần chờ nhóm luồng sẽ xuất hiện trong kết quả trên (đôi khi, hơn 20 kết quả) trong phần giây và sau đó biến mất khi tôi chạy lại. Nhưng tôi có thể thấy hơn 400 luồng có sẵn trong tập hợp kết quả thứ hai thông qua truy vấn "luồng có sẵn".

Tôi không thể hiểu lý do tại sao tôi thấy THREADPOOLchờ đợi khi tôi chạy truy vấn đầu tiên, nhưng truy vấn thứ hai cho thấy các chuỗi vẫn có sẵn. Bất kỳ ai có thể vui lòng giải thích?

  • Maxdop: 8
  • Mức độ song song tối đa: 50

Nhóm chủ đề đang chờ:

Trả lời

4 JoshDarnell Aug 27 2020 at 21:38

Tôi không thể hiểu tại sao tôi thấy THREADPOOL đang đợi khi tôi chạy truy vấn đầu tiên, nhưng truy vấn thứ hai cho thấy các chuỗi vẫn có sẵn. Bất kỳ ai có thể vui lòng giải thích?

Tôi đã quan sát thấy rằng bạn có thể thấy rất nhiều lần THREADPOOLchờ thực sự ngắn (mỗi phần một vài mili giây) trong khi SQL Server đang lấy các luồng từ hệ điều hành.

Điều này có thể xảy ra nếu chẳng hạn, SQL Server không hoạt động trong một thời gian và sau đó một số truy vấn song song được thực thi cùng một lúc. Các truy vấn này sẽ cần phải đợi trong khi Hệ điều hành cung cấp các luồng cho quá trình sqlservr.exe, tích lũy các lần THREADPOOLchờ trong thời gian đó.

Bạn có thể xác nhận điều này đang xảy ra bằng cách xem bộ đếm PerfMon "Process" -> "Thread Count". Nói chung, bất cứ khi nào giá trị này tăng nhanh, bạn có thể thấy những khoảng thời gian THREADPOOLchờ đợi này .

Có một bản trình diễn hoàn chỉnh về hành vi này trên blog của tôi ( Chờ đợi THREADPOOL Bất thường ), đây là bản tóm tắt:

Quay lại liên kết tài liệu đó:

Xảy ra khi một tác vụ đang đợi một nhân viên thực hiện.

Trong trường hợp điển hình, điều này là do chúng tôi đã đạt đến giới hạn logic mà SQL Server đã đặt cho số lượng nhân công mà bạn có thể có tại một thời điểm.

Trong trường hợp bất thường, tác vụ đang đợi một nhân viên vì SQL Server đang cấp phát luồng (yêu cầu nó từ Hệ điều hành) cần để hỗ trợ nhân viên đó.

Nói rõ hơn, tôi sẽ rất ngạc nhiên nếu những sự chờ đợi này là nguyên nhân khiến ứng dụng của bạn hết thời gian chờ.