संलग्न सरल जावा कोड को सही पैरामीटर के साथ शुरू करते समय सभी उपलब्ध सीपीयू कोर लोड करना चाहिए। तो उदाहरण के लिए, आप इसेयह जावा कोड सभी CPU कोर का उपयोग क्यों नहीं करता है?
जावा VMTest 8 पूर्णांक 0
के साथ शुरू और यह 8 धागे कि पाशन और एक पूर्णांक के लिए 2 जोड़ने की तुलना में और कुछ भी नहीं शुरू कर देंगे। कुछ जो रजिस्टरों में चलता है और न ही नई मेमोरी आवंटित करता है।
अब हम जिस समस्या का सामना कर रहे हैं वह यह है कि हमें इस सरल कार्यक्रम (पाठ्यक्रम के 24 धागे के साथ) चलाने पर 24 कोर मशीन लोड (एएमडी 2 सॉकेट प्रत्येक 12 कोर) नहीं मिलती है। इसी तरह की चीजें प्रत्येक 12 धागे या छोटी मशीनों के 2 कार्यक्रमों के साथ होती हैं।
तो हमारा संदेह यह है कि जेवीएम (लिनक्स x64 पर सूर्य जेडीके 6u20) अच्छी तरह से स्केल नहीं करता है।
क्या कोई भी इसी तरह की चीजें देखता है या उसे चलाने की क्षमता है और रिपोर्ट करता है कि यह उसकी मशीन (> = 8 कोर केवल कृपया) पर अच्छा प्रदर्शन करता है या नहीं? विचार?
मैंने 8 कोर के साथ अमेज़ॅन ईसी 2 पर भी कोशिश की, लेकिन वर्चुअल मशीन वास्तविक बॉक्स से अलग दिखती है, इसलिए लोडिंग पूरी तरह से अजीब व्यवहार करती है।
package com.test;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
public class VMTest
{
public class IntTask implements Runnable
{
@Override
public void run()
{
int i = 0;
while (true)
{
i = i + 2;
}
}
}
public class StringTask implements Runnable
{
@Override
public void run()
{
int i = 0;
String s;
while (true)
{
i++;
s = "s" + Integer.valueOf(i);
}
}
}
public class ArrayTask implements Runnable
{
private final int size;
public ArrayTask(int size)
{
this.size = size;
}
@Override
public void run()
{
int i = 0;
String[] s;
while (true)
{
i++;
s = new String[size];
}
}
}
public void doIt(String[] args) throws InterruptedException
{
final String command = args[1].trim();
ExecutorService executor = Executors.newFixedThreadPool(Integer.valueOf(args[0]));
for (int i = 0; i < Integer.valueOf(args[0]); i++)
{
Runnable runnable = null;
if (command.equalsIgnoreCase("int"))
{
runnable = new IntTask();
}
else if (command.equalsIgnoreCase("string"))
{
runnable = new StringTask();
}
Future<?> submit = executor.submit(runnable);
}
executor.awaitTermination(1, TimeUnit.HOURS);
}
public static void main(String[] args) throws InterruptedException
{
if (args.length < 3)
{
System.err.println("Usage: VMTest threadCount taskDef size");
System.err.println("threadCount: Number 1..n");
System.err.println("taskDef: int string array");
System.err.println("size: size of memory allocation for array, ");
System.exit(-1);
}
new VMTest().doIt(args);
}
}
अतिरिक्त जानकारी। बस पता चला कि जेडीके का 64 बिट संस्करण 32 बिट संस्करण (लगभग 45%) की तुलना में कोर मार्ग को बेहतर (लगभग 9 0%) लोड करता है। जो अजीब है, क्योंकि ओएस और एएमडी सीपीयू 32 बिट का समर्थन करते हैं और मैं उस परीक्षण के दौरान कोई मेमोरी ऑपरेशन नहीं चलाता हूं। – ReneS
बस समझने के लिए - आप invokeAll (..) विधि का उपयोग क्यों नहीं करते? और आप कॉलबेल का उपयोग क्यों नहीं करते हैं, जहां तक मुझे पता है, रननेबल java.concurrent का हिस्सा नहीं है? – InsertNickHere
आपको अन्य चल रही प्रक्रियाओं के लिए भी देखना चाहिए। क्या आपने सीपीयू समय लेने वाले अन्य प्रोगाम्स/प्रक्रियाओं के साथ "साफ" रन बनाया था? – InsertNickHere