我知道问题标题不是最好的。让我解释一下。
我进行了大量的文本处理,将自然语言转换为 xml。这些文本文件上传速度相当快,并被放入队列中。从那里,它们被一个接一个地拉入后台工作程序,该工作程序调用我们的解析器(使用 boost spirit)将文本转换为 xml 并将相关部分加载到我们的数据库中。
解析器一次可以执行大约 100 个这样的操作。我在后台工作人员上设置了速率限制器,现在只能每隔一段时间轮询我们的队列,因此它的执行速度不会那么快。我现在不能抛出超过一个后台工作人员,因为我的 http 请求开始下降——后台工作人员和网络服务器存在于同一台机器上,我相信这是因为 cpu 使用率下降80-95%,尽管我们也可以在上面使用更多的内存。
我需要更好地扩展它。你会怎么做?
几个问题的回答:
我们使用亚马逊网络服务,因此购买便宜的额外硬件与生成新的亚马逊实例有点不同——也许有人已经编写了一些代码来根据负载量自动生成实例?
我们确实有一个 http 服务器,它只是将我们的文件填充到一个队列中,所以它受到影响的唯一原因是因为 cpu 正忙于处理大量与解析相关的东西
我已经对我们的后台工作人员进行了速率限制,尽管我们没有在解析器本身中使用它
我还没有尝试过 nice,但我过去用过它——我需要写下一些关于它的基准
解析器完全独立于网络服务器——我们有 nginx/merb 作为我们的网络/应用服务器和一个调用 c++ 的 rake 任务作为我们的后台 worker ——但它们确实存在于同一台机器上
最佳答案
也许只是将后台工作程序置于较低的调度优先级(例如使用 nice )会有所帮助。这意味着您的服务器可以在需要时处理请求,但当它不忙时,您可以全力处理文本。
我认为它会给你带来比任意错开后台工作人员更多的好处。
关于c++ - 如何在不吞噬 CPU 的情况下进行大量处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/385060/