मैं जावा में लिखे गए किसी एप्लिकेशन के कुछ मानक कर रहा हूं। प्रयोगों के लिए यह बहुत महत्वपूर्ण है कि परिणाम पृष्ठ कैश से प्रभावित नहीं हैं (मैं लिनक्स का उपयोग कर रहा हूं)पृष्ठ कैश के बिना सभी आईओ करने के लिए JVM को मजबूर करें (उदा। O_DIRECT)
तो पृष्ठ कैश से बचने का सबसे अच्छा तरीका O_DIRECT का उपयोग कर रहा है जब भी कोई फ़ाइल खोली जाती है। इसलिए मैंने जेरे के स्रोत कोड में संबंधित कोड बदल दिया।
मेरा दृष्टिकोण FileOutputStream
(उदा। लेखन) के माध्यम से जाने वाली सभी चीज़ों के लिए पूरी तरह से काम करता है, लेकिन यह FileInputStream
(उदा। पढ़ने) के लिए काम नहीं करता है।
जब FileInputStream
की खुली कॉल करने के लिए O_DIRECT जोड़ने, JVM किसी भी कक्षा लोड करने में असमर्थ है: बस एक "unhacked का उपयोग करके
Error: Could not find or load main class perf.TestDirectIO
यह त्रुटि एक classpath मुद्दा नहीं है, के बाद से मैं इसे ठीक कर सकते हैं "जेवीएम।
तो फाइलें खोलने के साथ एक समस्या प्रतीत होती है।
मैं इस मुद्दे को ठीक करने के तरीके पर किसी भी सलाह के बारे में बहुत खुश हूं।
यदि कोई भी कभी ऐसा कुछ करना चाहता है, तो मेरे पास documented the whole hack in my blog है।
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
}
यह परिवर्तन काम करता है: 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));
}
एक संदर्भ के रूप में, इन JVM कोड मैं वैसा ही किया पर परिवर्तन कर रहे हैं मैंने टी को सुनिश्चित करने के लिए हॉटस्पॉट जेरे भी बदल दिया
+# 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);
क्या आप पुराने और नए जेडीके दोनों के लिए 'strace -f' के आउटपुट की तुलना कर सकते हैं? मुझे लगता है, कुछ I/O कोड विफल रहता है, उदा। O_DIRECT सीमाओं के कारण पढ़ने के सिस्कोल पर (चेक 'मैन 2 ओपन', सेक्शन नोट्स => ओ_DIRECT) – osgx
यहां स्ट्रेस आउटपुट है: http://privatepaste.com/download/a1ef2d78ac I मुझे कोई स्पष्ट कारण नहीं दिख रहा है विफलता। –
आपने अनलिखित आकार के साथ 'पढ़ा' है जिसके परिणामस्वरूप EINVAL त्रुटि हुई है (कोई फ़ॉलबैक लागू नहीं किया गया था)। – osgx