2009-09-08 2 views
11

Я занимаюсь разработкой сервера на C#. Этот сервер будет выступать в качестве сервера данных для службы резервного копирования: клиент будет отправлять данные, много данных, непрерывно, в частности, будет отправлять кусок данных объемом до пяти в одном и том же канале tcp. Я пошлю данные на сервер медленно, я не хочу убивать пропускную способность пользователя, поэтому мне не нужно было ускоряться при максимальной отправке данных, и по этой причине я могу использовать один канал tcp для всего.Socket.BeginReceive Performance on Mono

Сказано, что на самом деле сервер использует метод BeginReceive для получения данных от клиента, а в окнах это означает IOCP. Мои вопросы: как BeginReceive будет работать на linux/freebsd через моно? На окнах я читал много всего, будет очень хорошо работать, но это программное обеспечение, часть сервера, будет работать на Linux или FreeBSD через моно, и я не знаю, как эти методы реализованы на нем!

Подробнее, чтобы попытаться уменьшить распределение ресурсов объекта Async State для метода приема (Начало), я могу использовать один для подключения tcp и в обратном вызове BeginReceive. Я копирую данные перед повторным использованием (естественно, t очистить данные, потому что я знаю, сколько считывает значение возвращаемого значения EndReceive). Буфер установлен на 8kb, поэтому я буду при максимальной копии 8kb данных, он не должен убивать резорбции.

Моя цель - добраться до 400/500 соединений при макс. Это не так много, но сервер (машина), тем временем, будет обрабатывать файлы через собственную файловую систему (разработанную с использованием плавкого предохранителя сначала на C#, а затем на C) на LVM + Linux Software Raid Mirror и проверку антивируса с помощью clamav, так что программное обеспечение должно быть легким, как может!

EDIT: Я забыл сказать, что машина будет (возможно) Intel Core 2 Duo 2,66+ ГГц (3 МБ L2 - FSB 1066 МГц) с 2 ГБ оперативной памяти и SO с использованием 64 бит.

Моно использование epoll (libevent) или kqueue (on freebsd)? И я должен сделать что-то конкретное, чтобы попытаться максимизировать выступления? Могу ли я сделать что-то еще, чтобы не убивать ресурсы, получающие пакеты данных?

+1

Добро пожаловать в сообщество! – JoshJordan

ответ

2

Я знаю, что это немного поздно, но я только что нашел этот вопрос ...

Mono способен обрабатывать количество соединений, которые вам нужно и многое другое. Я регулярно тестирую xsp2 (автономный сервер Mono ASP.NET) с более чем 1k одновременными подключениями. Если это будет ситуация с высокой нагрузкой, вы должны немного поиграть с настройкой MONO_THREADS_PER_CPU, пока не найдете нужное количество потоков для ThreadPool ,

В linux Mono использует epoll при наличии (что всегда в наши дни).

+0

Ответы никогда не задерживаются :) Очень благодарен! –

+0

Когда используется epoll_ctl?Я grep'ed через всю кодовую базу mono, и есть только определение ее в коде mono.posix –

+1

@AndriusBentkus это во время выполнения, а не в библиотеках классов: https://github.com/mono/ моно/блоб/ведущий/моно/метаданные/tpool-epoll.c – Gonzalo

1

Я не могу говорить конкретно о выполнении этой функции на моно, но в целом моно работает очень хорошо в эти дни. 4-500 соединений, как вы говорите, не очень много, поэтому я сомневаюсь, что у вас возникнут проблемы.

Говоря это, не должно быть очень сложно установить тест для такого рода вещей. Я думаю, что это, вероятно, единственный способ получить окончательный ответ на вашу ситуацию.

+1

Благодарим за предложение! Я написал простое программное обеспечение для стресса, которое позволяет настраивать набор соединений при отправке данных, это очень просто. Тестирование моего сервера в окнах с 3000 одновременными подключениями показало, что мой сервер будет обрабатывать около 250 подключений, но я думаю, что это зависит от моей клиентской машины (той, которая работает со стрессом), потому что это старое centrino 2ghz с 1 гб памяти (= it может выполнять только один поток во время). Мне нужно сделать некоторые исправления, но сегодня днем ​​я попробую этот материал на моей тестовой машине linux! –