1

我知道问题标题不是最好的。让我解释。

我进行了大量的文本处理,将自然语言转换为 xml。这些文本文件上传速度相当快并被放入队列中。从那里它们被一个接一个地拉到后台工作程序中,该工作程序调用我们的解析器(使用 boost spirit)将文本转换为 xml 并将相关部分加载到我们的数据库中。

解析器一次可以做大约 100 个。我在后台工作人员上有限速器,现在只经常轮询我们的队列,因此它的执行速度不那么快。我现在不能抛出一个以上的后台工作人员,因为我的 http 请求开始下降——后台工作人员和网络服务器存在于同一台机器上,我相信这是因为 cpu 使用率达到 80-95%,尽管我们也可以使用更多的内存。

我需要更好地扩展它。你会怎么做呢?

在回答几个问题时:

  • 我们使用亚马逊网络服务,因此购买廉价的额外硬件与生成一个新的亚马逊实例有点不同——也许有人做了一些代码来自动生成负载量的实例?

  • 我们确实有一个 http 服务器,它只是将我们的文件塞入一个队列,所以它受到影响的唯一原因是因为 cpu 正忙于处理大量与解析相关的东西

  • 我已经对我们的后台工作人员进行了速率限制,尽管我们没有在解析器本身中使用它

  • 我还没有尝试过,但我过去使用过它——我需要为此写下一些基准

  • 解析器与 Web 服务器完全分离——我们有 nginx/merb 作为我们的 Web/应用程序服务器和一个调用 c++ 的 rake 任务作为我们的后台工作者——但它们确实存在于同一台机器上

4

10 回答 10

8

也许只是将后台工作人员置于较低的调度优先级(例如使用nice)会有所帮助。这意味着您的服务器可以在需要时处理请求,但是当它不忙时,您可以全力以赴进行文本处理。

我认为它会给你带来比任意错开后台工作人员更多的好处。

于 2008-12-21T22:35:14.047 回答
4

我会买几台便宜的电脑,然后对它们进行文本处理。正如 Jeff 在他的最新帖子中所说,“始终尝试通过投入更快的硬件来解决性能问题。”

于 2008-12-21T22:27:51.287 回答
3

我不确定我是否完全按照你的问题,但听起来你有一个 HTTP 引擎来提供工作待处理队列。正确的?后台线程正在接受这些队列请求并完成繁重的工作,对吗?

因此,听起来后台进程受计算限制,而前台进程本质上受 I/O 限制……或者至少受新工作提交率的限制。

优化此类进程的最佳方法是将后台进程设置为低于前台进程的优先级。这可确保后台进程始终有工作要做。然后,您将进程之间的队列深度设置为向上,使其大小限制为您希望一次待处理的最大工作量。

于 2008-12-21T22:36:52.000 回答
1

如果您有此功能,我已经完成的一件事是将这些解析服务移至云托管服务。

我已经将我的一些分布式服务(搜索引擎、群发电子邮件、错误日志记录)从我的主计算机移到了云计算服务上,这对我们的主 Web 服务器来说是一个极好的负载。

此外,云计算变得更加便宜并且几乎可以无限扩展。

于 2008-12-21T22:49:30.197 回答
1

我不明白为什么你会担心你的 CPU 是 100%。如果一项工作需要完成,并且不受 IO 限制,那么您的 CPU应该是 100%。

剩下的是:

  • 您是否有足够的 CPU 在可用时间内完成所有需要完成的工作?

如果不是,您需要更多的机器、更快的 CPU 或更高效的 CPU 算法。前两种选择可能比第三种便宜 - 取决于您企业的规模!

  • 是否有一些工作需要比其他工作更具响应性?

听起来好像有。听起来您希望 HTTP 服务器具有响应性,而解析器作业可以按照自己的速度完成(只要队列清空速度快于填充速度)。正如其他人指出的那样,nice 告诉操作系统分配低优先级进程,在高优先级进程获得所需的 CPU 周期后“剩余”(尽管它并不像那样黑白分明)。

于 2009-01-04T12:07:06.870 回答
0

我假设您有多个线程,每个线程属于两个组之一

  • 下载文本文件的 A 组
  • 将文本转换为 xml 的组 B

如果您认为 B 组限制了您的吞吐量,我会将其线程设置为较低的优先级。如果有足够的工作,CPU 仍然会 100% 使用,但不会影响下载。

如果我的上述假设是正确的,那么您还应该使用多核和多 cpu 机器,因为您的性能应该随着更多 CPU 很好地扩展。

于 2008-12-21T22:33:23.223 回答
0

我会把解析器放在自己的机器上。这样它就不会影响Web服务器。

如果您没有购买另一台机器的预算,则使用虚拟化(如果您的 Web 服务器托管在 Ubuntu 或 CentOS 上, OpenVZ很酷)来限制解析器的 CPU 配额。

于 2008-12-21T22:38:48.657 回答
0

如果您在处理中断请求时遇到问题,您可以尝试提高 CPU 绑定任务的友好度。然后是 HTTP 服务器的好处。基本上,尝试使用系统的调度程序来发挥自己的优势,不要将所有任务视为平等。

于 2008-12-21T22:55:08.483 回答
0

我不知道您使用的是什么操作系统,但它们中的大多数都具有指定线程/进程优先级的功能。只要解析器进程的优先级低于 HTTP 进程,应该没问题。

于 2008-12-21T23:39:31.687 回答
0

永远不要忘记电费/托管价格。尝试使用探查器查找代码中的瓶颈。如果您从未这样做过,我相信您可以将 CPU 消耗降低到 25-50%

于 2009-04-02T19:49:38.977 回答