2012-03-27 2 views
6

Ich schreibe auf USB-Festplatte von einem Thread mit der niedrigsten Priorität, mit Chunked-Puffer schreiben und immer noch hin und her das System insgesamt auf diesem Vorgang. Wenn ich nur das Schreiben auf die Festplatte deaktiviere, funktioniert alles einwandfrei. Ich kann nicht Windows-Dateioperationen API-Aufrufe verwenden, nur C schreiben. Also ich dachte, vielleicht gibt es eine WinAPI-Funktion zum Ein-/Ausschalten von USB-Festplatten-Schreib-Caching, die ich in Verbindung mit FlushBuffers oder ähnlichen Alternativen verwenden könnte? Die Anzahl der Laufwerke für Operationen ist nicht definiert.USB-Disk-Schreib-Latenz (Windows)

Idealerweise möchte ich nie mit Schreibaufruf und Caching verzögern, wenn es transparent durchgeführt wird, ist auch ok.

EDIT: würde _O_SEQUENTIAL Flag auf Schreib nur Operationen hier von irgendwelchen Nutzen sein?

+0

Ich verstehe es nicht. Sie möchten nie blockieren, aber Sie verwenden eine sehr niedrige Thread-Priorität? Das ergibt keinen Sinn. Was genau ist dein äußeres Problem? –

+0

@ david-schwartz-Schreiboperation ergibt eine Gesamtsystemverzögerung bei einer bestimmten Frequenz. Ich interessiere mich nicht für Blockierung im Thread, ich meinte Systemverzögerung ..., wird die Frage – Ulterior

+0

