2010-07-23 38 views
5

Tôi đang thực hiện một số nghiên cứu trong mùa hè này và làm việc song song với mã đã tồn tại từ trước. Trọng tâm chính ngay bây giờ là một cách để cân bằng tải mã để nó sẽ chạy hiệu quả hơn trên cụm. Nhiệm vụ hiện tại là tạo ra một bằng chứng về khái niệm tạo ra một số quy trình với mỗi quy trình có sẵn ngăn xếp của riêng chúng và khi quá trình xử lý xong ngăn xếp, nó sẽ truy vấn hai quy trình gần nhất để xem liệu chúng có thêm công việc nào trong ngăn xếp của chúng hay không.Thực hiện Cân bằng tải Sử dụng Python

Tôi đang gặp khó khăn khi khái niệm hóa điều này trong python, nhưng hy vọng ai đó có thể chỉ cho tôi đúng hướng hoặc có một số ví dụ tương tự như mpi4py hoặc ParallelPython. Ngoài ra nếu có ai biết về một mô-đun tốt hơn hoặc dễ dàng hơn thì đó sẽ là điều tuyệt vời để biết.

Cảm ơn.

Trả lời

11

Đây là cách đơn giản để thực hiện việc này.

  1. Tạo một hàng đợi chung chung về công việc cần làm. Ứng dụng này sẽ điền vào hàng đợi này với công việc cần làm.

  2. Tạo ứng dụng nhận một mục từ hàng đợi và thực hiện công việc.

Đây là thiết kế đơn-sản xuất nhiều người tiêu dùng. Nó hoạt động tốt và có thể làm thay đổi máy tính của bạn bằng các quy trình song song.

Để sử dụng lớp xếp hàng được tích hợp sẵn, bạn cần phải xếp hàng đợi trong một số loại API đa xử lý . http://docs.python.org/library/queue.html. Cá nhân, tôi muốn tạo một máy chủ web dựa trên HTTP nhỏ xử lý hàng đợi. Mỗi ứng dụng thực hiện TẢI để tìm nạp tác phẩm tiếp theo.

Bạn có thể sử dụng các công cụ như RabbitMQ để tạo hàng đợi chia sẻ rất đẹp. http://nathanborror.com/posts/2009/may/20/working-django-and-rabbitmq/

Bạn có thể sử dụng http://hjb.python-hosting.com/ để tận dụng hàng đợi JMS.

Bạn sẽ cần một ứng dụng nhỏ để tạo và lấp đầy hàng đợi với công việc.

Tạo bao nhiêu bản sao của ứng dụng tùy thích. Ví dụ:

for i in 1 2 3 4 5 6 7 8 9 10 
do 
    python myapp.py & 
done 

Thao tác này sẽ chạy 10 bản sao đồng thời của đơn đăng ký của bạn. Tất cả 10 người đang cố gắng làm việc từ một hàng đợi duy nhất. Họ sẽ sử dụng tất cả các tài nguyên CPU có sẵn và hệ điều hành sẽ sắp xếp chúng một cách độc đáo cho bạn.


Đồng bộ hóa nút, nút với nút nghĩa là bạn có đường dẫn giao tiếp O (n * (n-1)/2) trong số tất cả các nút.

"Hai nút lân cận" có nghĩa là bạn vẫn có 2 * n đường dẫn truyền thông và công việc phải "bằng cách nào đó" nhỏ giọt giữa các nút. Nếu tất cả các nút ban đầu được gieo hạt với công việc, thì ai đó đã làm rất nhiều kế hoạch để cân bằng khối lượng công việc. Nếu bạn định thực hiện nhiều kế hoạch đó, tại sao yêu cầu các nút phải đồng bộ hóa?

Nếu hàng đợi không được cân bằng cẩn thận để bắt đầu với hơn mọi nút đều có thể chậm. Mỗi nút lẻ có thể nhanh.Các nút lẻ kết thúc trước, kiểm tra công việc từ hai nút ngay cả, và các nút đó là (a) không được thực hiện và (b) không có nhiều việc phải làm nữa. Gì bây giờ? Một nửa các nút đang hoạt động, một nửa không hoạt động. Tất cả đều do kế hoạch kém trong việc phân phối ban đầu của công việc.

Master-slave nghĩa là bạn có n đường dẫn truyền thông. Hơn nữa, cân bằng là tự động vì tất cả các nút nhàn rỗi có quyền truy cập bình đẳng để làm việc. Không có điều gì như phân phối ban đầu thiên vị dẫn đến hiệu suất tổng thể kém.

+0

Cảm ơn bạn, điều này cũng tương tự như các thiết kế hiện tại của chương trình, nhưng họ muốn có một nút để cấu trúc nút chứ không phải là một cấu trúc master-slave. Ngoài ra sẽ có một hàng đợi duy nhất được truy cập nhiều lần từ nhiều quy trình tạo ra một nút cổ chai có thể xảy ra trên một cụm? – patemotter

+0

@DistortedLojik: Hàng đợi đơn không phải là vấn đề, trừ khi mỗi gói công việc nhỏ gọn về mặt kỹ thuật. Đó là phí tổn tinh khiết, do đó bạn muốn chi phí truy cập hàng đợi được phân bổ trên rất nhiều công việc có giá trị cao. –

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