Mã Java đơn giản kèm theo sẽ tải tất cả lõi cpu có sẵn khi khởi động nó bằng các tham số phù hợp. Vì vậy, ví dụ, bạn bắt đầu nó vớiTại sao mã Java này không sử dụng tất cả các lõi CPU?
java VMTEST 8 int 0
và nó sẽ bắt đầu 8 chủ đề mà không phải làm gì khác hơn là lặp và thêm 2 đến một số nguyên. Một cái gì đó chạy trong sổ đăng ký và thậm chí không phân bổ bộ nhớ mới.
Vấn đề chúng ta đang gặp phải là chúng tôi không nhận được một máy 24 lõi được nạp (ổ cắm AMD 2 với 12 lõi), khi chạy chương trình đơn giản này (với 24 luồng khóa học). Những điều tương tự xảy ra với 2 chương trình mỗi 12 chủ đề hoặc máy nhỏ hơn.
Vì vậy, sự nghi ngờ của chúng tôi là JVM (Sun JDK 6u20 trên Linux x64) không mở rộng tốt.
Có ai nhìn thấy những thứ tương tự hoặc có khả năng chạy và báo cáo có chạy tốt trên máy của mình không (> = 8 lõi chỉ)? Ý tưởng?
Tôi đã thử trên Amazon EC2 với 8 lõi quá, nhưng máy ảo dường như chạy khác với một hộp thực, do đó tải hoạt động hoàn toàn lạ.
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);
}
}
Thông tin bổ sung. Chỉ cần phát hiện ra rằng phiên bản 64bit của JDK tải lõi tốt hơn (khoảng 90%) so với phiên bản 32bit (khoảng 45%). Đó là lạ, bởi vì hệ điều hành và CPU cpu hỗ trợ 32bit và tôi không chạy bất kỳ hoạt động bộ nhớ trong thử nghiệm đó. – ReneS
Chỉ để hiểu - tại sao bạn không sử dụng phương thức invokeAll (..)? Và tại sao bạn không sử dụng callables, theo như tôi biết, runnable không phải là một phần của java.concurrent? – InsertNickHere
Bạn cũng nên xem các quy trình đang chạy khác. Bạn đã thực hiện một "sạch" chạy, không có progamms khác/quá trình lấy cpu thời gian? – InsertNickHere