korrigieren Haben Sie weitere Details darüber, was das Problem ist? Ist es zum Beispiel, dass das Volumen der Schreibvorgänge andere Informationen aus dem Cache verschiebt? Wenn Sie wissen, was Sie tun, können Sie [nicht-temporale Schreibvorgänge ausführen, die den Festplatten-Cache umgehen] (http://support.microsoft.com/kb/99794). –

Antwort

4

Versuchen Sie, die E/A-Priorität für den Thread zu reduzieren. Sehen Sie diesen Artikel: http://msdn.microsoft.com/en-us/library/windows/desktop/ms686277(v=vs.85).aspx Insbesondere verwenden Sie THREAD_MODE_BACKGROUND_BEGIN für Ihren IO-Thread. Warnung: Dies funktioniert nicht in Windows XP

+0

Dies ist eigentlich ein Problem, wie ich es auf Windows XP arbeiten ... – Ulterior

+0

Also, wenn Sie bereits reduziert Priorität von IO-Thread auf Minimum Ich nehme an, Sie kümmern sich nicht viel um IO-Geschwindigkeit (es muss nur passieren).Also würde ich vorschlagen, dann Ansatz zu verwenden, der Windows Defragmentierer ähnlich ist - überprüfen aktuelle E/A-Ebenen und nichts tun, wenn sie minimal sind - ich glaube, Sie fühlen Lags, wenn USB IO Haupt HDD IO blockiert –

+0

hmm, könnte dies funktionieren . Haben Sie weitere Informationen dazu? Ich werde es überprüfen, sicher – Ulterior

3

Die Thread-Priorität hat keinen Einfluss auf die Verzögerung beim Schreiben der Medien, da dies im Kernel-Modus von den Dateisystem-/Festplattentreibern ausgeführt wird Achten Sie auf die Priorität des aufrufenden Threads.

Sie könnten versuchen, "T" -Flag (_O_SHORTLIVED) zu verwenden und die Puffer am Ende der Operation zu leeren, versuchen Sie auch, die Puffergröße zu verringern.

2

Es gibt verschiedene Arten der Datenübertragung für USB, für Daten gibt es 3: 1.Bulk Transfer, 2.Isochronous Übertragung und 3.Interrupt Übertragung.

  1. Bulk-Transfer Provides:

    Used to transfer large bursty data. 
    Error detection via CRC, with guarantee of delivery. 
    No guarantee of bandwidth or minimum latency. 
    Stream Pipe - Unidirectional 
    Full & high speed modes only. 
    

    Bulk-Transfer für Daten gut ist, dass nicht Lieferung erfordert in einer garantierten Menge an Zeit Der USB-Host-Controller gibt eine niedrigere Priorität Massenübertragung als die andere Arten der Übertragung.

  2. Isochrone Transfers Provides:

    Guaranteed access to USB bandwidth. 
    Bounded latency. 
    Stream Pipe - Unidirectional 
    Error detection via CRC, but no retry or guarantee of delivery. 
    Full & high speed modes only. 
    No data toggling. 
    

    Isochrone Transfers erfolgen kontinuierlich und periodisch. Sie enthalten in der Regel zeitkritische Informationen wie einen Audio- oder Video-Stream. Wenn es eine Verzögerung oder einen erneuten Versuch von Daten in einem Audiostream gab, dann würden Sie ein fehlerhaftes Audio erwarten, das Störimpulse enthält. Der Beat ist möglicherweise nicht mehr synchron. Wenn jedoch ein Paket oder ein Frame hin und wieder fallen gelassen wurde, ist es weniger wahrscheinlich, dass der Hörer es merkt.

  3. Interrupt Transfers Provides:

    Guaranteed Latency 
    Stream Pipe - Unidirectional 
    Error detection and next period retry. 
    

    Interrupt-Transfers sind typischerweise nicht periodische, kleines Gerät "initiiert" begrenzte Kommunikationslatenz erfordern. Eine Unterbrechungsanforderung wird vom Gerät in die Warteschlange gestellt, bis der Host das USB-Gerät nach Daten fragt.

Aus dem oben, so scheint es, dass Sie eine garantierte Latenz wollen, so dass Sie Taktsynchronität verwenden sollten.Es gibt einige Bibliotheken, die Sie wie libusb verwenden können, oder Sie können mehr lesen in msdn

+1

Das USB-Gerät, die Festplatte, entscheidet, welche Übertragungsmodi es behandelt. Wenn es den Interrupt-Modus nicht macht, dann nicht. Ich glaube nicht, dass es ein USB-Laufwerk gibt, das etwas anderes als BULK-Übertragungen macht. –

+0

gut, ich empfehle dringend, mehr zu lesen, bevor Sie Downvote und "Ich glaube nicht ..." ist kein akzeptabler Grund, eine mögliche Antwort wegzuwerfen, die tatsächlich jemandem helfen kann. Zurück zum Thema, ist es möglich, Daten in Interrupt und Isochron zu übertragen, wenn Sie wissen möchten, wie Sie das lesen können [Artikel] (http://msdn.microsoft.com/en-us/library/windows/hardware/ hh406225 (v = vs.85) .aspx) in msdn. Sie können mehr [hier] (http://www.silabs.com/Support%20Documents/TechnicalDocs/AN295.pdf) lesen. und technische Details sind in diesem [Artikel] (http://www.beyondlogic.org/usbnutshell/usb4.shtml). –

+0

OP bittet um seine IO, andere IO nicht zu blockieren, glaube nicht, dass er garantierte Latenz wünscht, das Gegenteil tatsächlich. –

0

Um herauszufinden, was Ihr System hängen lässt, müssen Sie zunächst auf den Windows-Hang bohren. Was hat Windows gemacht, während Sie den Hang erlebt haben?

Um das herauszufinden, können Sie einen Kernel-Dump machen. Wie man einen Kernel Dump bekommt und analysiert, lesen Sie here.

Abhängig von den Ergebnissen, die Sie dort erhalten, müssen Sie dann entscheiden, ob es irgendetwas unter Ihrer Kontrolle gibt, über das Sie tun können. Da Sie eine Drittanbieter-Bibliothek zum Schreiben verwenden, gibt es wenig, was Sie tun können, außer IO priority, Thread-Priorität auf Thread- oder Prozessebene. Wenn die Bibliothek Links zu einem bestimmten CRT erhalten hat, könnten Sie versuchen, Ihre eigene angepasste Version davon zu erstellen, z. Leeren Sie nach jedem Schreibvorgang, um zu verhindern, dass das Schreiben durch das Betriebssystem kombiniert wird, um nur Daten in großen Stückzahlen zurück auf die Disc zu schreiben.

Edit1

Ihre beste Wette auf spülen Sie das Gerät würde nach jedem schreiben. Dies könnte das Betriebssystem dazu zwingen, alle anstehenden Daten zu löschen und die aktuellen ausstehenden Schreibvorgänge auf die Disk zu schreiben, ohne die Schreibvorgänge bis zu einem bestimmten Betrag zwischenzuspeichern.

Die zweitbeste Sache wäre einfach zu warten nach jedem Schreiben, um dem Betriebssystem die Möglichkeit zu geben, ausstehende Änderungen zu schreiben, obwohl klein zurück auf die CD nach einem bestimmten Zeitintervall.

Wenn Sie tiefer in Leistung sind, sollten Sie versuchen, XPerf auszuprobieren, die eine nette GUI hat und Ihnen sogar den Aufruf-Stapel zeigt, wo Ihr Prozess aufhängte. Das Windows-Team und viele andere Teams bei MS verwenden dieses Tool zur Fehlerbehebung bei Hang experiences. Die neueste Ausgabe mit vielen weiteren Funktionen kommt mit der Windows 8 SDK. Aber Vorsicht, Xperf funktioniert nur unter OS> Vista.