如何确定高延迟网络请求的最佳线程数?

海狼

我正在编写一个必须发出数千个网络请求的实用程序。每个请求仅收到一个小数据包作为响应(类似于ping),但可能要花费几秒钟才能完成。处理每个响应仅需一行(简单)代码即可。

这样做的最终结果是,计算机不受IO约束,文件系统约束或CPU约束,它仅受响应延迟的约束。

这类似于但相同有一种确定理想线程数的方法吗?确定最佳线程数的Java最佳方法[重复] ...主要区别在于,我仅受延迟限制。

我正在使用一个ExecutorService对象来运行线程,并使用aQueue<Future<Integer>>跟踪需要获取结果的线程:

ExecutorService executorService = Executors.newFixedThreadPool(threadPoolSize);
Queue<Future<Integer>> futures = new LinkedList<Future<Integer>>();

for (int quad3 = 0 ; quad3 < 256 ; ++quad3) {
    for (int quad4 = 0 ; quad4 < 256 ; ++quad4) {
        byte[] quads = { quad1, quad2, (byte)quad3, (byte)quad4 };
        futures.add(executorService.submit(new RetrieverCallable(quads)));
    }
}

...然后,我将队列中的所有元素出队,并将结果放入所需的数据结构中:

int[] result = int[65536]
while(!futures.isEmpty()) {
    try {
        results[i] = futures.remove().get();
    } catch (Exception e) {
        addresses[i] = -1;
    }
}

我的第一个问题是:这是跟踪所有线程的合理方法吗?如果线程X需要一段时间才能完成,那么许多其他线程可能会在X之前完成。线程池会耗尽自己等待打开的插槽的时间,还是ExecutorService对象以一种方式来管理线程池,即将已完成但尚未处理的线程移出可用的插槽,以便其他线程开始?

我的第二个问题是我可以使用什么准则来找到进行这些调用的最佳线程数?我什至不知道这里的量级指导。我知道它在256个线程中可以很好地工作,但是在1024个线程中似乎花费了大致相同的时间。CPU利用率徘徊在5%左右,因此这似乎不是问题。有这么多线程,比较不同数量我应该考虑什么指标?显然,处理批处理的总时间,每个线程的平均时间...还有什么?记忆是一个问题吗?

这会让您感到震惊,但是您不需要任何I / O线程(从数量上讲,这意味着0个线程)。您已经研究多线程不会增加您的网络带宽,这是很好的。现在,该知道线程进行计算了。他们没有进行(高延迟)通信。通信由网络适配器执行,这是另一个过程,实际上与CPU并行运行。分配一个线程直到网络适配器完成其工作才休眠是很愚蠢的(请参阅分配此资源的先生们声称您需要1个线程您不需要I / O线程=您需要0个线程。

分配线程进行计算以与I / O请求并行进行是有意义的。线程数量将取决于计算与通信的比率,受CPU中内核数的限制

抱歉,我不得不说,尽管您当然暗示了阻止I / O的承诺,但仍有许多人不了解这一基本知识。采取建议,使用异步I / O,您会发现该问题不存在。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Grid Engine /多线程/多核/多CPU:如何确定最佳线程数?

来自分类Dev

延迟网络请求组

来自分类Dev

如何在python中确定GET请求的延迟

来自分类Dev

如何实现确定性单线程网络仿真

来自分类Dev

如何确定Matlab使用的线程数?

来自分类Dev

TPL如何确定要创建的线程数

来自分类Dev

如何检查网络延迟?

来自分类Dev

如何取消延迟的线程?

来自分类Dev

云运行出口网络高延迟

来自分类Dev

Windows网络复制产生高延迟

来自分类Dev

最佳线程数的原因

来自分类Dev

如何延迟http请求?

来自分类Dev

如何延迟Ajax请求?

来自分类Dev

确定基于系统硬盘的C#IO操作的最大线程数的最佳方法是什么?

来自分类Dev

确定方法使用的线程数

来自分类Dev

Android如何确定应用程序在“最近的位置请求”下是否具有“高电量消耗”?

来自分类Dev

RandomizedSearchCV如何确定最佳参数?

来自分类Dev

如何异步等待网络请求完成,而在主线程中处理结果?

来自分类Dev

由于WebSphere中有多个AJAX请求,如何处理高线程使用率

来自分类Dev

在Linux上模拟低带宽,高延迟的网络连接

来自分类Dev

是什么导致网络上的定期高延迟?

来自分类Dev

ListView到达末尾之前的网络请求。延迟加载

来自分类Dev

尽管maxSockets高,但Nodejs出站HTTP请求仍被延迟

来自分类Dev

在性能测试中如何避免网络延迟

来自分类Dev

请求如何确定响应的编码?

来自分类Dev

多线程网络刮板的最佳解决方案?

来自分类Dev

多线程网络刮板的最佳解决方案?

来自分类Dev

Python:确定要制造的线程数

来自分类Dev

Python:确定要制造的线程数

Related 相关文章

热门标签

归档