【问题标题】:Extraordinarily poor performance from MongoDB in write intensive application [closed]MongoDB在写入密集型应用程序中的性能异常差[关闭]
【发布时间】:2011-10-17 15:44:46
【问题描述】:

我正在为一个 Web 应用程序运行编写密集型 MongoDB,但它的性能非常差。话虽这么说,但我相当确定问题与我们的代码、设置和/或我们的使用有关,而不是与 mongo 本身有关。

由于绝望,我即将用大锤敲开我的头,所以我想知道是否有人会介意查看我准备的一些输出,看看是否有问题。

代码并不太复杂(它是在 PHP 中,顺便说一句)。它有很多 ->find() 和 ->update()。我确保对这两个调用都使用了索引,并通过对查询执行 explain() 来确认它们确实被使用了。

我尝试了 1 台服务器 (ec2 m2.2xlarge)、4 台服务器(2 次重复的 2 分片)和 9 台服务器(3 次重复的 3 分片),但无法从中获得太多收益。

在美好的时刻,我无法获得超过每秒 1500 次写入(插入 + 更新)的内容。大多数时候,我很幸运能够达到 100 次插入/更新的总和,而且我总是有一个很大的“锁定 %”和很多排队“qr|qw”的查询。

现在,我有一个正在运行并且正在爬行的脚本。最糟糕的是,当我查看 mongostat 一段时间时,“res”中使用的 RAM 量大约是服务器可用 RAM 的 50%,并且有足够的 RAM 来容纳所有集合的索引。没有理由不疯狂地吐出数据。

我一定已经对应用程序重新编码了 2-3 次,试图找到更好的数据访问模式。我已经阅读了有关索引、更新、分片键等方面的所有内容。我安装 mongo 的所有服务器都使用 8 个 EBS 磁盘 raid 10 设置,并添加了一些性能调整(blockdev、noatime 等)。

我知道问题出在我身上,我不是在责怪 mongodb。我知道比我更大的公司正在使用它来编写密集型应用程序并且他们非常喜欢它(例如foursquare)。同时,我无法理解自己做错了什么以及为什么我的表现如此糟糕,无论我做什么。

附加信息:

  • 所有服务器(客户端和服务器)都运行 Ubuntu 10.04 LTS 和 MongoDB 1.8.2
  • 所有服务器都在 EC2 East 上并且在同一个区域中
  • 目前,我回到了 1 m2.2xlarge 服务器(4 核,34.2 GB RAM),直到找出问题所在。

【问题讨论】:

    标签: php performance mongodb amazon-ec2


    【解决方案1】:

    所以第一个问题是您的磁盘似乎主要用于读取而不是写入。 (基于iostat)。您的利用率远远超过 50%,但基本上都是读取。

    如果我查看您的数据库统计信息,您在 133GB 的已分配文件中有 35GB 的索引和 41GB 的数据。 133GB 非常接近您在mongostat 中的mapped 号码。因此,您可能访问的数据总和约为 120GB 或约 4 倍 RAM。

    通常 4x 是一个完美的比例。但是,在您的情况下,您的索引超过了 RAM。这往往是 MongoDB 性能的“衰减”点。

    如果您在索引中随机访问,则大部分或全部索引都在内存中。这意味着您的大部分数据不在内存中,需要从磁盘“分页”。您可以在获得的大量磁盘读取中看到这一点。

    我知道你说你测试了分片,你有这些测试的数字吗?数据是否正确分布在所有三个分片中?

    当您向数据库“添加更多 RAM”时,分片应该可以缓解您的问题,但您需要确认数据确实被均匀分片并且行为正确,否则它无法解决您的问题。

    【讨论】:

    • +1 另外值得一提的是,如果您的更新无法就地完成(因为它们已经超出了分配的可用空间),则需要将它们从磁盘读取、写入内存、修改和写入回到数据集的末尾。
    猜你喜欢
    • 1970-01-01
    • 2023-03-03
    • 2010-12-16
    • 2011-03-03
    • 1970-01-01
    • 2011-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多