2012-08-17 29 views
5

Tôi hiện đang làm việc trên một ứng dụng thử nghiệm trong nhà để tạo nhiều loại tải trên máy tính để chúng tôi có thể xem phần mềm hoạt động như thế nào dưới tải. Tôi đang treo lên trên một yêu cầu, trong đó tôi làm cho một số loại cách để xác định một phần trăm sử dụng CPU (nói, 40%) trước khi người dùng chạy chương trình, và hy vọng sẽ giữ cho CPU trong một phạm vi + - 10% của những gì họ đưa vào. Tôi đã nói rằng họ đã thấy các chương trình làm điều đó trước đây, nhưng mỗi một mà tôi đã thấy rằng tuyên bố làm như vậy đã không làm việc. Tôi đang cố gắng để đọc một mức sử dụng trung bình và ngủ thread chạy để sử dụng CPU làm giảm, nhưng tôi đã tìm thấy đó là không chính xác. Nó cũng sẽ được sử dụng trên nhiều máy chủ, mỗi máy chủ với các CPU khác nhau, vì vậy tôi không thể làm rất nhiều mã hóa cứng vì nó sẽ cần phải làm việc trên mỗi máy chủ. Cá nhân tôi không nghĩ rằng nó có thể làm chính xác, nhưng tôi yêu cầu ở đây như một nỗ lực mương cuối cùng để xem nếu có ai khác đã đi qua phần mềm tương tự như thế này, và biết làm thế nào nó sẽ được viết.C# Giữ CPU ở/gần mức sử dụng phần trăm được chỉ định cho mục đích thử nghiệm

Chỉnh sửa: Tôi đã cố gắng sử dụng chuỗi có mức độ ưu tiên thấp hơn và cũng được thông báo rằng sẽ không hữu ích cho họ (mặc dù tôi đã tạo tùy chọn chỉ nhằm mục đích thử nghiệm trước khi yêu cầu này).

+0

Tôi không biết bất kỳ cách nào để giới hạn lượng CPU bạn có thể tiêu thụ, đó là nhiệm vụ của HĐH, xác định lịch biểu; ngoài việc giới hạn số lõi mà nó có thể sử dụng. Những gì bạn có thể làm là thay đổi ưu tiên của quy trình, tôi cũng sẽ đề cập đến việc ngủ nó, nhưng bạn đã lưu ý rằng đó là một giải pháp không hoàn hảo. –

Trả lời

3

Chúng tôi đã làm điều tương tự trong khi điều chỉnh lại máy chủ ứng dụng. Chúng tôi thấy rằng thông lượng tổng thể của chúng tôi là tốt nhất khi CPU khoảng 70%. Giải pháp của chúng tôi là xoay các luồng bổ sung, với độ trễ giữa mỗi luồng cho đến khi đạt được tải mong muốn. Nếu CPU đã vượt quá 80%, chúng tôi đã giảm số lượng các luồng đang chạy (báo hiệu một luồng để hoàn thành công việc hiện tại của nó và sau đó chấm dứt). Nếu CPU giảm xuống dưới 60%, chúng tôi đã kích hoạt một chuỗi mới.

Bạn có thể áp dụng logic tương tự để tạo tải nhân tạo mà bạn có thể điều chỉnh để sử dụng CPU mục tiêu. Chủ đề của bạn sẽ cần phải cân bằng CPU và không CPU (IO, hoặc chỉ ngủ) để cho phép tinh chỉnh. Nếu các chủ đề của bạn rất chuyên sâu về CPU, mỗi luồng sẽ tiêu thụ 1 lõi CPU tới khoảng 100%.

+0

Nếu bạn không nhớ tôi hỏi, chủ đề của bạn trông như thế nào? Hiện tại tôi chỉ có một phép cộng và trừ liên tục trong một vòng lặp vô hạn, và nó tự ăn toàn bộ lõi (mặc dù cái máy tôi đang làm lúc này không mạnh lắm) – wgallon

+0

@BillyGallon, CPU vô hạn vòng lặp liên kết sẽ ăn 100% lõi trên bất kỳ máy nào (trừ khi hệ điều hành lập lịch biểu sẽ không lên lịch chuỗi đó do ưu tiên hoặc các giới hạn khác như đề xuất của usr) –

+0

Các chủ đề trong trường hợp của chúng tôi đã thực hiện công việc trong thế giới thực, chọn dữ liệu từ một bảng DB và sau đó thực hiện các phép tính trên đó. Tôi nghi ngờ rằng các cuộc gọi xen kẽ Thread.Sleep (ngủ cho các khoảng thời gian ngẫu nhiên nhưng khá ngắn) với các tính toán chuyên sâu của CPU sẽ cho phép bạn tạo một chuỗi trung bình sử dụng CPU khiêm tốn để bạn có khả năng kiểm soát tổng thể được tạo bởi một số luồng . –

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