【发布时间】: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