2009-09-08 9 views
11

Estoy desarrollando un servidor en C#. Este servidor actuará como un servidor de datos para un servicio de respaldo: un cliente enviará datos, una gran cantidad de datos, de manera continua, específicamente enviará fragmentos de datos, hasta cinco, en el mismo canal tcp. Enviaré datos al servidor lentamente, no quiero matar el ancho de banda del cliente, así que no necesitaba acelerar en el envío máximo de datos y, por esta razón, puedo usar un solo canal tcp para todo.Socket.BeginReceive Performance en Mono

Dicho esto, en realidad el servidor utiliza el método BeginReceive para adquirir datos del cliente y, en Windows, esto significa IOCP. Mi pregunta es: ¿cómo funcionará BeginReceive en Linux/FreeBSD a través de mono? En Windows, he leído muchas cosas, funcionará muy bien, pero este software, la parte del servidor, se ejecutará en linux o freebsd a través de mono y no sé cómo se implementan estos métodos en él.

Más, para intentar reducir las asignaciones continuas de un objeto de estado Async para el método de recepción (Begin | End) mantengo uno para la conexión tcp y en la devolución de llamada BeginReceive copio datos antes de reutilizarlo (naturalmente no lo hago t borrar datos porque sé cuánto leyó a través del valor de retorno de EndReceive). El búfer está configurado en 8kb así que voy a copiar al máximo 8kb de datos, no debería matar a los resoruces.

Mi objetivo es obtener hasta 400/500 conexiones a un máx. No es tanto, pero el servidor (máquina), mientras tanto, manejará los archivos a través de un sistema de archivos propio (desarrollado usando fusibles primero en C# y luego en C) en LVM + Linux Software Raid Mirror y antivirus usando clamav para ¡el software debe ser liviano como pueda!

EDIT: Olvidé decir que la máquina será (probablemente) un Intel Core 2 Duo 2.66+ GHz (3 MB L2 - FSB 1066 MHz) con 2 GB de RAM y SO utilizando 64 bits.

¿Está mono usando epoll (libevent) o kqueue (en freebsd)? ¿Y debería hacer algo específico para intentar maximizar las actuaciones? ¿Puedo hacer algo más para no eliminar los recursos que reciben los paquetes de datos?

+1

¡Bienvenido a la comunidad! – JoshJordan

Respuesta

2

sé que es un poco tarde, pero sólo encontraron esta pregunta ...

Mono es capaz de manejar el número de conexiones que necesita y mucho más. Pruebo regularmente xsp2 (el servidor autónomo Mono ASP.NET) con más de 1k conexiones simultáneas. Si esto va a ser una situación de carga alta, debe jugar un poco con la configuración de MONO_THREADS_PER_CPU hasta que encuentre el número correcto de hilos para el ThreadPool. .

En Linux, Mono usa epoll cuando está disponible (lo cual es siempre en estos días).

+0

Las respuestas nunca son tardías :) ¡Realmente gracias! –

+0

¿Cuándo usa epoll_ctl?He grep'ed a través de toda la base de código de mono y solo hay una definición de esto en el código de mono.posix –

+1

@AndriusBentkus está en tiempo de ejecución, no en las bibliotecas de clase: https://github.com/mono/ mono/blob/master/mono/metadata/tpool-epoll.c – Gonzalo

1

No puedo hablar específicamente sobre el rendimiento de esa función en mono, pero en general mono funciona muy bien en estos días. 4-500 conexiones es como dices, no muchas, así que dudo que tengas problemas.

Al decir eso, no debería ser muy difícil establecer una prueba para este tipo de cosas. Creo que esa es probablemente la única forma en que obtendrás una respuesta concluyente para tu situación.

+1

¡Gracias por su sugerencia! Escribí un software de estrés simple que es capaz de configurar un conjunto de conexiones mientras envía datos, es realmente simple. Probar mi servidor en Windows con 3000 conexiones simultáneas mostró que mi servidor manejaría alrededor de 250 conexiones, pero creo que esto depende de mi máquina cliente (la que ejecuta el software de estrés) porque es una vieja centrgh 2ghz con 1 gb de memoria (= it puede ejecutar solo un hilo a la vez). Necesito hacer algunas correcciones, ¡pero esta tarde probaré esto en mi máquina de prueba de Linux! –