2010-07-18 36 views
6

thể trùng lặp:
How to invalidate the file system cache?Làm cách nào để buộc Windows xóa tất cả dữ liệu bộ nhớ cache trên đĩa?

Tôi đang viết một đĩa chương trình win32 chuyên sâu. Lần đầu tiên nó chạy, nó chạy chậm hơn rất nhiều trong khi nó quét các thư mục của người dùng bằng cách sử dụng FindFirstFile()/FindNextFile().

Làm cách nào tôi có thể lặp lại hiệu suất lần đầu tiên này mà không cần khởi động lại? Có cách nào để buộc hệ thống loại bỏ mọi thứ trong bộ đệm đĩa của nó không?

Tôi biết rằng nếu tôi đang đọc một tệp, tôi có thể tắt bộ nhớ đệm bằng cách chuyển cờ FILE_FLAG_NO_BUFFERING cho cuộc gọi đến CreateFile(). Nhưng có vẻ như không thể thực hiện điều này khi tìm kiếm tệp.

+1

+1 Tôi đã tự mình đăng bài một bài đăng có liên quan. Khi cố gắng để làm việc ra hiệu suất của các thuật toán liên quan đến đĩa, bộ nhớ đệm thực sự bị cản trở. Câu hỏi hay. –

Trả lời

0

Tôi đã thử tất cả các phương thức trong câu trả lời, bao gồm CacheSet, nhưng chúng sẽ không hoạt động cho FindFirstFile/FindNextfile(). Dưới đây là những gì đã làm việc:

  • Quét tệp qua mạng. Khi quét một ổ đĩa được chia sẻ, có vẻ như các cửa sổ không lưu vào bộ nhớ cache, vì vậy nó sẽ bị chậm đi mỗi lần.

  • Cách đơn giản nhất để thực hiện bất kỳ thuật toán nào chậm hơn là chèn cuộc gọi vào Sleep(). Điều này có thể tiết lộ rất nhiều vấn đề trong mã đa luồng, và đó là những gì tôi đã thực sự cố gắng làm.

+1

Để lưu ý, máy khách Windows SMB và máy chủ Windows SMB có bộ nhớ cache riêng của họ mà bạn đang xử lý (và HDD và các bộ đệm khác, mức SAN, bộ điều khiển RAID ...). Đặt cược tốt nhất của bạn, vì phép thuật của CacheSet không hoạt động (tôi đồng ý), là "làm tràn bộ nhớ cache" để nó xóa các mục trước đó. Điều này là để nói, bạn phải tìm ra kích thước của tất cả các cache liên quan và điền chúng lên để dữ liệu đọc/ghi trước đây của bạn được đẩy ra (hoặc đỏ ửng để lưu trữ ổn định). xem HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ lanmanserver \ parameters reg_dword: TreatHostAsStableStorage. – mbrownnyc

0

Bạn có thể tránh khởi động lại vật lý bằng cách sử dụng máy ảo.

+1

Điều này không hoạt động. Hệ điều hành máy chủ lưu trữ kết thúc lên làm bộ nhớ đệm quá mà làm cho các bài kiểm tra không chính xác. –

1

Bạn cần tạo đủ áp lực bộ nhớ để khiến trình quản lý bộ nhớ và trình quản lý bộ nhớ cache loại bỏ các kết quả lưu trữ trước đó. Đối với trình quản lý bộ nhớ cache, bạn có thể thử mở một tệp lớn (I.e. Lớn hơn ram vật lý) với bộ nhớ đệm được bật và sau đó đọc ngược lại (để tránh bất kỳ tối ưu I/o tuần tự nào). Tương tác giữa vm và trình quản lý bộ nhớ cache phức tạp hơn một chút và phụ thuộc nhiều hơn vào phiên bản hệ điều hành.

Cũng có bộ đệm trên bộ điều khiển (có thể, nhưng không chắc) và trên chính ổ đĩa (có thể). Có những IoCtls cụ thể để tuôn ra bộ nhớ cache này, nhưng theo kinh nghiệm của tôi, firmware đĩa chưa được kiểm tra trong đấu trường này.

+0

Đây chính xác là những gì tôi đã luôn làm. Một cách dễ dàng là mở một tệp lớn và tìm kiếm một chuỗi các byte không tồn tại trong tệp. Windows sẽ tràn bộ nhớ cache bằng tệp mới và đẩy dữ liệu cũ ra. Nó không lý tưởng, nhưng nó hoạt động. – Synetech

3

Bạn đã từng nghĩ về việc thực hiện nó với một khối lượng khác và hủy bỏ/remounting khối lượng? Điều đó sẽ gây ra phần lớn mọi thứ được đọc lại từ đĩa (mặc dù bộ nhớ cache ở đó sẽ không quan tâm).

+0

+1 - đây là cách tiếp cận duy nhất ở đây sẽ nhất quán. –

1

Kiểm tra chức năng Xóa của CacheSet bởi SysInternals.

+0

Tôi đã thử nó trên Windows XP và liệt kê thông qua các thư mục đĩa chỉ là nhanh sau khi xóa bộ nhớ cache như trước, do đó, nó dường như không hoạt động. –

Các vấn đề liên quan