AntecedentesAlto Rendimiento Desarrollo
Hemos estado trabajando muy duro para tratar de encontrar soluciones para una aplicación de "alto rendimiento". La aplicación es básicamente un administrador de memoria de alto rendimiento, con una sincronización en el disco. Las "lecturas" y "escrituras" son tremendamente altas, alrededor de 3000 transacciones por segundo. Tratamos de hacer todo lo posible en la memoria, pero eventualmente los datos se vuelven obsoletos y deben ser enjuagados en el disco, y aquí es donde se produce un gran "cuello de botella". La aplicación tiene varios subprocesos, con aproximadamente 50 subprocesos. No hay ninguna IPC (comunicaciones entre procesos)
intentos
inicialmente Escribimos esto en Java, y funcionó bastante bien, hasta una cierta carga, fue golpeado el cuello de botella y simplemente no podía Mantenga. Luego lo probamos en C# y se alcanzó el mismo cuello de botella. Probamos esto con código no administrado (C#), y aunque en las pruebas iniciales fue deslumbrantemente rápido usando MMF (archivos de mapas de memoria), en producción, la lectura fue lenta (están usando Vistas). Intentamos con CouchBase, pero tropezamos con problemas relacionados con la alta utilización de la red. ¡Esta podría ser una mala configuración de nuestra parte!
Historia: En nuestro intento de Java (no MMF), nuestro hilo con la cola de la información que necesita para obtener vuelca en disco se basa en la medida de no poder seguir el ritmo "escritura" en el disco. En nuestro método de archivo de mapa de memoria C#, el problema es que las LECTURAS son muy lentas y las ESCRITURAS funcionan perfectamente. Por alguna razón, ¡las vistas son lentas!
Pregunta
Entonces la pregunta es, situaciones en las que la intención de transferir grandes cantidades de datos; ¿Puede alguien ayudarme con un posible enfoque o diseño arquitectónico que pueda ayudar? Sé que esto parece un poco amplio, pero creo que la naturaleza específica del alto rendimiento y el alto rendimiento deberían reducir las respuestas.
¿Alguien puede responder por el uso de Couchbase, MongoDB o Cassandra en ese nivel? Se apreciarían otras ideas o soluciones .
No estoy seguro, pero creo que la escritura de datos en otro hilo en el disco cuando cuando ciertos alcanzado el límite (pero no enorme número, por ejemplo, una cuarta parte de lo que eres usar ahora) mientras sigue leyendo datos puede ayudar. Entonces puedes liberar este recuerdo y comenzar a escribir otros. Realmente no sé la respuesta, solo creo que puede ayudar –
No estoy seguro de si se ajusta a su problema de transferencia de datos, pero se mostró un diseño de software en un documento de la Universidad de California. "SEDA: una arquitectura para servicios de Internet bien acondicionados y escalables". ACM ISBN 1-58113-389-8-1/01/10. Habla acerca de cómo obtener un alto rendimiento en un sistema de subprocesos múltiples/-gestados. –
Adil, gracias, estamos haciendo eso. Coding.mof revisará el documento, muy apreciado. –