2010-10-13 10 views
13

Tengo una aplicación (aplicación de servidor) que necesita una gran cantidad de registros implementados y no debe verse demasiado afectada por el rendimiento al permitir el registro.registro multiproceso para aplicaciones de alto rendimiento

La aplicación tiene un grupo de subprocesos de subprocesos de trabajo que realizan el trabajo. Originalmente iba a iniciar sesión en estos subprocesos del grupo de subprocesos, pero luego tendría que bloquear prácticamente todo el hilo y así aparece mi aplicación 'multiproceso'.

He estado buscando mejores formas de iniciar sesión desde varios subprocesos y he descubierto que usar una cola o un buffer en anillo podría ser una idea.

¿Alguien puede sugerir (tal vez por experiencia) alguna buena forma de implementar el registro efectivo (a un archivo en su mayoría) para una aplicación multiproceso que también debería mantenerse un tanto eficaz?

Me gustaría utilizar la biblioteca Boost Logging.

+2

Puede valer la pena señalar lo obvio: que tan pronto como empiece a realizar el registro asincrónico, también corre el riesgo de perder las últimas entradas de registro si su aplicación falla. Dado que la aplicación se reanuda inmediatamente después de * iniciar * el registro, no tiene garantía de que todos los mensajes de registro se hayan escrito en el disco en un momento dado. – jalf

+0

@jalf: ¿qué sugieres que haga entonces? –

+0

No hay pista. Depende de tu necesidad Un mecanismo de registro asincrónico aún puede ser la mejor manera de hacerlo en su caso, solo estoy señalando una advertencia importante que debe tener en cuenta. Por supuesto, una posible alternativa podría ser escribir los datos de registro en un medio más rápido que un disco duro (¿Un disco SSD? ¿Una conexión de red rápida?), Por lo que no bloquea la aplicación host durante milisegundos preciosos como lo haría una escritura en disco duro. – jalf

Respuesta

6

Pantheios es la biblioteca de registro más rápida para C++, hasta donde yo sé. Recomiendo usarlo en lugar de Boost Logging. Con Pantheios, simplemente inicie sesión en el archivo y no le importa qué hilo. Puede poner el nombre del hilo en el prefijo logline si lo desea y lo hace todo por usted.

+0

¡No necesariamente el más rápido! ¿Alguna fuente de donde obtuviste esta información? – DumbCoder

+0

http://www.pantheios.org/performance.html –

+0

¡Vea la parte de la conclusión también, tienen una especie de exención de responsabilidad agradable! – DumbCoder

3

Personalmente me gustaría ver Pantheios, lo eché un vistazo y parece interesante, voy a incluir eso en un futuro proyecto mío.

Si realmente desea usar el registro de refuerzo, usaría una cola sincronizada que maneja todos los bloqueos internos para que sus trabajadores no tengan que preocuparse por eso.

pseudocódigo:

class SynchedQueue { 
     void write(text) { lock() logfile.write(text) unlock() } 

O si realmente quiere que sea rápido, utilizar una cola y la transferencia interna de la cola pública en lotes de líneas X a la vez. La cola pública no tiene que esperar el archivo E/S que podría tomar un tiempo relativamente largo y la cola privada solo recibe líneas raramente. Aunque probablemente aún sea más lento que Pantheios.

+0

+1 "lotes de líneas X a la vez" – n611x007

2

Apache log4cxx. He visto bastantes lugares donde se usa extensivamente. Y la mayoría de ellos eran aplicaciones comerciales, multihilo y de baja latencia. log4cxx no es inferior a ninguna biblioteca de registro y está disponible para C++ y Java (Apache log4j), estos 2 he usado.

+1

¿Quién votó en contra y por qué? – DumbCoder

+1

log4cxx tiene pérdidas de memoria –

+0

@m_pGladiator - ¿De dónde? Cualquier enlace o experiencia personal? – DumbCoder

0

No estoy familiarizado con la biblioteca Boost Logging, por lo que no puedo comentar sobre eso.

NLog admite el registro desde C/C++ y COM (así como desde aplicaciones .NET administradas). No estoy seguro si tiene las características de rendimiento que busca o no.

También podrías tener en cuenta ETW. Es un sistema de registro de alta velocidad implementado en el kernel de Windows.No lo he usado pero parece que Microsoft lo está presionando un poco más y lo hace un poco más fácil de usar con cada lanzamiento. Ciertamente, hacen que sea más fácil de usar desde el código administrado. Tal como está ahora, me parece un poco complicado configurarlo y luego obtener la salida. Nunca llegué al punto en que consideré seriamente la implementación de ETW, por lo que realmente no puedo comentar lo fácil o difícil que realmente es.

+0

ETW es excelente, registrar un evento sin oyentes es prácticamente gratuito, pero incluso con los oyentes, encontré que un solo evento de registro estaba muy por debajo de un microsegundo. Sin embargo, tenga cuidado con el costo de crear los valores de la traza, es decir, el uso de ToString aleatorio o de reflexión implícita podría deshacer la aceleración de la velocidad – galaktor

2

Estoy usando y realmente me gusta Petru Marginean's logging system. Es realmente ligero rápido y limpio. Me tomó un tiempo entenderlo para poder adaptarlo a mi gusto, pero una vez que lo entiendes, es una belleza y como toda la biblioteca solo es realmente un archivo de cabecera de 250 líneas, no es mucho para obtener mediante.

Lo más lento es que usa un objeto con un ostringstream, pero dudo que encuentre algo más rápido. Al menos no sin ser más C que C++.

En su second article and version muestra cómo lo hizo seguro de subprocesos.

Si no puede encontrar el código fuente, hágamelo saber, lo tengo. Recuerdo que tuve que buscarlo un poco.

+0

mente compartir el código fuente de Petru conmigo? simplemente no pude encontrarlo. – athos

+1

@athos Por lo que puedo ver, el artículo original todavía tiene enlaces al código, para la segunda versión este es el [enlace] (http://twimgs.com/ddj/images/article/2009/code/logcpp2 .cremallera) – nus

Cuestiones relacionadas