2009-09-08 25 views
11

Tôi đang phát triển một máy chủ trong C#. Máy chủ này sẽ hoạt động như một máy chủ dữ liệu cho một dịch vụ sao lưu: một khách hàng sẽ gửi dữ liệu, nhiều dữ liệu, liên tục, cụ thể sẽ gửi các tệp dữ liệu, tối đa năm, trong cùng một kênh tcp. Tôi sẽ gửi dữ liệu đến máy chủ chậm, tôi không muốn giết băng thông của khách hàng, vì vậy tôi không cần phải tăng tốc độ gửi dữ liệu tối đa và vì lý do này, tôi có thể sử dụng một kênh tcp duy nhất cho mọi thứ.Socket.BeginĐánh giá hiệu suất trên Mono

Nói điều này, trên thực tế máy chủ sử dụng phương pháp BeginReceive để lấy dữ liệu từ máy khách và trên cửa sổ, điều này có nghĩa là IOCP. Câu hỏi của tôi là: cách BeginReceive sẽ thực hiện trên linux/freebsd trough mono? Trên cửa sổ, tôi đã đọc rất nhiều thứ, sẽ thực hiện rất tốt nhưng phần mềm này, phần máy chủ, sẽ chạy trên linux hoặc freebsd máng mono và tôi không biết làm thế nào các phương pháp này được thực hiện trên đó!

Thêm, để cố gắng giảm phân bổ tiếp tục của đối tượng Async State cho phương thức Receive (Bắt đầu | Kết thúc) i mantain cho kết nối tcp và gọi lại BeginReceive, tôi sao chép dữ liệu trước khi sử dụng lại (tự nhiên i don ' t rõ ràng dữ liệu trong vì tôi biết có bao nhiêu đọc giá trị trả về của EndReceive). Bộ đệm được thiết lập trên 8kb vì vậy tôi sẽ ở bản sao tối đa ra 8kb dữ liệu, nó không nên giết resoruces.

Mục tiêu của tôi là nhận tối đa 400/500 kết nối ở mức tối đa. Nó không phải là quá nhiều, nhưng máy chủ (máy), trong khi chờ đợi, sẽ xử lý các tập tin máng một hệ thống tập tin riêng (được phát triển bằng cách sử dụng cầu chì đầu tiên trong C# và sau đó trong C) trên LVM + Linux Software Raid Mirror và kiểm tra chống vi-rút bằng clamav phần mềm phải nhẹ nhất có thể!

EDIT: Tôi quên nói rằng máy sẽ là (có thể) Intel Core 2 Duo 2.66+ GHz (3 MB L2 - FSB 1066 MHz) với 2 GB ram và SO sử dụng 64 bit.

Mono có sử dụng epoll (libevent) hoặc kqueue (trên freebsd) không? Và tôi nên làm một cái gì đó cụ thể để cố gắng tối đa hóa buổi biểu diễn? Tôi có thể làm gì đó hơn để không giết tài nguyên nhận gói dữ liệu không?

+1

Chào mừng đến với cộng đồng! – JoshJordan

Trả lời

2

Tôi biết đó là một chút trễ, nhưng tôi chỉ tìm thấy câu hỏi này ...

Mono là khả năng xử lý số lượng kết nối mà bạn cần và nhiều hơn nữa. Tôi thường xuyên kiểm tra xsp2 (máy chủ độc lập Mono ASP.NET) với hơn 1k kết nối đồng thời .. Nếu đây là tình huống tải cao, bạn nên chơi một chút với thiết lập MONO_THREADS_PER_CPU cho đến khi bạn tìm đúng số lượng chủ đề cho ThreadPool .

Trên Linux, Mono sử dụng epoll khi khả dụng (luôn là những ngày này).

+0

Câu trả lời không bao giờ muộn :) Thực sự cảm ơn! –

+0

Khi nào nó sử dụng epoll_ctl?Tôi đã grep'ed thông qua toàn bộ codebase của mono và chỉ có định nghĩa của nó trong mã mono.posix –

+1

@AndriusBentkus đó là trong thời gian chạy, không phải là thư viện lớp học: https://github.com/mono/ mono/blob/master/mono/siêu dữ liệu/tpool-epoll.c – Gonzalo

1

Tôi không thể nói cụ thể về hiệu suất của một chức năng đó trên đơn âm, nhưng nhìn chung mono hoạt động rất tốt trong những ngày này. 4-500 kết nối là như bạn nói, không phải rất nhiều, vì vậy tôi nghi ngờ bạn có bất kỳ vấn đề.

Nói rằng, sẽ không khó để thiết lập một thử nghiệm cho loại điều này. Tôi nghĩ rằng đó có lẽ là cách duy nhất bạn sẽ nhận được một câu trả lời kết luận cho tình hình của bạn.

+1

Cảm ơn đề xuất của bạn! Tôi đã viết một phần mềm ứng dụng đơn giản có khả năng thiết lập một tập hợp các kết nối trong khi gửi dữ liệu, nó thực sự đơn giản. Kiểm tra máy chủ của tôi trên các cửa sổ với 3000 kết nối đồng thời cho thấy máy chủ của tôi sẽ xử lý khoảng 250 kết nối, nhưng tôi nghĩ rằng điều này phụ thuộc vào máy khách của tôi (máy chạy phần mềm ứng suất) bởi vì là một 2 centz centrino cũ với 1gb bộ nhớ (= chỉ có thể thực hiện một luồng tại thời điểm). Tôi cần thực hiện một số bản sửa lỗi, nhưng chiều nay tôi sẽ thử công cụ này trên máy kiểm tra Linux của mình! –