Cần hiểu lỗi thực thi truy vấn song song


18

Hôm nay chúng tôi đã trải qua một sự suy giảm hiệu suất trên máy chủ sql sản xuất của chúng tôi. Trong thời gian này, chúng tôi đã ghi lại một số "The query processor could not start the necessary thread resources for parallel query execution"lỗi. Việc đọc mà tôi đã thực hiện cho thấy rằng điều này có liên quan đến việc sử dụng bao nhiêu CPU khi thực hiện một truy vấn phức tạp. Tuy nhiên khi tôi kiểm tra trong thời gian mất điện của chúng tôi CPU Utilization was only at 7%. Có điều gì khác mà điều này có thể được đề cập quá mà tôi chưa đi qua? Đây có phải là thủ phạm có thể làm suy giảm hiệu suất hoặc tôi đang đuổi theo một con cá trích đỏ?

Các giá trị sp_cool của tôi cho điều này là như sau:

name                                minimum maximum config_value run_value
cost threshold for parallelism      0       32767   5            5

Giá trị của max degree of parallelismcấu hình là bao nhiêu và hiện tại bạn có bao nhiêu bộ xử lý trên máy chủ cùng với cấu hình NUMA? Bạn có thể sử dụng coreinfo.exetừ sysiternals để tìm ra số lượng bộ xử lý và cấu hình NUMA.
Kin Shah

Mức độ song song tối đa được đặt thành 0
Lumpy

Điều đó giải thích tại sao máy chủ sql sẽ chết đói vì tài nguyên luồng.
Kin Shah

@Kin Tôi có 12 bộ xử lý (0 - 11) bộ xử lý sau đó hai bộ xử lý logic vào bản đồ NUMA Node: các mục Node 0, Node 1
Lumpy

@Kin Tôi nghĩ rằng 0 cho rằng SQL Server quản lý có bao nhiêu luồng nên sử dụng. Tại sao điều này sẽ dẫn đến việc bỏ đói SQL Server cho tài nguyên luồng?
sần

Câu trả lời:


19

Vài tháng trước, tôi đã gặp phải tình huống tương tự trong đó cài đặt MAXDOP là mặc định và một truy vấn bỏ chạy đã làm cạn kiệt tất cả các luồng công nhân.

Như Remus đã chỉ ra điều này được gọi là chết đói luồng công nhân .

Sẽ có một kết xuất bộ nhớ được tạo trên máy chủ của bạn khi điều kiện này xảy ra.

Nếu bạn đang ở trên 2008R2 + SP1 trở lên thì sys.dm_server_memory_dumpsbạn cũng sẽ cung cấp cho bạn vị trí tệp kết xuất.

Bây giờ trở lại vấn đề:

Có 1 luồng trình giám sát lịch trình trên mỗi nút NUMA và vì bạn có 2 nút NUMA, sẽ có 2 luồng trình giám sát lịch trình chịu trách nhiệm kiểm tra sức khỏe của tất cả các trình lập lịch cứ sau 60 giây cho nút NUMA cụ thể đó trong khi đảm bảo rằng trình lập lịch bị kẹt hoặc không phải.

Mỗi khi một yêu cầu công việc mới được kéo từ hàng đợi công nhân lập lịch, bộ đếm quy trình làm việc được tăng lên. Vì vậy, nếu bộ lập lịch có yêu cầu công việc được xếp hàng và không xử lý một trong các yêu cầu công việc trong 60 giây thì bộ lập lịch được xem là bị kẹt.

Do truy vấn bỏ trốn hoặc song song rộng rãi, sẽ xuất hiện tình trạng các luồng công nhân bắt đầu cạn kiệt vì tất cả các luồng bị chiếm bởi truy vấn chạy đơn đó hoặc chặn quá mức kéo dài và không thể thực hiện được công việc nào trừ khi quá trình vi phạm bị giết.

Đặt cược tốt nhất của bạn là trước tiên điều chỉnh cài đặt Mức độ song song tối đa của bạn . Mặc định về 0 phương tiện SQL Server có thể sử dụng tất cả các CPU có sẵn để xử lý song song và ở đó bằng cách làm cạn kiệt tất cả các luồng công nhân.

Có nhiều lý do có thể dẫn đến cạn kiệt các luồng công nhân:

  • Các chuỗi chặn dài mở rộng khiến SQL Server hết luồng công nhân
  • Song song mở rộng cũng dẫn đến cạn kiệt các luồng công nhân
  • Chờ đợi rộng rãi cho bất kỳ loại "khóa" - spinlocks, chốt. Một spinlock mồ côi là một ví dụ.

Tham khảo câu trả lời của tôi ở đây sẽ cho bạn thấy cách bạn có thể tính giá trị MAXDOP cho phiên bản máy chủ của mình.

Ngoài ra, rất khuyến khích bạn bắt đầu thu thập thông tin thống kê Chờ về trường hợp máy chủ cơ sở dữ liệu của bạn.


Có bất cứ điều gì có thể là dấu hiệu của một truy vấn awway không? Bất cứ điều gì tôi có thể sử dụng để cố gắng xác định các truy vấn có nguy cơ này?
sần

Đề nghị bạn xem thông tin thống kê chờ đợi để tìm ra nơi đau . Ngoài ra, hãy xem sys.dm_os_schedulers-> current_t Nhiệm_count, runnable_t Nhiệm_count, current_workers_count và active_workers_count cũng như sys.dm_os_wait_statssys.dm_os_waiting_tasks
Kin Shah

10

Có thể có một vài lý do. Nhiều khả năng là bạn đã nghỉ việc. Xem max_worker_threads. Điều kiện này được gọi là "căng thẳng công nhân". Các công nhân có thể bị đánh cắp bởi bất kỳ một trong nhiều phương tiện (không có phương tiện nào dẫn đến việc sử dụng CPU cao, btw), như có nhiều yêu cầu bị chặn hoặc thực hiện những điều ngu ngốc trong CLR (ví dụ: yêu cầu HTTP).

Triệu chứng bạn thấy là nạn nhân của vấn đề, không phải nguyên nhân. Chúng tôi không thể đề xuất một giải pháp mà không biết nguyên nhân. Bạn cần thu thập các quầy hoàn hảo, DMV và kiểm tra ERRORLOG để biết thêm thông tin.


chủ đề công nhân tối đa Min = 128, max = 32767, config = 0, run = 0
Lumpy

2
@Lumpy Đó là cấu hình tối đa của bạn, nhưng đó không phải là gần công nhân tối đa thực tế. Chúng tôi sẽ cần biết máy của bạn có bao nhiêu bộ xử lý để tính toán.
Thomas Stringer
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.