2010-05-06 15 views
7

TickZoom es una aplicación de muy alto rendimiento que usa su propia biblioteca de paralelización y múltiples subprocesos O/S para una utilización sin problemas de las computadoras multi-core.Escribiendo a log4net FileAppender con problemas de rendimiento de múltiples hilos

La aplicación golpea un cuello de botella donde los usuarios necesitan escribir información en un LogAppender desde hilos de O/S separados.

FileAppender utiliza la función MinimalLock para que cada subproceso se pueda bloquear y escribir en el archivo y luego soltarlo para que el siguiente subproceso escriba.

Si MinimalLock se deshabilita, log4net informa errores sobre el archivo que ya está bloqueado por otro proceso (subproceso).

Una mejor forma para que log4net haga esto sería tener un solo hilo que se encargue de escribir en FileAppender y cualquier otro hilo simplemente agrega sus mensajes a una cola.

De esta forma, MinimalLock podría desactivarse para mejorar en gran medida el rendimiento del registro.

Además, la aplicación hace un montón de trabajo intensivo de CPU, por lo que también mejorará el rendimiento al utilizar una secuencia separada para escribir en el archivo para que la CPU nunca espere en la E/S para completar.

Entonces, la pregunta es, ¿log4net ya ofrece esta característica? Si es así, ¿cómo habilita la escritura enhebrada en un archivo? ¿Hay otro appender más avanzado, tal vez?

De lo contrario, dado que log4net ya está envuelto en la plataforma, eso posibilita implementar un hilo y cola separados para este propósito en el código TickZoom.

Sinceramente, Wayne

EDIT:

Gracias Parece que la respuestas apuntan a desarrollar nuestra propia solución como tal vez una extensión de Log4net de alguna manera. Y muestran claramente que log4net no hace este tipo de cosas.

Además, nos dimos cuenta de que podríamos estar "abusando" del sistema de registro, que está principalmente destinado a mensajes legibles por humanos para notificar eventos importantes o información de depuración. Esta parte particular de la salida de software solo se usa realmente para herramientas automatizadas que verifican la precisión del sistema.

Por supuesto, también usamos log4net en las formas "normales" para la eliminación de errores, advertencias, y tal.

Pero estos son más como "registros de transacciones" que los registros de depuración o notificaciones de usuario. Más específicamente, no es necesario que estos registros sean directamente legibles por humanos. Si es necesario, un "espectador" de algún tipo puede mostrar el contenido en forma ASCII.

Por lo tanto, haremos planes para que este registro de tipo transacción se escriba en un almacenamiento binario de alta velocidad.

Gracias parece que las dos respuestas a continuación fueron grandes empujones hacia el desarrollo de nuestra propia solución.

Respuesta

7

Log4net no es compatible con el escenario exacto que describe. Sin embargo, ofrece otros appenders que no se bloquean, como el appender de base de datos o el appender UDP.Aquí hay un par de ideas:

  1. sus mensajes de registro a un mensaje cola, y luego tener un lector (o varios lectores ) leer mensajes fuera la cola y escribirlos en un registro. Esto proporciona un mecanismo confiable para enviar/escribir mensajes. Para ser honesto No sé si ya hay un appender MSMQ , pero escribirlo no sería demasiado difícil.

  2. Utilice la appender UDP para enviar mensajes y luego escribir su propio servicio que escucha estas mensajes y los graba en un archivo.

Creo que se puede detectar un tema aquí ... básicamente utilizar uno de los appenders sin bloqueo (o escribir su propia) y poner en marcha su propio servicio que recibe los mensajes de los appenders y los graba en un archivo .

+0

Gracias por aclarar no es posible en log4net y dando el empujón a una solución interna. – Wayne

1

Es bastante deseable evitar agregar E/S a los hilos de sus destinos, por lo que enviar un mensaje al hilo del recopilador de registros es una buena idea. También a veces uso System :: Diagnostics :: Debug :: WriteLine del subproceso objetivo para volcar su salida, pero de todos modos habrá un pequeño bloqueo dentro.

Por supuesto, agregar cualquier registro adicional conducirá a los efectos de "Heisenberg", por lo que debe saber de alguna manera cuándo estos efectos son insignificantes y cuándo no, para tener un registro útil de sus hilos de alto rendimiento.

Si quieres ser un poco más elegante, puedes hacer que cada hilo guarde su propia lista de mensajes, y luego colocarla en algún lugar después de tantas iteraciones. Por lo tanto, los datos solo serían útiles en el período de tiempo antes de que cualquier subproceso haga su entrada/salida de registro, pero tal vez podría capturar suficiente información para su depuración. Además, obtiene la divertida tarea de recopilar los registros de hilos individuales en un solo registro para su análisis.

3

Echa un vistazo al registrador de The Object Guy para un registrador seguro de múltiples hilos y alto rendimiento con capacidad para el registro asincrónico, así como muchas otras características, bastante agradable, creo - http://www.theobjectguy.com/DotNetLog/. Vea el video de subprocesos múltiples en esta página.

Cuestiones relacionadas