Java 如何计算Unix环境下的CPU和IO时间
我有一个简单的Java 如何计算Unix环境下的CPU和IO时间,java,rest,unix,io,cpu-time,Java,Rest,Unix,Io,Cpu Time,我有一个简单的多线程程序,它正在调用一个外部API,并从该API获取响应。我正在使用restemplate 问题陈述:- 我想知道 这些调用的估计CPU和IO时间是多少? 我在Ubuntu工作 下面是我的程序- public class RestLnPTest { private final static Logger LOG = Logger.getLogger(NokiaLnPTest.class.getName()); private static int noOfThr
多线程程序
,它正在调用一个外部API
,并从该API获取响应。我正在使用restemplate
问题陈述:-
我想知道
这些调用的估计CPU和IO时间是多少?
我在Ubuntu工作
下面是我的程序-
public class RestLnPTest {
private final static Logger LOG = Logger.getLogger(NokiaLnPTest.class.getName());
private static int noOfThreads = 10;
public static void main(String[] args) {
ExecutorService service = Executors.newFixedThreadPool(noOfThreads);
try {
for (int i = 0; i < 100 * noOfThreads; i++) {
service.submit(new ThreadTask());
}
service.shutdown();
service.awaitTermination(Long.MAX_VALUE, TimeUnit.DAYS);
} catch (InterruptedException e) {
} catch (Exception e) {
} finally {
logHistogramInfo();
}
}
private static void logHistogramInfo() {
System.out.println(ThreadTask.lookupHistogram);
}
}
class ThreadTask implements Runnable {
public static ConcurrentHashMap<Long, AtomicLong> lookupHistogram = new ConcurrentHashMap<Long, AtomicLong>();
private static final String URL = "SOME_URL";
@Override
public void run() {
RestTemplate restTemplate = new RestTemplate();
long start = System.nanoTime();
String result = restTemplate.getForObject(URL, String.class);
long end = System.nanoTime() - start;
final AtomicLong before = lookupHistogram.putIfAbsent(end / 1000000, new AtomicLong(1L));
if (before != null) {
before.incrementAndGet();
}
}
}
公共类RestLnPTest{
private final static Logger LOG=Logger.getLogger(NokiaLnPTest.class.getName());
私有静态int noOfThreads=10;
公共静态void main(字符串[]args){
ExecutorService=Executors.newFixedThreadPool(noOfThreads);
试一试{
对于(inti=0;i<100*noOfThreads;i++){
提交(新线程任务());
}
service.shutdown();
服务。等待终止(Long.MAX_值,时间单位:天);
}捕捉(中断异常e){
}捕获(例外e){
}最后{
logHistogramInfo();
}
}
私有静态void logHistogramInfo(){
System.out.println(ThreadTask.lookupHistogram);
}
}
类ThreadTask实现可运行{
公共静态ConcurrentHashMap lookupHistogram=新ConcurrentHashMap();
私有静态最终字符串URL=“SOME_URL”;
@凌驾
公开募捐{
RestTemplate RestTemplate=新RestTemplate();
长启动=System.nanoTime();
String result=restTemplate.getForObject(URL,String.class);
long end=System.nanoTime()-开始;
之前的最终原子长度=查找直方图。putIfAbsent(结束/1000000,新原子长度(1L));
如果(在!=null之前){
before.incrementAndGet();
}
}
}
我在Ubuntu的命令行中运行上面的程序-
java-jarrest.jar
有谁能告诉我在Unix环境中如何逐步计算出这些调用的CPU
和IO时间
?。我只需要粗略估计这些调用。如果“外部调用”是外部应用程序的执行(例如通过exec()
),那么(理论上)可以通过在time
中包装应用程序或使用ac
进程记帐工具来获得一些统计数据
但是,您似乎希望找出服务用于处理单个请求的资源。除了让服务本身测量和报告信息之外,没有其他方法可以获得这些信息
您可以从外部(即从客户端)捕获的唯一内容是每个请求的运行时间。您可以在此线程上找到
cpu使用情况。一点背景-我正在提交容量请求,以确保我们的箱子在我们主持服务时能够处理流量。所以容量人员问我-知道这些调用的CPU和IO时间估计是多少吗?
所以我想,我可以在Unix环境中计算出这些数字?这就是为什么我写了一个示例程序来获取这些数字,每当我们的服务准备就绪时,我也会做同样的事情来计算CPU和IO时间。是的,您需要在服务器端进行测量。客户端无法从该粒度获取信息。感谢Stephen的建议。你能告诉我怎么做吗?这是我不确定的部分。任何帮助都将不胜感激。使用ThreadMXBean API——它提供JVM中可用的所有相关信息。