2012-02-20 27 views
8

Tôi chỉ bị ướt chân vì đa xử lý (và hoàn toàn tuyệt vời!), Nhưng tôi đã tự hỏi liệu có bất kỳ hướng dẫn nào để chọn số lượng quy trình không? Nó chỉ dựa trên số lõi trên máy chủ? Là nó bằng cách nào đó dựa trên các ứng dụng của bạn đang chạy (số vòng, bao nhiêu CPU nó sử dụng, vv)? v.v ... làm cách nào để quyết định có bao nhiêu tiến trình sinh sản? Ngay bây giờ, tôi chỉ đoán và thêm/gỡ bỏ quy trình nhưng nó sẽ là tuyệt vời nếu có một số loại hướng dẫn hoặc thực hành tốt nhất.Có bất kỳ hướng dẫn nào để thực hiện khi chọn số lượng quy trình với đa xử lý không?

Một câu hỏi khác, tôi biết điều gì sẽ xảy ra nếu tôi thêm quá ít (chương trình bị hủy) nhưng nếu tôi thêm 'quá nhiều' thì sao?

Cảm ơn!

Trả lời

9

Nếu tất cả các chủ đề/quy trình của bạn thực sự là CPU bị ràng buộc, bạn nên chạy nhiều quá trình như CPU ​​báo cáo lõi. Do HyperThreading, mỗi lõi CPU vật lý có thể trình bày nhiều lõi ảo. Gọi số multiprocessing.cpu_count để lấy số lõi ảo.

Nếu chỉ p trong số 1 chủ đề của bạn là CPU bị ràng buộc, bạn có thể điều chỉnh số đó bằng cách nhân với p. Ví dụ: nếu một nửa quy trình của bạn là CPU bị ràng buộc (p = 0.5) và bạn có hai CPU với 4 lõi mỗi và 2x Siêu phân luồng, bạn nên bắt đầu quá trình 0.5 * 2 * 4 * 2 = 8.

Nếu bạn có quá ít quá trình, ứng dụng của bạn sẽ chạy chậm hơn mong đợi. Nếu ứng dụng của bạn có quy mô hoàn hảo và chỉ bị ràng buộc CPU (tức là nhanh gấp 10 lần khi được thực hiện gấp 10 lần số lượng lõi), điều này có nghĩa là tốc độ của bạn chậm hơn. Ví dụ: nếu hệ thống của bạn gọi 8 quy trình, nhưng bạn chỉ bắt đầu 4, bạn sẽ chỉ sử dụng một nửa dung lượng xử lý và mất gấp đôi thời gian. Lưu ý rằng trong thực tế, không có quy mô ứng dụng nào hoàn hảo, nhưng một số ứng dụng (theo dõi tia, mã hóa video) khá gần.

Nếu bạn có quá nhiều quy trình, phí đồng bộ hóa sẽ tăng lên. Nếu chương trình của bạn có ít hoặc không có phí đồng bộ hóa, điều này sẽ không ảnh hưởng đến thời gian chạy tổng thể, nhưng có thể làm cho các chương trình khác xuất hiện chậm hơn chúng trừ khi bạn đặt các quy trình của mình thành mức ưu tiên thấp hơn. Số lượng quá trình xử lý quá mức (giả sử là 10000) là hợp lý nếu hệ điều hành của bạn có trình lên lịch tốt. Trong thực tế, hầu như bất kỳ đồng bộ hóa nào cũng sẽ khiến cho chi phí không thể chịu nổi.

Nếu bạn không chắc chắn liệu ứng dụng của bạn có bị ràng buộc CPU và/hoặc mở rộng quy mô hoàn toàn hay không, chỉ cần quan sát tải hệ thống với số lượng chuỗi khác nhau. Bạn muốn tải hệ thống xuống dưới 100%, hoặc chính xác hơn uptime là số lõi ảo.

+0

Cảm ơn câu trả lời tuyệt vời. Không biết tất cả điều đó. Điều gì sẽ xảy ra nếu có một số phần không bị ràng buộc trong CPU trong ứng dụng. Ví dụ, rất nhiều tính toán cpu, nhưng sau đó kết quả cuối cùng được lưu vào tập tin hoặc cơ sở dữ liệu. Điều đó có nghĩa là tôi nên tạo ra nhiều quy trình hơn vì một số phải đợi mạng cuối cùng (cơ sở dữ liệu) hoặc ghi đĩa (ghi tệp)? – Lostsoul

+0

@Lostsoul Nói chung, có nếu chia sẻ hoạt động ràng buộc đĩa là quan trọng. Nếu bạn đang viết một tập tin tóm tắt ngắn (nói, hình ảnh sau khi chiếu một cảnh phức tạp), hiệu ứng này là không đáng kể.Nếu ứng dụng của bạn đọc và ghi nhiều dữ liệu, bạn thực sự cần tăng số lượng quy trình. Đã cập nhật câu trả lời bằng một đoạn: Nếu bạn không chắc chắn, hãy thử nó! – phihag

+2

Chỉ cần thêm vào phần quan sát: bạn rõ ràng là muốn tránh việc sử dụng CPU ngày càng tăng vì chi phí đồng bộ hóa. Vì vậy, khi thực hiện thử nghiệm, bạn nên đo cả tải hệ thống và thông lượng ứng dụng của bạn. – millimoose

1

Nó chắc chắn dựa trên những gì ứng dụng thực hiện. Nếu đó là CPU nặng, số lượng lõi là một điểm khởi đầu lành mạnh. Nếu đó là IO-nặng, quá trình mulitple sẽ không giúp hiệu suất anyway. Nếu nó chủ yếu là CPU với IO thỉnh thoảng (ví dụ: tối ưu hóa PNG), bạn có thể chạy một vài quy trình nhiều hơn số lõi.

Cách duy nhất để biết chắc chắn là chạy ứng dụng của bạn với một số đầu vào thực tế và kiểm tra việc sử dụng tài nguyên. Nếu bạn có thời gian CPU để rảnh, hãy thêm nhiều quy trình công nhân hơn.

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