Java 如何显示n theads的当前吞吐量?
想象一下,有n个线程都在SOAP端点上工作,以获取一些数据并将其存储到文件系统中。显示这些线程最后一秒的吞吐量的最佳方式是什么 我有以下想法: 所有32个线程(本例中为Java 如何显示n theads的当前吞吐量?,java,multithreading,algorithm,throughput,Java,Multithreading,Algorithm,Throughput,想象一下,有n个线程都在SOAP端点上工作,以获取一些数据并将其存储到文件系统中。显示这些线程最后一秒的吞吐量的最佳方式是什么 我有以下想法: 所有32个线程(本例中为n)都持有一个AtomicInteger,在将一个文件写入文件系统后,每个线程都会增加该值。然后由另一个线程(#33)对该AtomicInteger进行评估,该线程正好用于记录该AtomicInteger除以n个线程,通过使用度量(剩余条目总数/吞吐量)估计ETA将AtomicInteger重置为零,然后休眠一秒钟并继续循环,直到
n
)都持有一个AtomicInteger
,在将一个文件写入文件系统后,每个线程都会增加该值。然后由另一个线程(#33)对该AtomicInteger
进行评估,该线程正好用于记录该AtomicInteger
除以n个线程,通过使用度量(剩余条目总数/吞吐量)估计ETA将AtomicInteger
重置为零,然后休眠一秒钟并继续循环,直到所有线程完成其工作
然而,这有以下问题:AtomicInteger的锁定将导致性能的一些损失(虽然我认为它可以忽略不计),并且输出永远不会是最后一秒,因为锁定时间会有一些变化。 有谁能想出一个更优雅的解决这个问题的办法吗?我想我可能是想得太多了,Java已经有了一些解决方案
即使可能有第三方的解决方案或软件包,我也希望了解如何正确地完成这项工作,而不仅仅是使用软件包线程由执行器服务生成,所有线程都是可运行的。最简单的方法是仅第n次更新,例如,如果AtomicInteger是瓶颈,则仅每100次调用更新一次。我建议首先使用Atomicinteger,只有当您发现有问题时,才使用更复杂的解决方案。
例如,有用于采样统计信息的库,但由于您只想测量一个端点,这不符合您的需要。最简单的方法是只更新第n次,例如,如果AtomicInteger是瓶颈,则仅每100次调用更新一次。我建议首先使用Atomicinteger,只有当您发现有问题时,才使用更复杂的解决方案。
例如,有用于抽样统计的库,但由于您只想测量一个端点,因此这不符合您的需要。我认为您对指标收集有一个非常定制的要求。我怀疑是否有任何度量集合库能够满足您的期望。也许是测微计计数器 问题根源: 您正试图由n+1个工作进程同时读取和写入同一资源。该用例允许您使用分散/聚集模式的变体,其中一个工人可以聚合n个工人的工作,n个工人可以读取/写入他们自己拥有的n个资源 假设: 我假设您对列表或数组中的所有线程都有引用,并且没有超过
Integer.MAX\u VALUE
的文件
解决方案:
您可以在每个线程中使用volatile int
作为组合,而不是从外部传递AtomicInteger
。这些计数器将单调递增,并且永远不会在计算线程中修改或重置
您可以在计算线程中保留int值的本地副本,并从新值中减去此本地副本,以获得在最后一秒处理的文件,并使用新值更新本地副本(这相当于将每个线程的计数器重置为0)。或者,如果可以,您可以只跟踪计数器的总和,而不是存储每个线程的计数器
class Computation implements Runnable {
List<Worker> workerList;
int[] localCounters;
boolean finished;
public Computation(List<Worker> workerList) {
this.workerList = workerList;
this.localCounters = new int[workerList.size()];
}
@Override
public void run() {
while (!finished) {
for (int i = 0; i < workerList.size(); i++) {
localCounters[i] = workerList.get(i).getCounter();
}
computation();
pause();
}
}
private void computation(){
//do your computation with localCounters
//this.localCounters[x]
}
private boolean isFinished () {
return finished;
}
private void pause() {
try {
Thread.sleep(1000L);
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
}
class Worker implements Runnable {
private volatile int counter;
@Override
public void run() {
// do your thing.
}
public int getCounter() {
return counter;
}
}
类计算实现可运行{
列表工作列表;
int[]本地计数器;
布尔完成;
公共计算(列表工作列表){
this.workerList=workerList;
this.localCounters=newint[workerList.size()];
}
@凌驾
公开募捐{
当(!完成){
对于(int i=0;i
我认为您对指标收集有一个非常定制的要求。我怀疑是否有任何度量集合库能够满足您的期望。也许是测微计计数器
问题根源:
您正试图由n+1个工作进程同时读取和写入同一资源。该用例允许您使用分散/聚集模式的变体,其中一个工人可以聚合n个工人的工作,n个工人可以读取/写入他们自己拥有的n个资源
假设:
我假设您对列表或数组中的所有线程都有引用,并且没有超过Integer.MAX\u VALUE
的文件
解决方案:
您可以在每个线程中使用volatile int
作为组合,而不是从外部传递AtomicInteger
。这些计数器将单调递增,并且永远不会在计算线程中修改或重置
您可以在计算线程中保留int值的本地副本,并从新值中减去此本地副本,以获得在最后一秒处理的文件,并使用新值更新本地副本(这将相当于重置co