Xóa bộ nhớ cache của tệp để lặp lại kiểm tra hiệu suất


106

Tôi có thể sử dụng công cụ hoặc kỹ thuật nào để xóa nội dung tệp đã lưu trong bộ nhớ cache để ngăn kết quả hiệu suất của tôi bị sai lệch? Tôi tin rằng tôi cần phải xóa hoàn toàn hoặc xóa có chọn lọc thông tin đã lưu trong bộ nhớ cache về nội dung tệp và thư mục.

Ứng dụng mà tôi đang phát triển là một tiện ích nén chuyên dụng và dự kiến ​​sẽ thực hiện rất nhiều công việc đọc và ghi các tệp mà hệ điều hành chưa động đến gần đây và các khối đĩa có khả năng không được lưu vào bộ nhớ đệm.

Tôi muốn loại bỏ sự thay đổi mà tôi thấy trong thời gian IO khi tôi lặp lại nhiệm vụ lập hồ sơ các chiến lược khác nhau để thực hiện công việc xử lý tệp.

Tôi chủ yếu quan tâm đến các giải pháp cho Windows XP, vì đó là máy phát triển chính của tôi, nhưng tôi cũng có thể thử nghiệm bằng linux và vì vậy tôi cũng quan tâm đến câu trả lời cho môi trường đó.

Tôi đã thử SysInternals CacheSet , nhưng việc nhấp vào "Clear" không dẫn đến sự gia tăng có thể đo lường được (khôi phục về thời gian sau khi khởi động nguội) trong thời gian đọc lại các tệp mà tôi vừa đọc một vài lần.



1
Tại sao câu hỏi này bị xóa ?
Dan Dascalescu

Câu trả lời:


82

Sử dụng ứng dụng RAMMap của SysInternal .

rammap trống ở chế độ chờ

Tùy chọn menu Empty / Empty Standby List sẽ xóa bộ đệm tệp Windows.


2
RAMMap không chạy trên Windows XP. Các tùy chọn menu đó có khác gì so với nút "Clear" trong ứng dụng SysInternals Cacheset không?
Stephen Denne

@stephen kỹ thuật này hoạt động hoàn hảo đối với tôi trong Windows 8! Windows XP hiện đã 12 tuổi, có lý do gì bạn không thể thử tính năng này trên Vista, Windows 7 hoặc Windows 8?
Jeff Atwood

@Jeff Tôi không còn làm việc với những hạn chế đó nữa. Vì vậy, "Danh sách chờ trống" kết quả trong lần đọc tiếp theo từ một tệp đã đọc gần đây yêu cầu IO đĩa?
Stephen Denne

2
Nhấn F5 để cập nhật danh sách tập tin sau khi nhấp vào danh sách chờ rỗng
JoshG

3
Đối với phương pháp tiếp cận có lập trình, hãy xem bài đăng SO này: stackoverflow.com/a/23085045/430360
Snemarch

16

Đối với Windows XP, bạn có thể xóa bộ nhớ cache cho một tệp cụ thể bằng cách mở tệp bằng CreateFile với các tùy chọn FILE_FLAG_NO_BUFFERING và sau đó đóng xử lý. Điều này không được ghi lại và tôi không biết liệu nó có hoạt động trên các phiên bản Windows mới hơn hay không, nhưng tôi đã sử dụng điều này từ lâu khi viết mã thử nghiệm để so sánh các thư viện nén tệp. Tôi không nhớ liệu quyền truy cập đọc hoặc ghi có ảnh hưởng đến thủ thuật này hay không.


Hoạt động hoàn hảo cho tôi trên Windows 7 SP1, x64. Mẹo hay!
cxxl 22/10/12

2
Vì vậy, điều đó phải được lặp lại cho mọi tệp ? Vì vậy, nếu ví dụ, bạn sao chép một thư mục chứa 100MB trải rộng trên 30 tệp trong 10 thư mục con, bạn phải mở từng tệp riêng biệt để đảm bảo rằng bạn đọc đĩa thực thay vì bộ nhớ cache?
Synetech

Các câu trả lời khác trên trang web khẳng định điều này cũng hoạt động trong Win7 và 8. Tôi cho rằng nó hoạt động trên vista. Và có, bạn phải chạy nó trên từng tệp, nhưng không mất nhiều thời gian. Tất cả những gì bạn cần làm là mở và đóng từng tệp, và khi bạn đóng, Windows sẽ xóa bộ nhớ cache. Sau khi bạn thực hiện xong việc này, THÌ bạn chạy kiểm tra hiệu suất của mình.
Mooing Duck,

1
Đây là một câu trả lời hoàn hảo. Mã đơn giản, hiệu quả và sẽ hoạt động trên hầu hết các hệ điều hành windows (bao gồm cả XP, tôi chỉ mới thử nghiệm trên Win7x64). Tôi đã mở các tệp với đặc quyền đọc và không chia sẻ. Không chắc chắn những gì kết hợp quan trọng.
Rosco

