Toàn bộ chức năng và tác dụng của thế nào Tắt Tắt bộ đệm bộ đệm ghi Windows ghi trên thiết bị


11

Trong Windows 7, sử dụng Trình quản lý thiết bị, hiển thị các thuộc tính của đĩa và chuyển đến tab Chính sách, có 2 mục chuyển đổi. Bộ đệm ghi, mà câu hỏi này không phải là về.

[X] Tắt bộ đệm bộ đệm ghi Windows ghi trên thiết bị <--- chỉ cái này!

Microsoft đưa ra từ chối trách nhiệm trên tab cho mục đó. "Để tránh mất dữ liệu, không chọn hộp kiểm này trừ khi thiết bị có nguồn điện riêng cho phép thiết bị xả bộ đệm trong trường hợp mất điện."

Nói một cách đơn giản, điều này thay đổi gì đối với việc ghi tệp, lưu tệp, sao chép tệp?

1. Thay đổi hành động ghi cho các chương trình hoang tưởng: (thực tế hoặc hư cấu)
Liệu nó có thay đổi cách viết tuôn ra làm việc cho một chương trình Buộc xóa bộ nhớ cache xảy ra không? Một số chương trình rất có ý định hoàn thành việc viết, mà không cần suy đoán, liệu các chương trình này có thể tiếp tục viết bảo vệ mạnh hơn hay điều này cũng thay đổi đối với các chương trình đó?

2. Các loại chương trình được thực hiện:
Các loại hành động / chương trình sẽ hoặc không bị ảnh hưởng bởi sự thay đổi là gì? Loại, một số luồng chương trình, một số viết nhanh, một số liên tục, một số là bảo vệ (hoặc bất kỳ loại nào khác bạn có thể xác định bằng các thuật ngữ đơn giản).

3. Bạn có nhìn thấy bất cứ điều gì, hoặc một điểm chuẩn thậm chí:
Nếu cài đặt được bật, những thay đổi có thể quan sát được bằng văn bản là gì? Bất kỳ ví dụ lỏng lẻo của một thay đổi quan sát trong hành vi. hoặc quan sát không có thay đổi trong hành vi?

4. Nắm giữ hoặc trì hoãn là gì:
Chúng tôi biết hầu hết các hành động này rất nhanh trên hầu hết các máy tính, Dữ liệu cuối cùng sẽ được ghi. Liên quan đến tốc độ của ổ đĩa, liệu thời gian có đáng kể?

Đối với mục đích câu hỏi của tôi, rủi ro tồn tại không phải là một trong những câu hỏi, nếu bạn muốn giải quyết nó, nó sẽ không cản trở bạn.

"Ghi bộ đệm bộ đệm ghi" nghĩa là gì gần như là một bản sao của điều này, nhưng liên kết dành cho một hệ điều hành khác. Mặc dù A có một số thông tin, ngay cả thuật ngữ được sử dụng trong liên kết cũng không giống nhau. Nó cũng không trả lời những điều quan trọng nhất mà người dùng muốn biết, mà tôi đã cố gắng phác thảo ở đây.



1
NTFS sử dụng ghi nhật ký để bảo vệ chống tham nhũng siêu dữ liệu của hệ thống tệp (mặc dù nội dung tệp không được ghi nhật ký), nhưng nó chỉ hoạt động nếu việc ghi nhất định có thể được đảm bảo xảy ra theo đúng thứ tự và Windows xóa bộ đệm ghi vào một số thời điểm nhất định để đảm bảo sắp xếp đúng.
David

Câu trả lời:


