原始问题
是否有启发式或算法以编程方式找出我可以打开多少个线程以获得异步操作的最大吞吐量,例如在套接字上写入?
进一步解释问题
我正在协助我大学里的算法教授,他发布了一项任务,让学生们学习分布式计算的基础知识,用他的话说:套接字......分配是创建一个监听给定的“服务器” port,接收一个字符串,对它执行一个简单的操作(我认为它应该计算它的长度)并返回Ok或Rejected ...“服务器”必须能够处理每秒至少60k的子帧...我的工作是创建一个小应用程序来模拟60K客户......
我已经设法在大学实验室中自动分发服务器和客户端,以便一次测试10台服务器(网络基础设施成为瓶颈),问题在于:实验室是同质的,2个实验室是不!如果没有正确调整,“客户”通常无法模拟60k用户并向我报告,特别是当实验室较旧时, AND 我想向学生提供客户,以便他们可以更可靠地测试他们自己的“服务器”...确定产生的最佳线程数的能力现在变得至关重要! PS:Fire-and-Forget不是一个选项,因为客户端也测试返回的值是否正确,例如,如果我发送“短句”,我知道结果将被“拒绝”,我必须检查... < / p>
一个班级有60名学生......还有早班和夜班,所以每周会有120个“服务器”进行测试,因为学期沿着“服务器”部分移动将需要做更多的事情,客户没有(它总是只发送一个字符串并收到“Ok”/“Rejected”)......所以有足够的工作要做,以证明我正在做的所有这些工作......
EDIT1
- 从控制台更改为异步操作
- 我不想要最大线程数,我想要提供最大吞吐量的数字!我想在6芯电脑上,这个数字将高于2芯电脑
EDIT2
- 我正在构建一个简单的控制台应用程序,以在另一个应用程序中执行一些测试...其中一个是一种特定的负载测试(RUDY攻击),我必须模拟许多客户端执行特定攻击...事情是吞吐量和线程数之间存在曲线,在给定点之后,打开更多线程实际上会降低我的吞吐量......
EDIT3
为初始问题添加了更多上下文...
答案 0 :(得分:3)
Windows控制台实际上是由多个线程使用,否则会得到交错写入。因此,最大控制台输出的线程数将是一个。
当你进行计算时,多线程是有意义的。然后,在每个逻辑处理器上使用多个线程很少有用 - 或者在单核处理器上的UI应用程序的UI线程上使用一个后台线程加上。
答案 1 :(得分:2)
这完全取决于具体情况 - 所以对你的问题的实际答案“是否有一个神奇的算法可以为我提供最佳吞吐量的完美设置?”是......不。
当然,更多核心意味着可以运行更多线程并减少上下文切换。也就是说,您已经编辑了您的问题以包含一个IO限制的示例。 IO绑定操作通常使用完成端口进行异步操作。因此,在这种特殊情况下,删除使用自己的专用线程进行此类操作将是实现最大吞吐量的主要关注点。
答案 2 :(得分:1)
由于您更改了问题,我将提供另一个答案。
这取决于工作量。如果您正在执行计算繁重的任务,那么请使用每个逻辑处理器。如果您正在执行IO,则使用异步调用而不是生成新线程。
当然,.NET有一种方法可以为您管理 - 线程池。用它。不要担心你需要多少线程,只需启动任务。
答案 3 :(得分:0)
如果您实际上正在尝试做一些有效的事情(而不是仅仅打印到控制台),您应该使用System.Threading.Tasks.Task.Factory.StartNew。您可以根据需要启动任意数量的任务。运行时将尽可能在可用的硬件线程中分发它们。