Autor Beitrag
Martok
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 3661
Erhaltene Danke: 604

Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
BeitragVerfasst: Di 01.02.11 16:56 
Hi!

ein Festplattentestprogramm bietet verschiedene Opionen an, unter anderem auch das FILE_FLAG_WRITE_THROUGH von CreateFile. Damit das funktioniert, muss ich den zu schreibenden Buffer an einem Vielfachen der Sektorgröße des Mediums alignen und/oder in Vielfachen davon schreiben. Der Teil funktioniert ;)

Die Frage ist nun: wie bekomme ich diese Sektorgröße von Netzlaufwerken, hauptsächlich erstmal SMB-Shares? Der normale Weg über IOCTL_DISK_GET_DRIVE_GEOMETRY geht hier nicht, weil man (logischerweise) einen solchen gefälschten Laufwerksbuchstaben nicht als Device geöffnet kriegt.

Wird da überhaupt Write-Through verwendet? So richtig schlau werde ich auch aus meinen Versuchen hier nicht. Es funktioniert, aber ob mit oder ohne Cache lässt sich kaum feststellen.

Workaround jetzt: Buffer an 4K-Seiten alignen, das trifft alles was so an PC-Festplatten momentan unterwegs ist. Aber so ganz schön finde ich das nicht gerade, auch wenn auf absehbare Zeit keiner was anderes vor hat.

Was wäre also die korrekte Lösung?

Grüße,
Martok

_________________
"The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Di 01.02.11 17:40 
Meinst Du Sektor-Größe oder Cluster-Größe Ist nämlich ein Unterschied, weil die Sektor-Größe üblicherweise 512 Bytes ist, die Cluster-Größe aber 4K.

Üblicherweise, weil bei SSDs inzwischen ein Wechsel zu 2K bzw. 4K pro Sektor zu passieren scheint.
Bei Cluster-Größen kenn ich 4K bis 64K als durchaus in Verwendung, je nach Dateisystem).

Die Clustergröße hängt vom Dateisystem ab. Da dieses bei SMB emuliert wird, due also keinen Low-Level-Access hast, hast Du also in dem Sinne keine wirklichen Cluster.

Write-Through könnte im Netzwerk dementsprechend maximal heißen "mit einem Schlag atomar übertragen", womit hier alles mögliche was UDP mit einem Mal transportieren kann gemeint sein könnte. Von 1K (ein Fragment) bis 32K (mehrere Fragmente, gilt trotzdem als ein Paket) ist hier also alles möglich. 64K fällt hierbei jedoch aus, weil der Header für's SMB mit zu übertragen ist, was in einem Jumbo-Packet resultieren würde, was über Ethernet derzeit AFAIK nicht unterstützt wird (zumindest nicht bei Windows).

Bliebe also noch die Bewertung: Write Through macht man i.d.R. ja um den Cache wegen ungenügendem Echtzeitverhalten auszuschalten. Wenn Du Netzwerk drinnen hast (insbesondere Ethernet), ist das Echtzeit-Verhalten eh tot, also brauch man das ggf. nicht vorhandene Echtzeitverhalten nicht gegen gar keines austauschen.

HTH.

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
Martok Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 3661
Erhaltene Danke: 604

Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
BeitragVerfasst: Di 01.02.11 19:44 
Wenn ich Cluster meinen würde... traust du mir nicht zu das dann auch hinzuschreiben? :wall:

Übrigens haben alle Platten größer als 1.5TB mittlerweile 4K-Sektoren. SSDs sind so ziemlich die letzten die noch mit 512ern arbeiten - wobei man aber nicht vergessen sollte, dass sie trotzdem ziemlich große Seiten haben. Meine hier z.B. 512kByte. Aber darum gehts ja gar nicht.

Die Sache ist halt, ich muss das für physikalische Datenträger auf jeden Fall prüfen, sonst macht WriteFile nicht mit. Die Frage ist halt, was im Netzwerk passieren würde. Wenn der da das WriteThrough ignoriert, wäre das Problem ja gar keins. Dann würde ich einfach auf den Device Type Network prüfen und in diesem Fall "irgendwas" annehmen.

Tja. Gibts sowas wie Sektorgröße (DISK_GEOMETRY.BytesPerSector), kommt man da ran und wenn ja wie ;)

_________________
"The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
Martok Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 3661
Erhaltene Danke: 604

Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
BeitragVerfasst: Mo 07.02.11 21:09 
Da keiner weiter was gesagt hat, darf man also annehmen dass Windows auch keine Sektoren auf Shares simuliert und dementsprechend WRITE_THROUGH nicht angewendet wird?

_________________
"The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Mo 07.02.11 21:49 
Würde ich jetzt einfach einmal annehmen. Weil erzwingen kann Windows das direkte Schreiben auf die Platte über einen SMB-Share nicht. Windows könnte hier maximal ohne Zwischenschaltung des IO-Level-Cache direkt auf die Netzwerk-Karte schaufeln, was aber eigentlich eher Kontraproduktiv ist.

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.