Производительность Socket.BeginReceive на моно

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

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

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

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

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

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

Ответ 1

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

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

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

Ответ 2

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

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