2014-02-20 12 views
8

Ich habe eine Anwendung (C# .Net 3.5 und. NET 2.0), die mehrere Readfile-Operationen durchführt. Das System zeigt jedoch immer wieder hickups (Jitter). Ich habe VTune Profiler angeschlossen und führte eine Sperren & wartet Analyse, siehe das erste Bild unten.(Lesen) Datei E/A-Jitter

Die Analyse der Sperren und Wartezeiten zeigte, dass ein "Sync-Objekt: Stream-Dateipfad" dazu führt, dass die Anwendung auf allen Threads gesperrt (wartet) wird. Die CPU-Auslastung sinkt während dieser Zeit auf 0%.

Als nächstes verwendete ich SysInternals Process Monitor, um zu protokollieren, welche Operation ausgeführt wurde, als die hickups auftraten. Es zeigt einen FileRead-Vorgang an, der ca. 1 Sekunde, aber nur gelegentlich (Jitter). Siehe das zweite Bild.

enter image description here Ein-Klick-große Version des Bildes: here

File I/O jitter Einzelklick große Version des Bildes: here

Ich bin verwirrt. Was könnte diesen Jitter in File I/O verursachen? Es ist ein synchrones Lesen. Ich habe versucht, den Lesepuffer von 32.768b auf 4096b zu reduzieren, aber das hat nichts geändert. Vielleicht ist es wichtig zu beachten, dass die Maschine, die diese Zahlen sammelt, eine SSD hat. Auf Maschinen ohne SSDs sehen wir ähnliche Probleme.

Alle Leads in denen zu suchen wäre willkommen.

+3

Sind Sie sicher, ist IO, nicht verarbeiten? Die GC-Sammlung würde dem Muster entsprechen. Nicht sicher, ob VTune es anzeigen kann, aber [WPA] (http://msdn.microsoft.com/en-us/library/windows/hardware/hh448170.aspx) kann die tatsächliche Ausführungszeit von IO im Gegensatz zur Zeit für das Blockieren von Apps anzeigen. –

+0

Ich dachte das Gleiche, ich habe einen internen Garbarge Profiler verwendet, der keine sichtbaren Leads zeigte (keine GC2 Collections, welche die teuren sind). Dennoch bin ich mir immer noch nicht ganz sicher, ob GC vollständig verworfen werden kann, da es für mich schwierig ist, die GC2-Sammlungen mit den anderen Profiler-Protokollen zu vernetzen. Danke für die WPA, lass mich sehen ob ich sowas mit VTune reproduzieren kann. – bastijn

+1

Fällt die CPU-Auslastung über das Board oder nur in den überwachten Threads auf Null? Wenn es wirklich Null ist, ist es wahrscheinlich nicht der GC (es blockiert alle verwalteten Threads, aber es verursacht idealerweise 100% CPU-Auslastung während dieser Zeit). Wenn es bis auf einen Thread null ist, ist es ein bisschen ein Hinweis auf GC als Täter. Und Sie irren sich, GC0 kann genau so langsam sein wie GC2, das hängt von Ihren Speichernutzungsmustern ab. – Luaan

Antwort

2

Diese Frage muss aktualisiert werden. Ich werde dies in Form einer Antwort veröffentlichen, da ich das Problem gelöst habe, aber nicht so, dass ich mit Sicherheit sagen kann, was das ursprüngliche Problem war.

Ich habe eine Menge Dinge ausprobiert, um herauszufinden, was die gelegentliche Spitze der IO Lese (Datei) Dauer verursacht hat. Vor allem Virenscanner sind wichtig, insbesondere McAfee verursachte einige Probleme. Die Kommentare zu der Frage haben hier bereits angedeutet, und @remus rusanus Tipp, die WPA/WPR-Kombination zu verwenden, zeigte dies ebenfalls. WPA/WPR-Kombination überrascht mich angenehm und ist ein nützliches Werkzeug neben VTune und ProcMon. Das erste Bild zeigt eine Spitze im McAfee-Taskmanager kurz vor einigen langen Flush-Zeiten und liest den Start (> 1s). Die zweite zeigt, dass alle Informationen in WPA über alle Graphen hinweg gut miteinander verknüpft sind. Ein schönes und starkes Werkzeug, wenn man im Heuhaufen nach dieser Nadel sucht.

enter image description here Quicklink große Version: here.

enter image description here Schnell größere Version: here.

Doch als ich die Virusscan-Software deinstallierte, traten immer noch Spitzen auf. Weniger häufig, und sie waren kürzer in der Dauer, aber immer noch sichtbar in der Anwendung. Ich habe viele Dinge ausprobiert, um herauszufinden, was es war. Benutzte VMWare-Setups, so dass ich das System komplett entfernen konnte und sah, ob andere Prozesse das Problem sein könnten. Am Ende gab ich auf. Ich habe ein System implementiert, um das Problem zu umgehen, und das reicht jetzt aus. Wenn ich alle meine Handlungen kenne, würde ich sagen, dass es einen weiteren Konflikt gab. Eine andere Option ist das verknüpfte nicht-verwaltete Programm, das Mutexes verwendet und möglicherweise problematische Dinge erledigt. Ich habe den Mutex in CriticalSections geändert, aber keine direkten sichtbaren Ergebnisse, also habe ich diese Route aufgegeben.

Zum Schluss habe ich leider keine direkte Antwort. Aus Zeitgründen war ich gezwungen, daran zu arbeiten und werde wahrscheinlich nie wissen, was die Ursache für das Problem war. Ich denke, das ist auch das wahre Leben.

Danke für alle Tipps, habe ich einige Dinge gelernt, die ich in Zukunft sicherlich verwenden werde.