2016-03-15 31 views
0

我有一个带有2个物理CPU的服务器,它们共有24个核心和10 GB RAM。 PHP程序正在计算一个统计信息,我可以运行每个部分完全独立于其他部分。一旦所有计算完成,我只需要“合并”它们。使用PHP pthreads运行600多个线程 - 开销如何

因此,我有想法在由“pthread”创建/控制的单独线程中执行每个计算阶段。 每个计算需要大约0,10秒,但计算量可以在序列化时花费很长时间。

我的问题:

  1. 创建一个新的 “主题” 和 “并行线程” 的时候有没有限制?
  2. 创建新线程时的开销是多少?我必须考虑这个以避免新的延迟。

我可以想象,几秒钟的负载会非常高,但是一旦每次计算完成,它会突然结束。这不是问题。这是“我的”服务器,我不必关心其他用户[或者它是共享服务器时]。

+0

1)您的服务器。您还应该注意,如果您有24个内核,并且您的应用程序确实是计算密集型的而不是IO密集型的,那么使用24个以上的线程将不会提高您的性能。你应该把你的工作量分成24个数据包,并为每个数据包启动一个线程(如果你另外有超线程,则为48)。任何更多的线程都不会让你的CPU更快,但是由于开销,你的进程会变慢。 2)确切的数字,你只需要尝试。它很大程度上取决于硬件,软件,操作系统,[...] –

+0

@FranzGleichmann我现在发布我的答案,并在我的测试中,您的帖子已被确认。 –

回答

1

虽然“等待”答案:-)我开始重写班级。

我可以总结它像这样:

  1. 没有办法立刻启动600个线程。我期待它,但我想知道限制在哪里。我的配置“允许”大约160个线程启动。
  2. 当启动超过这150个线程时,PHP脚本停止工作,没有进一步通知。
  3. 由于Franz Gleichmann指出,当开始大量的线程时,整个过程需要更长的时间。我发现20个线程的性能最好。
  4. 实现的业绩增长在20%到50%之间 - 我很满意。
  5. 我不知道这是否是pthread库中的错误,但我无法访问任何类成员。我不得不将这个班级成员移到这个函数中。由于计算在一个函数中,所以不会打扰我,我也没有进一步调查。
+1

通过优化您的数据结构似乎有很大的潜力进一步改进。理论上,24核心性能可能是性能的24倍,并具有足够低的开销和高工作负载。你应该在你的代码的每个部分对你的瓶颈进行基准测试。如果您的20-50%仅用于多线程部分,而不是用于整个应用程序,那么对于双核系统而非24核系统似乎更为现实。 –

+0

@FranzGleichmann计算不是问题/瓶颈。与计算的运行时间相比,确实是启动线程的开销。 –

+0

@FranzGleichmann我以这种方式改进了我的线程调度程序,而不是每个线程处理一个计算,现在线程处理更多的计算并且性能增益不可思议:高达90%。正如我写的,启动Pthread的开销可能是一个瓶颈...... –

相关问题