0

执行 proc_nice() 时,它实际上是 Apache 的线程吗?

如果是这样,并且如果当前用户(非超级用户)不能放弃其原始优先级,是否会在 Apache 2.0x 服务器上杀死适当的 Apache 线程(apache_child_terminate)?

问题是我试图限制允许用户运行 Ad-Hack 查询的应用程序的影响。查询可能很大,因此对数据的转换需要大量内存和 CPU。

我已经重写了流程,使其更加基于流 - 有助于减少内存消耗,但我也希望流程运行较低的优先级。但是我不能让 Apache 线程处于低优先级,因为我们有很多高优先级的 Web 服务在同一个机器上运行。

TIA

4

1 回答 1

2

在那种情况下,一个解决方案如果经常不在 Apache 进程中做那种繁重的工作,但要么:

  • 运行一个外部 PHP 进程,例如使用类似的东西shell_exec——如果你必须在同步模式下工作(即,如果你不能在几分钟后执行任务)
  • 将任务推送到 FIFO 系统,并立即向用户返回一条消息,说“您的任务将很快被处理”
    • 并让一些其他进程(例如,每分钟通过 crontab 启动)检查 FIFO 队列
    • 并进行处理,队列中有东西
    • 该进程本身可以在低优先级模式下运行。


尽可能多地,特别是如果繁重的计算需要一些时间,我会选择第二种解决方案:

  • 它可以让用户立即得到一些反馈:“服务器已收到您的请求,将尽快处理”
  • 它不会让 Apache 的进程长时间“工作”:繁重的工作是由其他进程完成的
  • 如果有一天,您需要如此多的处理能力,以至于一台服务器已经不够用,那么这种系统将更容易扩展:只需添加第二台服务器,该服务器将从同一个 FIFO 队列中挑选
  • 如果您的服务器确实负载过大,您可以停止队列中的处理,至少一段时间,这样负载会变得更好——例如,如果您的关键 Web 服务在特定的大体时间。


另一个(看起来不错,但我还没有尝试过)解决方案是使用某种工具,例如Gearman

Gearman 提供了一个通用的应用程序框架,将工作外包给其他更适合完成工作的机器或进程。
它允许您并行工作、负载平衡处理以及在语言之间调用函数。
它可用于各种应用程序,从高可用性网站到数据库复制事件的传输。
换句话说,它是分布式处理如何通信的神经系统。

于 2009-12-04T20:27:51.017 回答