您如何在PHP / MySQL应用程序中充分利用多核CPU?
我维护一个定制的类似CMS的应用程序。
每当提交文档时,都会执行一些任务,这些任务可以大致分为以下几类:
- MySQL查询。
- HTML内容解析。
- 搜索索引更新。
类别1包括对与文档内容有关的各种MySQL表的更新。
类别2包括对存储在MySQL LONGTEXT字段中的HTML内容的解析,以执行一些自动锚标记转换。我怀疑此任务花费了大量计算时间。
类别3仅使用与文档相对应的几个字段就对基于MySQL的简单搜索索引进行了更新。
所有这些任务都需要完成,才能将文档提交视为已完成。
承载此应用程序的计算机具有双四核Xeon处理器(总共8个内核)。但是,无论何时提交文档,所有执行的PHP代码都被限制为在一个内核上运行的单个进程。
我的问题:
您使用什么方案(如果有)在多个CPU内核之间分配PHP / MySQL
Web应用程序处理负载?我理想的解决方案基本上是产生几个进程,让它们在多个内核上并行执行,然后阻塞直到所有进程完成。
相关问题:
您最喜欢的PHP性能分析工具是什么?
回答:
PHP并非完全面向多线程:正如您已经注意到的,每个页面都由一个PHP进程提供服务-一次只做一件事,包括在数据库服务器上执行SQL查询时仅“等待”。
不幸的是,您无能为力:这就是PHP的工作方式。
不过,这里有一些想法:
- 首先,您的服务器上可能一次拥有一个以上的用户,这意味着您将同时提供多个页面,这又意味着您将运行多个PHP进程和SQL查询同时…这意味着将使用服务器的多个核心。
- 每个PHP进程将响应一个用户的请求而在一个内核上运行,但是Apache并行运行了几个子进程 (每个请求一个 子进程 ,最多可以数十个或数百个,具体取决于您的配置)
- MySQL服务器是多线程的,这意味着它可以使用几个不同的核心来回答多个并发请求-即使每个请求不能由一个以上的核心服务。
因此,实际上,您服务器的8个核心将最终被使用;-)
而且,如果您认为自己的页面生成时间过长,则可能的解决方案是将计算结果分成两组:
- 一方面,生成页面必须要做的事情:对于这些来说,您无能为力
- 另一方面,某些事情有时必须运行,但不一定立即运行
- 例如,我正在考虑一些统计数据计算:您希望它们是最新的,但是如果它们落后几分钟,那通常就可以了。
- 电子邮件发送同样如此:无论如何,您的用户在接收/阅读他们的邮件之前将花费几分钟,因此无需立即发送它们。
对于第二点中的那种情况,因为您不需要立即完成这些事情……那么,就不要立即执行它们;-)
我经常使用的一种解决方案是某种排队机制:
- Web应用程序将事物存储在“待办事项列表”中
- 而“待办事项列表”则通过一些经常通过cronjob运行的批处理出队
对于其他一些操作,您只希望它们每隔X分钟运行一次-而且在这里cronjob也是理想的工具。
以上是 您如何在PHP / MySQL应用程序中充分利用多核CPU? 的全部内容, 来源链接: utcz.com/qa/431488.html