9
  1. Khẳng định của bạn trong câu hỏi đầu tiên là hư cấu. Các lệnh gọi API của Windows như vẫn sẽ đảm bảo rằng dữ liệu được truyền hết tới phương tiện vật lý, ngay cả khi bộ đệm ghi bị vô hiệu hóa. Vì vậy, các chương trình "an toàn" và biết những gì họ đang làm sẽ trở nên tốt đẹp. Các cuộc gọi như trong .NET, v.v ... cuối cùng gọi API này.FlushFileBuffers() FileStream.Flush()

  2. Các chương trình thực hiện nhiều I / O đĩa mà không gọi FlushFileBuffers()trực tiếp hoặc bất kỳ API trợ giúp nào cuối cùng gọi nó, sẽ thấy hiệu suất tăng đáng chú ý nhất. Ví dụ: nếu bạn đang chạy I / O không cần thiết nếu không có dữ liệu bị mất, chẳng hạn như BOINC (nếu bị mất, bạn chỉ cần tải xuống lại tệp hoặc cố gắng tính lại các phép tính), bạn có thể tránh gọi FlushFileBuffers()và chỉ cần gọi một API như WriteFile()- dữ liệu sẽ được ghi vào bộ đệm , nhưng nó thực sự sẽ không được ghi trong một thời gian dài, chẳng hạn như khi bộ mô tả tệp bị đóng hoặc khi chương trình thoát. Thật không may, cũng có thể là nếu hệ thống gặp sự cố (chẳng hạn như BSOD), tất cả dữ liệu sẽ bị mất, vì vậy nó thực sự quan trọngrằng nếu bạn đang đối phó với bất kỳ loại dữ liệu có giá trị / không thể thay thế mà bạn làm cuộc gọi FlushFileBuffers(), cho dù đỏ bừng đệm được kích hoạt hay không! Nếu không, một lỗi trình điều khiển đơn giản (ví dụ trong trình điều khiển đồ họa của bạn) có thể khiến bạn mất rất nhiều dữ liệu.

  3. Không thể tìm thấy bất kỳ điểm chuẩn nào, nhưng bạn sẽ chú ý đến nó nhiều hơn với các chương trình phù hợp với mô tả trong mục thứ hai ở trên.

  4. Đồng bộ hóa dữ liệu vào đĩa không thực sự nhanh như vậy, đặc biệt là nếu nó được thực hiện thường xuyên trong một vòng lặp chặt chẽ. Theo mặc định, nếu tôi nhớ chính xác từ việc đọc sách Windows Internals, NTFS theo mặc định sẽ đồng bộ tất cả các bộ đệm hệ thống tệp bẩn vào đĩa cứ sau 5 giây . Đây rõ ràng là một sự đánh đổi tốt giữa sự ổn định và hiệu suất. Vấn đề với dữ liệu đồng bộ hóa thường xuyên là nó làm cho ổ cứng thực hiện nhiều thao tác tìm kiếm và ghi.

Hãy xem xét các mã giả sau đây:

1: seek to a certain block (1)
2: write a couple megabytes of data into blocks starting at (1)
3: wait 2 seconds
4: seek to another block (2)
5: write some more megabytes of data into blocks starting at (2)
6: seek back to block (1)
7: write some more megabytes of data into blocks starting at (1)
8: wait 10 minutes
9: seek to block (1)
10: write some megabytes of data into blocks starting at (1)
11: wait 5 seconds
12: seek to block (2)
13: write some megabytes of data into blocks starting at (2)
14: explicit call to FlushFileBuffers()

Với bộ đệm tự động 5 giây xả vào :

  • Việc ghi xảy ra trên các dòng 2, 5 và 7 xảy ra trong RAM và đĩa không di chuyển, cho đến khi 5 giây trôi qua kể từ lần ghi đầu tiên, và sau đó dữ liệu mới nhất (từ dòng 7) được ghi vào khối (1) và chỉ dữ liệu được ghi vào khối (2) được ghi.
  • Việc ghi xảy ra trên các dòng 10 và 13, ghi đè dữ liệu trong các khối (1) và (2), phải ghi lại vào đĩa
  • Vì vậy, tổng số lần khối (1) được ghi vào RAM là 3 và vào đĩa , 2. Tổng số lần khối (2) được ghi vào RAM là 2 và vào đĩa là 2.

Với bộ đệm tự động 5 giây tắt (hiệu ứng của hộp kiểm trong câu hỏi của bạn):

  • Việc ghi xảy ra trên các dòng 2, 5, 7, 10 và 13 xảy ra trong RAM và đĩa không di chuyển, cho đến khi dòng 14 được thực thi và sau đó dữ liệu mới nhất (từ dòng 10 và 13) được ghi vào các khối (1) và 2). Dữ liệu cũ từ các dòng 2, 5 và 7 không bao giờ chạm vào đĩa cứng!

