2

我有一个更新程序脚本,每隔几个小时在游戏服务器上的各个区域运行一次。我希望更频繁地运行此脚本并添加更多区域。理想情况下,我希望尽可能均匀地分散 CPU 和 I/O 的负载。我曾经使用 mysql 运行此脚本,但现在网站使用 mongodb 来处理所有内容,因此将更新程序脚本也移动到 mongodb 是有道理的。当 mongodb 刷新数据库的所有更新时,我的 I/O 峰值非常高。

脚本是用 编写的C#,尽管我认为这不是相对的。更重要的是,每次这些脚本之一运行时,我们都会进行大约 50 万到 120 万次更新。我们在代码和索引上做了一些小的优化,但此时我们还停留在如何优化实际的 mongodb 设置上。

其他一些重要信息是我们做了这样的事情

update({'someIdentifier':1}, $newDocument)

而不是这个:

$set : { internalName : 'newName' }

不确定这是否比做$set或不做的性能差很多。

我们可以做些什么来尝试分散负载?如果这也有帮助,我可以为 VM 分配更多内存。

我很乐意提供更多信息。

4

1 回答 1

5

以下是我的想法:

1) 正确解释您的绩效问题。

到目前为止,我无法真正弄清楚问题是什么,或者您是否有问题。据我所知,您正在进行大约 1 GB 的更新,并且正在将大约 1 GB 的数据写入磁盘……这并不令人震惊。

哦,做一些该死的测试——Not sure if this is a lot worse in performance than doing $set or not.你为什么不知道?你的测试说什么?

2) 检查是否有任何硬件不匹配。

你的磁盘只是慢吗?你的工作集比 RAM 大吗?

3) 询问 mongo-user 和其他 MongoDB 特定社区...

...仅仅是因为你可能会在那里得到比这里没有答案更好的答案。

4) 考虑尝试 TokuMX。

等什么?我不是刚刚指责上一个建议基本上向他自己的产品发送垃圾邮件的人吗?

当然,这是一个新产品,只是刚刚被引入到 Mongo 中(它似乎有一个更长的 mysql 版本),但基本面似乎是合理的。特别是它非常擅长快速插入和更新/删除。它不需要实际去更改相关文档,而是将插入/更新/删除消息作为索引结构的一部分存储在缓冲队列中。当缓冲区填满时,它会批量应用这些更改,这在 I/O 方面大大提高了效率。最重要的是,它使用压缩来存储数据,这应该会额外减少 I/O - 物理上要写入的东西更少。

到目前为止,我能看到的最大缺点是它的最佳性能是在数据上看到的——如果你的数据适合 RAM,而不是在一堆测试中输给 BTrees。仍然很快,但没有那么快。

所以,是的,它是非常新的,我不会在没有测试的情况下相信它,即使那样只用于非关键任务的东西,但它可能是你正在寻找的东西。TBH,因为它只是一个新的索引/存储子系统……它符合 mongodb 优化的要求,而不是单独的产品。特别是因为 mongodb 中的索引/存储系统一直有点简单——“让我们使用内存映射文件进行缓存”等。

于 2013-07-13T04:59:20.313 回答