Borrar caché de archivos para repetir las pruebas de rendimiento

¿Qué herramientas o técnicas puedo usar para eliminar el contenido del archivo en caché para evitar que mis resultados de rendimiento se vean sesgados? Creo que necesito borrar completamente o eliminar selectivamente la información almacenada en caché sobre los contenidos de archivos y directorios.

La aplicación que estoy desarrollando es una utilidad de compresión especializada, y se espera que trabaje mucho leyendo y escribiendo archivos que el sistema operativo no ha tocado recientemente, y cuyos bloques de disco es poco probable que se guarden en caché.

Deseo eliminar la variabilidad que veo en el tiempo IO cuando repito la tarea de perfilar diferentes estrategias para hacer el trabajo de procesamiento de archivos.

Principalmente estoy interesado en las soluciones para Windows XP, ya que esa es mi principal máquina de desarrollo, pero también puedo probar usando Linux, por lo que también estoy interesado en las respuestas para ese entorno.

Intenté SysInternals CacheSet , pero al hacer clic en “Limpiar” no obtuve un aumento mensurable (restablecimiento del tiempo después de un arranque en frío) en el tiempo para volver a leer los archivos que acabo de leer algunas veces.

Use la aplicación RAMMap de SysInternal .

rammap espera vacía

La opción de menú Vaciar / Vaciar lista de espera borrará la memoria caché de archivos de Windows.

Un rápido google le da estas opciones para Linux

  1. Desmontar y montar la partición que contiene los archivos
  2. sync && echo 1 > /proc/sys/vm/drop_caches

Para Windows XP, debe poder borrar el caché de un archivo específico abriendo el archivo usando CreateFile con las opciones FILE_FLAG_NO_BUFFERING y luego cerrando el manejador. Esto no está documentado, y no sé si funciona en versiones posteriores de Windows, pero lo usé hace mucho tiempo cuando escribía código de prueba para comparar bibliotecas de compresión de archivos. No recuerdo si el acceso de lectura o escritura afectó este truco.

He encontrado una técnica (aparte de reiniciar) que parece funcionar:

  1. Ejecuta algunas copias de MemAlloc
  2. Con cada uno, asigne grandes trozos de memoria unas cuantas veces
  3. Use Process Explorer para observar el tamaño de la caché del sistema reduciendo a niveles muy bajos
  4. Salga de los progtwigs MemAlloc

Sin embargo, no es selectivo. Idealmente, me gustaría poder borrar las porciones específicas de memoria que se utilizan para almacenar en caché los bloques de disco de los archivos que quiero que ya no se almacenen en caché.

  #include  int posix_fadvise(int fd, off_t offset, off_t len, int advice); 

con la opción de consejo POSIX_FADV_DONTNEED :
No se accederá a los datos especificados en el futuro cercano.

Para una vista mucho mejor de la memoria caché del sistema de archivos de Windows XP, prueba ATM por Tim Murgent : te permite ver el tamaño del conjunto de trabajo de la memoria caché del sistema de archivos y el tamaño de la lista de espera en una vista más detallada y precisa. Para Windows XP, necesita la versión anterior 1 de ATM que está disponible para descargar aquí, ya que V2 y V3 requieren Servidor 2003, Vista o superior.

Observará que aunque Sysinternals Cacheset reducirá el “Cache WS Min”, los datos reales aún continúan existiendo en forma de listas de espera, desde donde puede usarse hasta que se haya reemplazado por otra cosa. Para reemplazarlo con otra cosa, use una herramienta como MemAlloc o flushmem de Chad Austin o Consume.exe de las Herramientas del Kit de Recursos de Windows Server 2003 .

Una utilidad de línea de comandos se puede encontrar aquí

Como la pregunta también preguntaba por Linux, aquí hay una respuesta relacionada.

La herramienta de línea de comandos vmtouch permite agregar y eliminar archivos y directorios del caché de archivos del sistema, entre otras cosas.