2010-05-18 37 views
6

Tôi đang cố triển khai một ứng dụng thời gian thực liên quan đến IPC qua các mô-đun khác nhau. Các mô-đun đang thực hiện một số xử lý dữ liệu chuyên sâu. Tôi đang sử dụng hàng đợi tin nhắn như là xương sống (Activemq) cho IPC trong nguyên mẫu, đó là dễ dàng (xem xét tôi là một newbie IPC hoàn toàn), nhưng nó rất rất chậm.Tốc độ IPC và so sánh

Đây là tình hình của tôi:

  • Chúng tôi đã tách phần IPC để tôi có thể thay đổi nó theo những cách khác trong tương lai.
  • Tôi có 3 tuần để triển khai phiên bản nhanh hơn. ;-(
  • IPC cần được nhanh chóng, nhưng cũng tương đối dễ dàng để nhận

Tôi đã được nhìn vào cách tiếp cận khác nhau IPC:. Ổ cắm, đường ống, bộ nhớ chia sẻ Tuy nhiên, tôi không có kinh nghiệm trong IPC, và có chắc chắn là không có cách nào tôi có thể thất bại demo này trong 3 tuần ... những IPC sẽ là cách an toàn để bắt đầu với

Cảm ơn. ?

Lily

Trả lời

4

Been đối mặt với một câu hỏi tương tự bản thân mình.

tôi có tìm thấy các trang sau hữu ích - IPC performance: Named Pipe vs Socket (đặc biệt) và Sockets vs named pipes for local IPC on Windows?. Có vẻ như sự đồng thuận là bộ nhớ chia sẻ là cách để đi nếu bạn đang thực sự quan tâm đến hiệu suất, nhưng nếu hệ thống hiện tại bạn có hàng đợi tin nhắn, đó có thể là cấu trúc khác ... . Một ổ cắm và/hoặc tên có ống có thể dễ thực hiện hơn và nếu đáp ứng thông số kỹ thuật của bạn thì bạn đã hoàn tất.

3

Trên Windows, bạn có thể sử dụng WM_COPYDATA, một loại IPC dựa trên bộ nhớ chia sẻ đặc biệt. Đây là một kỹ thuật cũ nhưng đơn giản: "Process A" gửi một thông báo, chứa một con trỏ tới một số dữ liệu trong bộ nhớ của nó và chờ cho đến khi "Process B" xử lý (xin lỗi) thông báo, ví dụ: tạo một bản sao dữ liệu cục bộ. Phương pháp này là khá nhanh và hoạt động trên Windows 8 Developer Preview, quá (xem benchmark) của tôi. Bất kỳ loại dữ liệu nào cũng có thể được vận chuyển theo cách này, bằng cách tuần tự hóa nó trên người gửi và deserializing nó ở phía bên nhận. Nó cũng đơn giản để thực hiện hàng đợi tin nhắn người gửi và người nhận, để làm cho giao tiếp không đồng bộ.

+0

theo điểm chuẩn của bạn, tôi chỉ tự hỏi, tại sao win7 lại có hiệu suất kém như vậy. – stanleyxu2005

+1

vì đó là một netbook có CPU Atom đơn lõi tương đối chậm, – kol

3

Bạn có thể kiểm tra bài viết trên blog này https://publicwork.wordpress.com/2016/07/17/endurox-vs-zeromq/

Về cơ bản nó so sánh Enduro/X, được xây dựng trên POSIX hàng đợi (hàng đợi kernel IPC) so với ZeroMQ, có thể cung cấp các thông điệp đồng thời trên lớp vận chuyển khác nhau, bao gồm. tcp:// (ổ cắm mạng), ipc://, inproc://, pgm://epgm:// cho phát đa hướng.

Từ biểu đồ, bạn có thể thấy rằng tại một số điểm có gói dữ liệu lớn hơn Enduro/X chạy trên hàng đợi thắng trên ổ cắm.

Cả hai hệ thống đều chạy tốt với ~ 400 000 thư mỗi giây, nhưng với thông báo 5KB, hàng đợi hạt nhân đang chạy tốt hơn.

Source: https://publicwork.wordpress.com/2016/07/17/endurox-vs-zeromq/

(nguồn ảnh: https://publicwork.wordpress.com/2016/07/17/endurox-vs-zeromq/)


UPDATE: Một bản cập nhật như câu trả lời cho rống lên bình luận, tôi đã thử nghiệm chạy lại để chạy ZeroMQ trên ipc:// quá, xem ảnh:

Source: https://publicwork.wordpress.com/2016/07/17/endurox-vs-zeromq/

Như chúng ta thấy ZeroMQ ipc:// là tốt hơn, nhưng một lần nữa trong một số phạm vi Enduro/X cho thấy kết quả tốt hơn và sau đó một lần nữa ZeroMQ mất hơn.

Vì vậy, tôi có thể nói rằng lựa chọn IPC phụ thuộc vào công việc bạn định làm.

Lưu ý rằng ZeroMQ IPC chạy trên đường ống POSIX. Trong khi Enduro/x chạy trên hàng đợi POSIX.

+1

Hãy để tôi hỏi, bạn có chú ý không, ** thử nghiệm/so sánh được trích dẫn ** là ** không sử dụng ** ZeroMQ trên cùng một lớp truyền tải (cố gắng so sánh ** 'tcp: //' ** đến ** 'ipc: //' **)? Bạn có thể ** cung cấp kết quả so sánh táo-to-apple hợp lý ** ở đâu ** cả ** Enduro/X và ZeroMQ sử dụng ** 'IPC' ** không? – user3666197

+1

Xem ở trên, tôi đã kiểm tra lại với ipc: // –

+0

+1 để được chăm sóc. Enduro/X hoạt động như thế nào trong các trường hợp BLOB đang được xử lý trong hệ thống phân tán với nhiều lớp vận chuyển hỗn hợp - 'tcp: //' (cho SIG phân cụm) + 'inproc: //' (cho độ trễ nhanh nhất/thấp nhất trong quá trình truyền tin nhắn) + 'epgm: //' (để phát nội dung cuối cùng)? Làm thế nào để mở rộng hiệu suất hoạt động - một khi thêm 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024 đồng nghiệp theo một số lượng nhất định các luồng I/O (động cơ '.Context()' có thể hoạt động trên)? – user3666197

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