Xem xét rằng một hệ thống bận rộn có thể trải nghiệm từ hàng trăm đến hàng chục nghìn lần ghi vào tệp mỗi giây, điều này rất tốt cho hiệu năng, đặc biệt là trên các ổ cứng quay truyền thống (nó ít ấn tượng hơn trên SSD). RAM nhanh hơn 20 lần so với ổ cứng như một biện pháp chung, mặc dù khoảng cách đó là ít hơn với SSD.

Lý do họ nói rằng bạn nên sử dụng một bản sao lưu pin là vì bạn không muốn có dữ liệu được ghi trong bộ nhớ RAM trong 35 phút mà không được ghi vào đĩa chỉ vì lập trình viên của bạn lười biếng và không gọi FlushFileBuffers(), sau đó có mất điện Tất nhiên, một bản sao lưu pin không bảo vệ bạn khỏi các lỗi trình điều khiển gây ra BSOD ....


0

Để hỗ trợ cho câu trả lời của ChatBot John Cavil , tôi đã viết một chương trình thử nghiệm nhỏ:

// ...
byteEx btTest;
btTest.resize(1024*1024, 0xff); // 1MB data

CSysFile sfTest(byT("test.bin"));

swTest.Start(); // Begin timing by call `QueryPerformanceCounter` API
for (UINT i=0; i<10000; ++i) // Write 1MB data for 10000 times
{
    sfTest.SeekBegin();
    sfTest.Write(btTest); // Call `WriteFile` API 
//  sfTest.Flush();       // Call `FlushFileBuffers` API
}
swTest.Stop(); // Calculate the time-consuming start from `swTest.Start() `
// ...

Và chạy nó trên đĩa NVMe của Samsung 950pro với bộ đệm Tắt bộ đệm ghi bộ đệm ghi Windows trên tùy chọn thiết bị được bật.

Kết quả là:

D:\tmp> test        // without sfTest.Flush();
00:00:00.729766     // use 0.73 seconds without FlushFileBuffers()

D:\tmp> test        // with sfTest.Flush();
00:00:06.736167     // use 6.74 seconds with FlushFileBuffers()

Vì vậy, bạn có thể thấy FlushFileBuffersyêu cầu không bị hệ thống bỏ qua (Windows không bỏ qua FlushFileBufferscuộc gọi ngay cả khi các tùy chọn được bật).


Vui lòng xóa bình luận của bạn từ câu trả lời của bạn. Không bao giờ được chấp nhận để gửi bình luận như một câu trả lời.
Ramhound

@ASBai: (1) Tôi biết C ++ (Tôi cho rằng đó là những gì chương trình của bạn được viết), nhưng tôi không biết API Windows. Bạn có thể giải thích mã của bạn một chút? (Ghi nhớ rằng một số người dùng của Super User không lập trình viên ở tất cả, cho mỗi gia nhập .) Đặc biệt, những gì được swTest(và tại sao nó không khai báo)? (2) Bạn có nói rằng bạn đã tạo ra hai bản sao của chương trình của mình, một bản bao gồm sfTest.Flush()cuộc gọi và một bản không (nghĩa là nó đã nhận xét) và so sánh chúng? Vui lòng giải thích. (3) Tôi biết tiếng Anh, nhưng tôi không thể hiểu câu cuối cùng của bạn.
Scott

@Ramhound nhưng tôi không đủ danh tiếng để bình chọn hoặc để lại bình luận, làm thế nào để giải quyết nó?
ASBai

@Scott (1), swTest là bộ đếm thời gian có độ phân giải cao, nó sử dụng API QueryPerformanceCorer trên nền tảng windows để thực hiện tính thời gian (Tôi nghĩ đó không phải là điểm quan trọng :-). (2) Có, Chính xác. (3) Xin lỗi vì tiếng Anh của tôi không tốt, tôi chỉ muốn nói: ChatBot John Cavil đã đúng, Windows không bỏ qua FlushFileBufferscuộc gọi ngay cả khi các tùy chọn được bật (Tôi thấy một số nguồn khác buồn cuộc gọi sẽ bị bỏ qua khi tùy chọn này được bật ). Tôi sẽ thêm một số ý kiến ​​trong câu trả lời, cảm ơn :-)
ASBai

@ASBai - Bạn không nên gửi bình luận như một câu trả lời. Nó không thực sự quan trọng, bạn không có danh tiếng cần thiết để gửi bình luận, bởi vì một bình luận không bao giờ nên được gửi như một câu trả lời.
Ramhound
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.