2011-03-09 39 views
7

Tôi đã chơi đùa với luồng, cố gắng đẩy một số giới hạn đến mức cực đoan - vì sự thích thú của riêng tôi. Tôi biết các threadpool mặc định là 25 chủ đề và có thể được đẩy lên đến 1000 (theo MSDN). Điều gì mặc dù, là giới hạn thực tế của các chủ đề cho mỗi lõi CPU? Tại một số điểm, bối cảnh chuyển đổi sẽ gây ra nhiều hơn một nút cổ chai hơn luồng tiết kiệm. Có ai có bất kỳ thực hành tốt nhất bao gồm điều này? Chúng ta đang nói 100, 200, 500? Liệu nó phụ thuộc vào những gì các chủ đề đang làm gì? Điều gì quyết định, khác với kiến ​​trúc khung chính tả bao nhiêu chủ đề hoạt động tối ưu cho mỗi lõi CPU?Giới hạn chủ đề thực tế cho mỗi CPU là bao nhiêu?

+7

http://stackoverflow.com/questions/1718465/optimal-number-of-threads-per-core - điều này có thể trả lời một số truy vấn trong khi bạn chờ câu trả lời ở đây :) – dotalchemy

+0

@dotalchemy - cảm ơn, thông tin giai thoại thường là khá hữu ích; Có một số hiểu biết tốt ở đó. Sẽ rất thú vị nếu xem có ai nêu ra thông tin liên quan đến các phương pháp hay nhất hay không. – BobTheBuilder

+0

42. Tất nhiên ... –

Trả lời

8

Tất cả phụ thuộc vào những gì các chủ đề đang làm, tất nhiên. Nếu họ là CPU-ràng buộc (nói ngồi chặt chẽ trong một vòng lặp vô hạn) sau đó một sợi cho mỗi lõi sẽ là đủ để bão hòa CPU; nhiều hơn thế (và bạn sẽ có nhiều hơn, từ các quá trình nền, v.v) và bạn sẽ bắt đầu tranh luận. Mặt khác, nếu các chủ đề không đủ điều kiện để chạy (ví dụ như bị chặn trên một số đối tượng đồng bộ hóa), thì giới hạn số lượng bạn có thể được quyết định bởi các yếu tố khác ngoài CPU (bộ nhớ cho ngăn xếp, Giới hạn nội bộ của hệ điều hành, v.v.)

7

Nếu ứng dụng của bạn không bị ràng buộc CPU (như phần lớn), thì công tắc ngữ cảnh không phải là vấn đề lớn bởi vì mỗi lần ứng dụng của bạn phải đợi, cần chuyển ngữ cảnh. Vấn đề có quá nhiều luồng là về cấu trúc dữ liệu OS và một số dị thường đồng bộ hóa như đói, nơi mà một luồng không bao giờ (hoặc rất hiếm khi) có cơ hội thực thi do ngẫu nhiên các thuật toán đồng bộ hóa.

Nếu ứng dụng của bạn là CPU bị ràng buộc (vẫn còn 99% thời gian làm việc trên bộ nhớ, rất hiếm khi I/O hoặc chờ một thứ khác như đầu vào của người dùng hoặc chuỗi khác), thì tối ưu sẽ là 1 luồng cho mỗi lõi logic , bởi vì trong trường hợp này sẽ không có chuyển đổi ngữ cảnh.

Hãy coi chừng rằng hệ điều hành ngắt chuỗi mỗi lần, ngay cả khi chỉ có một luồng cho nhiều CPU. Hệ điều hành không chỉ chuyển đổi các chủ đề, mà còn cho các mục đích quản lý luồng (như cập nhật các bộ đếm để hiển thị trên Trình quản lý tác vụ hoặc để cho phép một siêu người dùng loại bỏ nó).

+0

Giả sử bạn đang thực hiện dòng công việc kinh doanh thông thường, như nhận dữ liệu ổ cắm và truyền ở tốc độ cao vào cơ sở dữ liệu của một số mô tả - vì SQL Server đối số. Về mặt lý thuyết, .NET sẽ không xử lý I/O theo đúng nghĩa - nó có thể bán SqlBulkCopy thành SQL Server. – BobTheBuilder

+0

Chỉ bằng cách chạy hệ điều hành, đã có rất nhiều chủ đề nổi xung quanh. Vì vậy, một sợi cho mỗi lõi là tối ưu có, nhưng nó chỉ không bao giờ xảy ra trong thực tế. Tôi không biết điểm là gì để biết số lượng luồng tối ưu cho mỗi lõi .... ứng dụng của bạn không phải là ứng dụng duy nhất chạy. –

+2

@Joel Gauvreau Gọi nó là sự tò mò. Đó không phải là lý do tại sao chúng tôi kết thúc trong công việc này ngay từ đầu. Khát khao kiến ​​thức và hiểu biết ... vì vậy câu trả lời của tôi cho "điểm cần biết là gì?" là "chỉ cần biết." – BobTheBuilder

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