Điểm:1

Nội dung tệp Windows không được cập nhật trong Explorer/Powershell

lá cờ cf

Trên Windows Server, một công cụ ghi nhật ký ghi các tệp .log vào đĩa liên tục và quay các tệp nhật ký hàng ngày vào lúc nửa đêm. Mỗi ngày tệp nhật ký mới được tạo, nhưng hầu như mỗi ngày nội dung/dữ liệu meta của nó không được cập nhật sau đó trong Windows Explorer và Powershell.

Ví dụ: Một tệp được tạo vào ngày 17 tháng 5 năm 2022 lúc 0:00. Nó có kích thước khoảng 24KB trong Windows Explorer và có thời gian ghi lần cuối vào khoảng nửa đêm (tôi không kiểm tra thời gian chính xác đến từng giây). Nếu tôi sử dụng Powershell

(Get-Item).Length

Tôi nhận được kích thước 24401.

Bây giờ khi tôi nhấp chuột phải vào cùng một tệp Windows Explorer và kiểm tra các thuộc tính của nó, nó sẽ cập nhật kích thước lên 4.593KB và thời gian ghi lần cuối là 09:34 ngày 17 tháng 5 năm 2022. Thời gian và kích thước chính xác không thực sự quan trọng, nhưng vấn đề là ở đây: Tại sao Windows Explorer và Windows Powershell hoàn toàn không đồng bộ với hệ thống tệp bên dưới như vậy? Điều gì thậm chí có thể gây ra sự khác biệt như thế này?

Một lần khác, tôi đã sử dụng điều này để kiểm tra xem tệp có được sao chép không đồng bộ hoặc với nội dung chính xác hay không:

Sao chép-Mục "..tệp nguồn .." -Destination ".. đâu đó .."

các thuộc tính của tệp gốc được cập nhật để tôi có thể sử dụng nó như một giải pháp thay thế thực sự tồi tệ để luôn có phiên bản mới nhất của tệp thực sự có sẵn trong Powershell khi tôi đang phân tích tệp bằng tập lệnh Powershell và thực sự cần tất cả nội dung của nó và không chỉ nội dung mà tệp có khi nó được tạo 9h trước đó.

Có ai đã từng chứng kiến ​​loại hành vi này trong Windows chưa?

  • Hệ thống tập tin: NTFS
  • Hệ điều hành: Windows Server 2019 Phiên bản 1809 Build 17763.2803
  • “Phần cứng”: Server ảo trên VMware ESXi Server
Điểm:0
lá cờ cn

Có, điều này là do quá trình vẫn đang ghi vào tệp và bộ đệm không bị xóa.

Thông thường, khi bạn muốn ghi vào một tệp, bạn có thể (đại khái) làm điều gì đó như thế:

1. Tạo/Mở tệp và truy xuất "kênh" (tay cầm) đối với tệp
2. Viết gì đó
3. Xóa bộ đệm/Đóng tệp "kênh" (xử lý) (= chuyển vào đĩa)
(sau đó, lặp lại 1, 2 và 3 khi bạn muốn viết lại điều gì đó)

Tuy nhiên, làm điều gì đó như vậy cũng không sao nếu thỉnh thoảng bạn muốn viết điều gì đó, bởi vì "Mở tay cầm cho tệp" và "Xóa bộ đệm" không phải là "miễn phí" khi nói đến hiệu suất.

Điều này có nghĩa là nếu bạn dự định thường xuyên ghi vào một tệp, thì tốt hơn là chỉ Tạo/Mở tệp, sau đó Viết nhiều lần, khi cần thiết và khi bạn hoàn thành Tuôn ra hoặc Đóng tay cầm (trong ví dụ của tôi ở trên, điều này có nghĩa là 1, 2 [lặp lại bước 2 khi cần thiết], sau đó, sau đó, 3)

Và trong khi dữ liệu không được xóa vào đĩa/đã cam kết: bạn không thể dựa vào chúng!

Microsoft cung cấp thêm chi tiết về điều đó:

Xả dữ liệu I/O được đệm hệ thống vào đĩa

[...] Windows lưu trữ dữ liệu trong các hoạt động đọc và ghi tệp trong bộ đệm dữ liệu do hệ thống duy trì để tối ưu hóa hiệu suất của đĩa. Khi một ứng dụng ghi vào một tệp, hệ thống thường đệm dữ liệu và ghi dữ liệu vào đĩa một cách thường xuyên[...]

Các Bộ đệm tập tin tuôn ra Tài liệu API của Windows nói:

[...] Thông thường, các hàm WriteFile và WriteFileEx ghi dữ liệu vào bộ đệm bên trong mà hệ điều hành thường xuyên ghi vào đĩa hoặc ống truyền thông. Hàm FlushFileBuffers ghi tất cả thông tin được lưu vào bộ đệm cho một tệp được chỉ định vào thiết bị hoặc đường ống.

Do tương tác với bộ nhớ đệm ổ đĩa trong hệ thống, chức năng FlushFileBuffers có thể không hiệu quả khi được sử dụng sau mỗi lần ghi vào thiết bị ổ đĩa khi nhiều thao tác ghi đang được thực hiện riêng biệt.[...]

Tạo tập tin tài liệu:

[…]Khi một ứng dụng kết thúc bằng cách sử dụng bộ điều khiển đối tượng do CreateFile trả về, hãy sử dụng hàm CloseHandle để đóng bộ điều khiển. Điều này không chỉ giải phóng tài nguyên hệ thống mà còn có thể có ảnh hưởng rộng hơn đến những thứ như chia sẻ tệp hoặc thiết bị và đưa dữ liệu vào đĩa. Chi tiết cụ thể được ghi chú trong chủ đề này khi thích hợp.[...]

Thông tin thêm về Bộ nhớ đệm tệp có sẵn tại đây, lưu ý rằng:

Siêu dữ liệu hệ thống tệp luôn được lưu trong bộ nhớ cache. Do đó, để lưu trữ bất kỳ thay đổi siêu dữ liệu nào vào đĩa, tệp phải được xóa hoặc được mở bằng FILE_FLAG_WRITE_THROUGH.

Vì vậy, như bạn có thể thấy, hành vi phụ thuộc vào thiết kế của ứng dụng, không có gì lạ khi thấy rằng thỉnh thoảng các tệp nhật ký chỉ được chuyển vào đĩa một lần vì lý do hiệu suất và bạn không thể dựa vào siêu dữ liệu như ngày/ thời gian, kích thước tệp hoặc thậm chí nội dung tệp trong khi ứng dụng vẫn đang ghi vào tệp.

Johannes B. Latzel avatar
lá cờ cf
Tôi không nghĩ rằng chính ứng dụng đó là vấn đề ở đây. Tôi đã thử điều này để xác minh giả thuyết: a) Tôi đã khởi động lại máy chủ (vì vậy tất cả các trình xử lý tệp bị đóng hoặc bị loại bỏ), b) Tôi đã kiểm tra thời gian ghi cuối cùng: đóng dấu từ trước thời điểm của bước a), c) tôi đã kiểm tra các thuộc tính của tệp, d) tôi đã kiểm tra lần ghi cuối cùng: đóng dấu từ sau bước a). Nếu đó là sự cố ứng dụng ghi/xóa dữ liệu của nó thì siêu dữ liệu sau khi khởi động lại đã được cập nhật nhưng không phải vậy.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.