Chức năng tương tự trên Linux (2.4.10 trở đi) với cờ O_DIRECT trong cuộc gọi tổng hợp (2) mở. Chà, chính xác hơn, theo những gì tôi hiểu, O_DIRECT không xóa bộ nhớ cache cho tệp đó, tốt nhất là nên bỏ qua nó.
kaiwan

14

Googling cung cấp các tùy chọn này cho Linux

  1. Ngắt kết nối và gắn kết phân vùng chứa các tệp
  2. sync && echo 1 > /proc/sys/vm/drop_caches

2
Cảm ơn, điều đó trông rất hữu ích, mặc dù tôi có thể muốn lặp lại 3 thay vì 1. Tôi chủ yếu quan tâm đến Windows XP, đó là lý do tại sao tôi không tìm thấy điều đó trong googling của mình.
Stephen Denne

Thật không may, môi trường linux mà tôi có thể sử dụng, có phiên bản hạt nhân 2.6.9. drop_caches đã được bổ sung trong kernel 2.6.16
Stephen Denne

Rất nhiều bài viết khác mà tôi đã đọc đề xuất rằng bạn có thể ngắt kết nối và gắn kết hệ thống tệp để loại bỏ tất cả các mục bị thay đổi cho nó, tôi cho rằng đó là trường hợp trước 2.6.16 cũng như trong các hạt nhân gần đây hơn.
TafT

12

Một tiện ích dòng lệnh có thể được tìm thấy ở đây

từ nguồn:

EmptyStandbyList.exe là một công cụ dòng lệnh dành cho Windows (Vista trở lên) có thể làm trống:

  • quy trình làm việc bộ,
  • danh sách trang đã sửa đổi,
  • danh sách chờ (mức độ ưu tiên từ 0 đến 7) hoặc
  • chỉ danh sách chờ ưu tiên 0.

Sử dụng:

EmptyStandbyList.exe workingsets|modifiedpagelist|standbylist|priority0standbylist

3
Câu trả lời được đánh giá thấp giữa tất cả những ồn ào, tiện ích đơn giản thực hiện một công việc và làm tốt. Bạn có thể nên đưa thêm chi tiết vào câu trả lời để nhận được sự ủng hộ xứng đáng.
Prometheus


3

Tôi đã tìm thấy một kỹ thuật (ngoài việc khởi động lại) có vẻ hoạt động:

  1. Chạy một vài bản sao của MemAlloc
  2. Với mỗi cái, hãy phân bổ một vài lần bộ nhớ lớn
  3. Sử dụng Process Explorer để quan sát kích thước Bộ nhớ đệm Hệ thống giảm xuống mức rất thấp
  4. Thoát khỏi chương trình MemAlloc

Nó không có tính chọn lọc. Lý tưởng nhất là tôi muốn có thể xóa các phần cụ thể của bộ nhớ đang được sử dụng để lưu vào bộ đệm các khối đĩa của tệp mà tôi không muốn lưu vào bộ nhớ đệm nữa.


Điều đó có tác dụng phụ là đẩy nội dung vào tệp trang sẽ giết chết hiệu suất trong một thời gian khá dài sau đó. Nếu bạn định dùng đến k bùn, thì bạn cũng có thể chỉ đọc một số tệp lớn khác; ít nhất điều đó chỉ xóa bộ nhớ cache của đĩa và không có gì khác.
Synetech

3

Để có cái nhìn rõ hơn về Bộ đệm ẩn hệ thống tệp của Windows XP - hãy thử ATM của Tim Murgent - nó cho phép bạn xem cả kích thước Bộ đệm làm việc của hệ thống tệp và kích thước Danh sách chờ ở chế độ xem chi tiết và chính xác hơn. Đối với Windows XP - bạn cần có phiên bản cũ 1 của ATM có sẵn để tải xuống tại đâyV2V3 yêu cầu Server 2003, Vista hoặc cao hơn.

Bạn sẽ thấy rằng mặc dù Sysinternals Cacheset sẽ giảm "Cache WS Min" - dữ liệu thực tế vẫn tiếp tục tồn tại ở dạng danh sách Dự phòng từ nơi nó có thể được sử dụng cho đến khi được thay thế bằng thứ khác. Để thay thế nó bằng một thứ khác, hãy sử dụng một công cụ như MemAlloc hoặc flushmem của Chad Austin hoặc Consume.exe từ Công cụ Bộ tài nguyên Windows Server 2003 .


0

Như câu hỏi cũng được đặt ra cho Linux, có một câu trả lời liên quan ở đây .

Công cụ dòng lệnh vmtouch cho phép thêm và xóa các tệp và thư mục khỏi bộ đệm tệp hệ thống, trong số những thứ khác.


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.