一尘不染

您如何在PHP / MySQL应用程序中充分利用多核CPU?

mysql

我维护一个定制的类似CMS的应用程序。

每当提交文档时,都会执行一些任务,这些任务可以大致分为以下几类:

  1. MySQL查询。
  2. HTML内容解析。
  3. 搜索索引更新。

类别1包括对与文档内容有关的各种MySQL表的更新。

类别2包括对存储在MySQL LONGTEXT字段中的HTML内容的解析,以执行一些自动锚标记转换。我怀疑此任务花费了大量计算时间。

类别3仅使用与文档相对应的几个字段就对基于MySQL的简单搜索索引进行了更新。

所有这些任务都需要完成,才能将文档提交视为已完成。

承载此应用程序的计算机具有双四核Xeon处理器(总共8个内核)。但是,无论何时提交文档,所有执行的PHP代码都被限制为在一个内核上运行的单个进程。

我的问题:

您使用什么方案(如果有)在多个CPU内核之间分配PHP / MySQL
Web应用程序处理负载?我理想的解决方案基本上是产生几个进程,让它们在多个内核上并行执行,然后阻塞直到所有进程完成。

相关问题:

您最喜欢的PHP性能分析工具是什么?


阅读 998

收藏
2020-05-17

共1个答案

一尘不染

PHP并非完全面向多线程:正如您已经注意到的,每个页面都由一个PHP进程提供服务-一次只做一件事,包括在数据库服务器上执行SQL查询时仅“等待”。

不幸的是,您无能为力:这就是PHP的工作方式。

不过,这里有一些想法:

  • 首先,您的服务器上可能一次拥有一个以上的用户,这意味着您将同时提供多个页面,这又意味着您将运行多个PHP进程和SQL查询同时…这意味着将使用服务器的多个核心。
    • 每个PHP进程将响应一个用户的请求而在一个内核上运行,但是Apache并行运行了几个子进程 (每个请求一个 子进程 ,最多可以数十个或数百个,具体取决于您的配置)
    • MySQL服务器是多线程的,这意味着它可以使用几个不同的核心来回答多个并发请求-即使每个请求不能由一个以上的核心服务。

因此,实际上,您服务器的8个核心将最终被使用;-)

而且,如果您认为自己的页面生成时间过长,则可能的解决方案是将计算结果分成两组:

  • 一方面,生成页面必须要做的事情:对于这些来说,您无能为力
  • 另一方面,某些事情有时必须运行,但不一定立即运行
    • 例如,我正在考虑一些统计数据计算:您希望它们是最新的,但是如果它们落后几分钟,那通常就可以了。
    • 电子邮件发送同样如此:无论如何,您的用户在接收/阅读他们的邮件之前将花费几分钟,因此无需立即发送它们。

对于第二点中的那种情况,因为您不需要立即完成这些事情……那么,就不要立即执行它们;-)
我经常使用的一种解决方案是某种排队机制:

  • Web应用程序将事物存储在“待办事项列表”中
  • 而“待办事项列表”则通过一些经常通过cronjob运行的批处理出队

对于其他一些操作,您只希望它们每隔X分钟运行一次-而且在这里cronjob也是理想的工具。

2020-05-17