当前位置: 首页 > 面试题库 >

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

周育
2023-03-14
问题内容

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

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

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

类别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中实现多线程模型,无论是真正的还是仅对其进行仿真。一段时间以前,建议您可以强制操作系统加载PHP可执行文件的另一个实例并处理其他同时进行的进程。 这样做的问题是,当PHP代码完成执行PHP实例后,它仍保留在内存中,因为无法从PHP中杀死它。因此,如果您正在模拟多个线程,则可以想象会发生什么。因此,我仍在寻找一种可以在PHP中有效完成或模拟多线程的方法。有

  • 我正在运行大型模型(774M)的GPT-2代码。它用于通过交互式_条件_样本生成文本样本。林克:这里 因此,我给出了一个输入文件,其中包含自动选择生成输出的提示。此输出也会自动复制到文件中。简而言之,我不是在训练它,而是在使用模型生成文本。而且,我使用的是一个GPU。 我在这方面面临的问题是,代码没有充分利用GPU。 通过使用NVIDIASMI命令,我可以看到下图 https://imgur.co

  • 在北网的优化指南中,针对英特尔GPU的OpenCL开源实现 工作组大小应大于16,并且是16的倍数。 Gen上有两个可能的SIMD车道是8或16。为了不浪费SIMD车道,我们需要遵循这个规则。 英特尔处理器图形Gen7.5的计算架构中也提到: 对于Gen7。基于5个产品,每个EU有7个线程,总计28 KB的通用寄存器文件(GRF)。 。。。 在Gen7上。5计算架构,大多数SPMD编程模型都采用这

  • 问题内容: 我一直在看Redis。看起来很有趣。但是从实际的角度来看,在哪种情况下最好使用Redis而不是MySQL? 问题答案: 忽略整个NoSQL与SQL的争论,我认为最好的方法是将它们结合起来。换句话说,对于系统的某些部分(复杂的查询,事务)使用MySQL,而对于其他部分(性能,计数器等)则使用Redis。 以我的经验,与可伸缩性(很多用户…)相关的性能问题最终迫使您添加某种缓存来减轻MyS

  • 问题内容: 我正在尝试将Hibernate用于多线程应用程序,其中每个线程都检索一个对象并将其插入表中。我的代码如下所示。我每个线程都有本地hibernate会话对象,在每个InsertData中,我都执行beginTransaction和commit。 我面临的问题是很多次我收到“ org.hibernate.TransactionException:不支持嵌套事务” 由于我是hibernate

  • 问题内容: 如何检测expressJS应用程序在什么环境中运行?(开发,测试,生产?)。没有任何迹象表明环境… 我知道您可以在每种环境下的配置文件中声明变量,但这对动态加载模块没有帮助… 问题答案: 您可以通过选中(可以在Express中使用)检查环境,也可以通过直接检查(在该变量中找到的环境或默认为“开发”中的环境)来更直接地进行操作。其他库,例如Socket.IO等)。