Puncte:1

Conținutul fișierului Windows nu a fost actualizat în Explorer/Powershell

drapel cf

Pe un Windows Server, un instrument de înregistrare scrie fișiere .log pe disc în mod continuu și rotește fișierele jurnal zilnic la miezul nopții. În fiecare zi este creat noul fișier jurnal, dar aproape în fiecare zi conținutul / metadatele sale nu sunt actualizate ulterior în Windows Explorer și Powershell.

Exemplu: un fișier a fost creat pe 17 mai 2022 la ora 0:00. Are o dimensiune de aproximativ 24KB în Windows Explorer și are ultima oră de scriere la aproximativ miezul nopții (nu am verificat ora exactă până la secundă). Dacă folosesc Powershell

(Get-Item).Lungime

Am o dimensiune de 24401.

Acum, când dau clic dreapta pe același fișier din Windows Explorer și îi inspectez proprietățile, acesta își actualizează dimensiunea la 4.593 KB și ultima scriere pe 17 mai 2022 09:34. Ora exactă și dimensiunea nu contează cu adevărat, dar problema este următoarea: De ce Windows Explorer și Windows Powershell nu sunt complet sincronizate cu sistemul de fișiere de bază? Ce poate cauza o astfel de discrepanță?

Altă dată am folosit asta pentru a testa dacă fișierul este copiat desincronizat sau cu conținutul corect:

Elementul de copiere „...fișier sursă .." -Destinație ".. undeva .."

atributele fișierului original sunt actualizate, astfel încât să pot folosi asta ca o soluție foarte proastă pentru a avea întotdeauna cea mai recentă versiune a fișierului disponibilă în Powershell, deoarece analizez fișierul cu un script Powershell și chiar am nevoie de tot conținutul său și nu numai conținutul pe care îl avea fișierul când a fost creat cu 9 ore mai devreme.

A asistat cineva vreodată la acest tip de comportament în Windows?

  • Sistem de fișiere: NTFS
  • OS: Windows Server 2019 Versiunea 1809 Build 17763.2803
  • „Hardware”: server virtual pe serverul VMware ESXi
Puncte:0
drapel cn

Da, acest lucru se datorează faptului că procesul încă scrie în fișier și buffer-urile nu sunt golite.

De obicei, atunci când doriți să scrieți într-un fișier, puteți (aproximativ) să faceți ceva de genul:

1. Creați/Deschideți un fișier și preluați un „canal” (un mâner) către fișier
2. Scrie ceva
3. Goliți tamponul/Închideți fișierul „canal” (mâner) (=comitați pe disc)
(apoi, repeta 1, 2 si 3 cand vrei sa scrii ceva din nou)

Totuși, să faci așa ceva este în regulă dacă vrei să scrii ceva din când în când, deoarece „Deschiderea mânerului la fișier” și „Spălarea bufferelor” nu este „gratuit” când vine vorba de performanță.

Aceasta înseamnă că, dacă intenționați să scrieți frecvent într-un fișier, este mai bine să faceți doar Creați/Deschideți un fișier, atunci Scrie de mai multe ori, după cum este necesar și când ați terminat Culoare sau Închideți mânerul (în exemplul meu de mai sus, aceasta înseamnă 1, 2 [repetă pasul 2 după cum este necesar], apoi, mai târziu, 3)

Și în timp ce datele nu sunt spălate pe disc/comitate: nu vă puteți baza pe ele!

Microsoft oferă mai multe detalii despre asta:

Spălarea datelor I/O stocate în tampon de sistem pe disc

[...] Windows stochează datele în operațiuni de citire și scriere a fișierelor în buffer-uri de date întreținute de sistem pentru a optimiza performanța discului. Când o aplicație scrie într-un fișier, sistemul de obicei pune în tampon datele și le scrie pe disc în mod regulat[...]

The FlushFileBuffers Documentul API Windows spune:

[...] În mod obișnuit, funcțiile WriteFile și WriteFileEx scriu date într-un buffer intern pe care sistemul de operare le scrie în mod regulat pe un disc sau conductă de comunicare. Funcția FlushFileBuffers scrie toate informațiile din buffer pentru un fișier specificat pe dispozitiv sau conductă.

Datorită interacțiunilor de stocare în cache a discului în cadrul sistemului, funcția FlushFileBuffers poate fi ineficientă atunci când este utilizată după fiecare scriere pe un dispozitiv de unitate de disc când multe scrieri sunt efectuate separat.[...]

CreateFile documentație:

[...] Când o aplicație se termină folosind mânerul de obiect returnat de CreateFile, utilizați funcția CloseHandle pentru a închide mânerul. Acest lucru nu numai că eliberează resurse de sistem, dar poate avea o influență mai largă asupra unor lucruri precum partajarea fișierului sau dispozitivului și trimiterea datelor pe disc. Specificațiile sunt menționate în acest subiect, după caz.[...]

Mai multe informații despre Memorarea în cache a fișierelor este disponibilă aici, Rețineți că:

Metadatele sistemului de fișiere sunt întotdeauna stocate în cache. Prin urmare, pentru a stoca orice modificări ale metadatelor pe disc, fișierul trebuie fie să fie șters, fie să fie deschis cu FILE_FLAG_WRITE_THROUGH.

Așadar, după cum puteți vedea, comportamentul depinde de designul aplicației, nu este neobișnuit să vedeți că fișierele jurnal sunt șterse pe disc doar o dată din când în când din motive de performanță și nu vă puteți baza pe metadate precum data/data/ timpul, dimensiunea fișierului sau chiar conținutul fișierului în timp ce aplicația încă scrie în fișier.

Johannes B. Latzel avatar
drapel cf
Nu cred că aplicația în sine este problema aici. Am încercat acest lucru pentru a verifica ipoteza: a) Am repornit serverul (deci toate mânerele de fișiere se închid sau sunt eliminate), b) Am verificat ultima oră de scriere: ștampila de înainte de momentul pasului a), c) Am verificat proprietățile a fișierului, d) am verificat ultima oră de scriere: ștampila de după pasul a). Dacă a fost o problemă a aplicației la scrierea/spălarea datelor, metadatele după repornire ar fi trebuit să fie deja actualizate, dar nu a fost.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.