Sự tranh chấp spinlock trong khi phân bổ bộ nhớ không gian làm việc
Đây là nơi nó bắt đầu để có được niềm vui. Tôi đã mô tả rằng công việc sắp xếp và băm trong bộ nhớ không gian làm việc tiêu tốn CPU nhưng không được phản ánh trong các số tra cứu bpool.
Sự tranh giành Spinlock là một lớp khác cho niềm vui đặc biệt này. Khi bộ nhớ bị đánh cắp từ nhóm bộ đệm và được phân bổ để sử dụng cho cấp bộ nhớ truy vấn, quyền truy cập bộ nhớ được tuần tự hóa với một spinlock. Theo mặc định, điều này diễn ra với một tài nguyên được phân vùng ở cấp nút NUMA. Vì vậy, mọi truy vấn trên cùng một nút NUMA sử dụng bộ nhớ vùng làm việc có thể có khả năng gặp phải sự tranh chấp spinlock khi đánh cắp bộ nhớ chống lại các khoản trợ cấp. Rất quan trọng cần lưu ý: đây không phải là rủi ro tranh chấp "một lần cho mỗi truy vấn", vì sẽ xảy ra nếu thời điểm tranh chấp là tại thời điểm cấp thực tế. Thay vào đó, khi bộ nhớ bị đánh cắp so với cấp - do đó, một truy vấn có cấp bộ nhớ rất lớn sẽ có nhiều cơ hội để tranh chấp spinlock nếu nó sử dụng hầu hết các cấp của nó.
Trace flag 8048 thực hiện một công việc tuyệt vời để giải tỏa sự tranh chấp này bằng cách phân vùng tiếp theo tài nguyên ở cấp độ cốt lõi.
Microsoft cho biết "xem xét cờ theo dõi 8048 nếu 8 lõi trở lên trên mỗi ổ cắm". Nhưng ... thực sự không có bao nhiêu lõi trên mỗi ổ cắm (miễn là có nhiều lõi), mà là có bao nhiêu cơ hội để tranh chấp trong công việc được thực hiện trên một nút NUMA.
Trên các bộ xử lý AMD được dán (12 lõi cho mỗi ổ cắm, 2 nút NUMA trên mỗi ổ cắm) có 6 lõi cho mỗi nút NUMA. Tôi thấy một hệ thống có 4 trong số các CPU đó (vì vậy tám nút NUMA, mỗi lõi 6 lõi) đã bị kẹt trong đoàn xe spinlock cho đến khi cờ theo dõi 8048 được bật.
Tôi đã thấy sự tranh chấp spinlock này kéo xuống hiệu suất trên các máy ảo nhỏ tới 4 vCPU. Cờ Trace 8048 đã làm những gì nó được cho là khi được bật trên các hệ thống đó.
Xem xét rằng vẫn còn một số CPU được tối ưu hóa tần số 4 lõi ngoài kia, với khối lượng công việc phù hợp, họ cũng được hưởng lợi từ cờ theo dõi 8048.
CMEMTHREAD chờ đợi đi kèm với kiểu tranh chấp spinlock mà cờ theo dõi 8048 giải tỏa. Nhưng một lời cảnh báo: CMEMTHREAD chờ đợi là một triệu chứng chứng thực, không phải là nguyên nhân gốc rễ cho vấn đề đặc biệt này. Tôi đã thấy các hệ thống có CMEMTHREAD cao "bắt đầu chờ" trong đó cờ theo dõi 8048 và / hoặc 9024 bị trì hoãn triển khai vì thời gian chờ CMEMTHREAD tích lũy khá thấp. Với spinlocks, thời gian chờ tích lũy thường là điều sai lầm khi xem xét. Thay vào đó, bạn muốn xem xét thời gian CPU bị lãng phí - được thể hiện chủ yếu bằng chính các spin, thứ hai là các chờ đợi liên quan đại diện cho các chuyển đổi ngữ cảnh có thể không cần thiết.