2009-12-24 24 views
6

Có bất kỳ lợi ích nào để hạn chế số lượng các chuỗi đồng thời thực hiện một tác vụ nhất định bằng số lượng bộ vi xử lý trên hệ thống máy chủ không? Hoặc tốt hơn để chỉ đơn giản là tin tưởng các thư viện như ThreadPool của NET để làm điều đúng ... ngay cả khi có 25 chủ đề đồng thời khác nhau xảy ra tại bất kỳ thời điểm nào?Hạn chế chủ đề đồng thời bằng số bộ xử lý?

Trả lời

8

Hầu hết các chủ đề không phải là CPU bị ràng buộc, chúng kết thúc chờ đợi trên IO hoặc các sự kiện khác. Nếu bạn nhìn vào hệ thống của bạn bây giờ, tôi tưởng tượng bạn có 100 của (nếu không phải là 1000) của chủ đề thực hiện không có vấn đề. Bằng cách đó, bạn có lẽ tốt nhất chỉ cần rời khỏi nhóm thread .NET để làm điều đúng! Tuy nhiên, nếu tất cả các chủ đề đều là CPU bị ràng buộc (ví dụ như dò tia) thì sẽ là một ý tưởng tốt để hạn chế số lượng chủ đề cho số lõi, nếu không có khả năng chuyển ngữ cảnh sẽ bắt đầu làm giảm hiệu suất .

1

Vâng, nếu nút cổ chai của bạn CHỈ là bộ vi xử lý, thì điều đó có thể có ý nghĩa, nhưng điều đó sẽ bỏ qua tất cả bộ nhớ và các tắc nghẽn khác, và rất ít bộ nhớ cache của bạn đang ném lỗi trang và các sự kiện khác sẽ chậm các chủ đề.

Tôi tự tin vào thư viện. Chủ đề chờ đợi tất cả mọi thứ, và bạn không muốn ứng dụng của bạn chậm lại vì nó không thể sinh ra một luồng mới, mặc dù hầu hết phần còn lại chỉ đang ngủ, chờ đợi một số sự kiện hoặc tài nguyên.

3

Chủ đề đã thực hiện tốt công việc này. Nó cố gắng giới hạn số lượng các luồng đang chạy tới số lõi CPU trong máy của bạn. Khi một luồng kết thúc, nó ngay lập tức lên lịch một luồng khác đủ điều kiện để thực thi.

Mỗi 0,5 giây, nó sẽ đánh giá những gì đang diễn ra với các chuỗi đang chạy. Khi các luồng đã chạy quá lâu, nó giả định chúng bị trì hoãn và cho phép một luồng khác bắt đầu thực hiện. Bây giờ bạn sẽ có nhiều chuỗi chạy hơn bạn có lõi CPU. Điều này có thể đi tới số lượng tối đa cho phép luồng, như được thiết lập bởi ThreadPool.SetMaxThreads().

Bắt đầu từ khoảng .NET 2.0 SP1, số chuỗi tối đa mặc định được tăng lên đáng kể gấp 250 lần số lõi. Bạn không bao giờ nên đến đó. Nếu bạn làm thế, bạn sẽ lãng phí khoảng 2 phút thời gian mà một số lượng có thể không tối ưu của các chủ đề đang chạy. Tuy nhiên, những chủ đề đó sẽ phải chặn lâu, không chính xác là một mẫu thực thi điển hình cho một luồng. Mặt khác, nếu các chủ đề này đang chờ đợi trên cùng một loại tài nguyên, chúng có khả năng chỉ thay phiên nhau, thêm nhiều luồng không thể cải thiện thông lượng.

Ngắn câu chuyện, nhóm luồng sẽ hoạt động tốt nếu bạn chạy các chuỗi thực thi nhanh (nhiều nhất là vài giây) và không chặn trong một thời gian dài. Bạn có thể nên xem xét việc tạo các đối tượng Thread của riêng bạn khi mã của bạn không khớp với mẫu đó.

1

Đo lường ứng dụng của bạn theo nhiều chuỗi: tỷ lệ bộ xử lý. Hãy đến với kết luận dựa trên dữ liệu khó về ứng dụng của bạn. Không chấp nhận đối số từ nguyên tắc đầu tiên về hiệu suất mà bạn nên nhận được, chỉ những gì bạn làm mới có vấn đề.

Các vấn đề liên quan