c++ - 如何在不吞噬 CPU 的情况下进行大量处理?

标签 c++ ruby memory cpu scaling

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

我进行了大量的文本处理,将自然语言转换为 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/

相关文章:

c++ - 如何为股票创建一个类?

c++ - "terminated by a zero"是什么意思?

c++ - 从 vector 中提取子 vector 而不复制

python - 单线程应用程序的连接池

ruby - 如何从 Ruby 函数返回值以用于程序的其余部分

r - R启动时如何覆盖2GB内存限制

perl - Perl 进程之间共享只读内存

android - 删除 OLDEST 提交的返回堆栈 fragment

c++ - 结合 C++/CLR 和 C++

ruby - 在带有 Ruby 的 Sinatra 中使用 gzip 压缩