2010-05-06 11 views
7

TickZoom è un'app ad alte prestazioni che utilizza la propria libreria di parallelizzazione e più thread O/S per l'utilizzo uniforme dei computer multi-core.Scrittura su un file log4net FileAppender con più problemi di prestazioni dei thread

L'app ha un collo di bottiglia in cui gli utenti devono scrivere informazioni su LogAppender da thread O/S separati.

FileAppender utilizza la funzionalità MinimalLock in modo che ogni thread possa bloccare e scrivere sul file e quindi rilasciarlo per il thread successivo da scrivere.

Se MinimalLock viene disabilitato, log4net segnala errori sul file che è già stato bloccato da un altro processo (thread).

Un modo migliore per fare log4net è quello di avere un singolo thread che si occupa di scrivere su FileAppender e qualsiasi altro thread aggiunge semplicemente i loro messaggi a una coda.

In questo modo, MinimalLock potrebbe essere disabilitato per migliorare notevolmente le prestazioni della registrazione.

Inoltre, l'applicazione fa un sacco di lavoro intensivo della CPU, quindi migliorerà anche le prestazioni per utilizzare un thread separato per scrivere sul file, in modo che la CPU non aspetti mai l'I/O per il completamento.

Quindi la domanda è: log4net offre già questa funzione? In tal caso, come si abilita la scrittura in thread su un file? C'è un altro appender più avanzato, forse?

In caso contrario, poiché log4net è già incluso nella piattaforma, è possibile implementare un thread e una coda separati per questo scopo nel codice TickZoom.

Cordiali saluti, Wayne

EDIT:

Grazie a quanto pare le risposte indicano sviluppare la nostra soluzione come forse un'estensione log4net in qualche modo. E mostrano chiaramente che log4net non fa questo tipo di cose.

Inoltre, abbiamo appena realizzato che potremmo "abusare" del sistema di registrazione che è principalmente inteso per messaggi leggibili dall'uomo per la notifica di eventi importanti o informazioni di debug. Questa particolare parte dell'output del software viene utilizzata solo per strumenti automatici che verificano l'accuratezza del sistema.

Naturalmente, utilizziamo anche log4net nei modi "normali" per il debug, gli avvisi e così via.

Ma questi sono più simili ai "registri delle transazioni" di quelli di debug o di notifica degli utenti. Più specificamente, non è necessario che questi registri siano direttamente leggibili dall'uomo. Se necessario un "visualizzatore" di qualche tipo può mostrare il contenuto in forma ASCII.

Quindi pianificheremo di fare in modo che questi log del tipo di transazione vengano scritti su una memoria binaria ad alta velocità.

Grazie, sembra che entrambe le risposte di seguito siano state grandi spinte per lo sviluppo della nostra soluzione.

risposta

7

Log4net non supporta lo scenario esatto che si descrive. Offre tuttavia altre appendici che non si bloccano, come l'appender del database o l'appender UDP.Qui ci sono un paio di idee:

  1. Log vostri messaggi a una coda di messaggi , e poi hanno un lettore (o diversi lettori) leggere i messaggi fuori coda e scriverli in un registro. Fornisce un meccanismo affidabile per inviare/scrivere messaggi. Per essere onesti Non so se c'è già un appender MSMQ , ma scriverlo da solo non sarebbe troppo difficile.

  2. Utilizzare l'appender UDP per inviare messaggi e poi scrivere il proprio servizio che ascolta queste messaggi e li scrive in un file.

penso che si può rilevare un tema qui ... praticamente utilizzare uno dei appenders non di blocco (o lascia la tua) e implementare il proprio servizio che riceve i messaggi dai appenders e li scrive in un file .

+0

Grazie per aver chiarito che non è possibile in log4net e dare il nudge verso una soluzione interna. – Wayne

1

È preferibile evitare l'aggiunta di qualsiasi I/O ai thread di destinazione, quindi inviare un messaggio al thread di raccolta dei log è una buona idea. A volte utilizzo anche System :: Diagnostics :: Debug :: WriteLine dal thread di destinazione per eseguire il dump del suo output, ma in ogni caso ci sarà comunque un piccolo blocco.

Naturalmente l'aggiunta di qualsiasi registrazione aggiuntiva porterà a effetti "Heisenberg", quindi devi sapere in qualche modo quando questi effetti sono trascurabili e quando non lo sono, al fine di avere una registrazione utile dei tuoi thread ad alte prestazioni.

Se si desidera avere un po 'di fantasia, è possibile fare in modo che ogni thread salvi il proprio elenco di messaggi, quindi eseguire il dump fuori da qualche parte dopo così tante iterazioni. Quindi i dati sarebbero utili solo nel periodo di tempo prima che qualsiasi thread eseguisse l'I/O di registrazione, ma forse potresti acquisire abbastanza informazioni per il tuo debug. Inoltre, si ottiene il compito divertente di raccogliere i singoli log di thread in un singolo log per l'analisi.

3

Scopri il logger di The Object Guy per un registratore sicuro multi-thread ad alte prestazioni con capacità di registrazione asincrona e molte altre funzioni - molto carino, credo - http://www.theobjectguy.com/DotNetLog/. Guarda il video multi-thread su questa pagina.

Problemi correlati