【问题标题】:Running 600+ threads with PHP pthreads - what about the overhead使用 PHP pthread 运行 600 多个线程 - 开销呢
【发布时间】:2016-03-15 21:38:40
【问题描述】:

我有一个带有 2 个物理 CPU 的服务器,它们共有 24 个内核和 10 GB RAM。 PHP 程序正在计算一个统计数据,我可以完全独立地运行每个部分。所有计算完成后,我只需“合并”它们。

因此,我产生了在由“pthread”创建/控制的单独线程中执行每个计算阶段的想法。 每个计算大约需要 0.10 秒,但计算量让它们在序列化时需要很长时间。

我的问题:

  1. 使用“pthreads”创建新“线程”时是否有限制?
  2. 创建新线程时的开销是多少?我必须考虑这一点以避免新的延误。

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

【问题讨论】:

  • 1) 你的服务器。您还应该注意,如果您有 24 个内核并且您的应用程序确实是计算密集型而不是 IO 密集型,则使用超过 24 个线程不会提高您的性能。您应该将您的工作负载划分为 24 个数据包,并为每个数据包启动一个线程(或 48 个,如果您还有超线程)。更多的线程不会让你的 CPU 更快,但你的进程会因为开销而变慢。 2)对于确切的数字,您只需尝试即可。它在很大程度上取决于硬件、软件、操作系统、[...]
  • @FranzGleichmann 我现在发布了我的答案,在我的测试中,您的帖子已得到确认。

标签: php multithreading pthreads


【解决方案1】:

在“等待”答案的同时 :-) 我开始重写课程。

我可以这样总结:

  1. 无法一次启动 600 个线程。我预料到了,但我想知道极限在哪里。我的配置“允许”启动大约 160 个线程。
  2. 当启动超过这 150 个线程时,PHP 脚本会停止工作,恕不另行通知。
  3. 正如Franz Gleichmann 指出的那样,启动大量线程时整个过程花费的时间更长。我发现启动 20 个线程的性能最好。
  4. 实现的性能提升介于 20% 和 50% 之间 - 我很满意。
  5. 我不知道这是否是pthread 库中的错误,但我无法访问任何类成员。我不得不在函数内移动类成员。由于计算是在一个函数中,它没有打扰我,我也没有进一步调查。

【讨论】:

  • 看来通过优化您的数据结构进一步改进的潜力很大。理论上,24 核可能等于性能的 24 倍,而开销足够低,工作负载也足够高。您应该对代码中瓶颈所在的每个部分进行基准测试。如果您的 20-50% 仅用于多线程部分而不是整个应用程序,那么对于双核系统而不是 24 核系统来说似乎更现实。
  • @FranzGleichmann 计算不是问题/瓶颈。与计算的运行时间相比,这确实是启动线程的开销。
  • @FranzGleichmann 我改进了我的线程分派器,现在不是每个线程处理一个计算,而是一个线程处理更多的计算,性能提升令人难以置信:高达 90%。正如我所写,启动 Pthread 的开销可能是一个瓶颈......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多