Forzar JVM para hacer todo el IO sin caché de página (por ejemplo, O_DIRECT)

Estoy haciendo algunos puntos de referencia de una aplicación escrita en Java. Es muy importante para los experimentos que los resultados no estén influenciados por el caché de la página (estoy usando Linux)

Así que la mejor manera de evitar el caché de la página es usar O_DIRECT cada vez que se abre un archivo. Por lo tanto, cambié el código respectivo en el código fuente del jre.

Mi enfoque funciona perfectamente para todo lo que pasa por elFileOutputStream (por ejemplo, la escritura), pero no funciona paraFileInputStream (por ejemplo, la lectura).

Al agregar O_DIRECT a la llamada abierta deFileInputStream, la JVM no puede cargar ninguna clase:

Error: Could not find or load main class perf.TestDirectIO

Este error no es un problema de ruta de clase, ya que puedo solucionarlo simplemente usando una JVM "no procesada".

Así que parece que hay un problema con la apertura de archivos.

Estoy muy contento con cualquier consejo sobre cómo solucionar el problema.

Si alguien alguna vez quiere hacer algo similar, heDocumentado todo el hack en mi blog..

Como referencia, estos son los cambios en el código JVM que hice:

jdk/src/share/native/java/io/FileInputStream.c:

 @@ -58,7 +60,8 @@
 JNIEXPORT void JNICALL
 Java_java_io_FileInputStream_open(JNIEnv *env, jobject this, jstring path) {
-    fileOpen(env, this, path, fis_fd, O_RDONLY);
+    fileOpen(env, this, path, fis_fd, O_RDONLY | O_DIRECT); // this is the change that causes all the problems
 }

Este cambio funciona:jdk/src/solaris/native/java/io/FileOutputStream_md.c:

@@ -55,8 +55,10 @@
 JNIEXPORT void JNICALL
 Java_java_io_FileOutputStream_open(JNIEnv *env, jobject this,
                                    jstring path, jboolean append) {
     fileOpen(env, this, path, fos_fd,
-             O_WRONLY | O_CREAT | (append ? O_APPEND : O_TRUNC));
+             O_WRONLY | O_DIRECT | O_CREAT | (append ? O_APPEND : O_TRUNC));
 }

También cambié el hotspot jre para asegurar que la memoria esté alineada (eso es un requisito para O_DIRECT)hotspot/src/share/vm/runtime/os.cpp:

+# include <mm_malloc.h>
...
-  u_char* ptr = (u_char*)::malloc(size + space_before + space_after);
+  u_char* ptr = (u_char*)::_mm_malloc(size + space_before + space_after,512);

Respuestas a la pregunta(3)

Su respuesta a la pregunta