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中可用的所有相关信息。