2013-03-27 41 views
0

对于我们的项目,开发网络压力测试工具,我们是洪水包到整个子网。我们有一个Runnable类,它接收一个端口和广播地址,并在一段时间(!Thread.currentThread()。isInterrupted)循环中发送一个特定的数据包。然后我们有一个主类,遍历每个网络接口和每个可能的端口,并将Runnable类添加到具有1000个线程固定池的ExecutorService。问题是,如果ExecutorService等待当前的1000个线程完成处理,他们永远不会因为它们处于while循环。但是,启动每个线程(65536 *个接口)会占用太多的内存。我们正在寻找一种在线程中循环的方式,这样他们都有机会运行一段时间并节省内存,同时仍然保持较高的网络输出。如何通过多线程周期中的Java

+3

你是否正在邪恶? – pamphlet 2013-03-27 20:31:27

+0

我不认为我会为这项工作做出贡献。 – Randy 2013-03-27 20:35:58

回答

0

我想你可能会从更多的线程总是给人更高的吞吐量的误解是痛苦。通常情况并非如此。

您的应用程序很可能会是CPU绑定,或网卡的吞吐量的约束。强制OS兼顾线程对这些资源的竞争数以万计是会增加你的吞吐量。大量的线程只有在线程花费大部分时间等待一些高容量的外部资源(例如数据库)时才有用。既然你只是爆炸包装,并且(大概)对任何反应都不感兴趣,那么就没有自然的等待点。

我会建议你有处理器和/或网络卡(取小者),你只为多线程。

+0

因此,它会同样使用一个线程?我认为更多的线程会更快,因为当我创建了一个端口扫描程序,每个端口有一个超时时间时,多线程可以大大加快程序的速度。 – Samuel 2013-03-27 20:52:45

+0

这可能仍然是多线程的,特别是因为单个线程的进展速度会更慢,阻塞等待来自网络的回复。单线程是一个很好的考虑因素(因为线程经常被滥用),但是这里仍然有一个有效的用例... – Krease 2013-03-27 20:57:12

+1

您使用TCP数据包还是单播?如果你正在等待ACK,多线程将提供一些好处。但仅限于一个极限。他们很快就会相互对抗。尝试1,5,10,50等数字,找到最佳位置。 – pamphlet 2013-03-27 21:05:12

0

而不是使每个线程始终运行完成或“永远”,使线程执行一个小的,定义明确的工作集,然后将它们重新添加到执行程序。这种高层次的管理可以通过一个'控制器'风格的对象来完成,该对象通过一系列新的步骤来执行向执行器队列重新添加任务。

例如,如果每个任务都有1000步,以重复执行: - 任务1运行步骤1-100,然后通过加入本身回用于步骤101-200的执行程序队列完成 - 任务2得到机会同样执行(并完成) - 任务1现在位于队列中,因此它执行101-200,然后返回到201-300的执行器队列。 - 等到任务1到达结尾 - 901-1000 - 然后如果它想继续执行,则返回到1-100。

就你而言,不同的步骤可能是端口,不同的线程代表不同的广播地址 - 按照你认为合适的方式分解它。