我有一个更新程序脚本,每隔几个小时运行一次游戏服务器上的各个区域。我希望更频繁地运行此脚本并添加更多区域。理想情况下,我希望尽可能均匀地分散CPU和I / O的负载。我曾经使用mysql运行这个脚本,但现在网站使用mongodb来处理所有内容,所以将更新程序脚本移动到mongodb也是有意义的。当mongodb刷新数据库的所有更新时,我的I / O峰值非常高。
脚本是用C#
编写的,虽然我认为这不太相对。更重要的是,每当其中一个脚本运行时,我们就会进行大约500,000到120万次更新。我们在代码和索引中做了一些小的优化,但是在这一点上我们仍然坚持如何优化实际的mongodb设置。
其他一些重要信息是我们做这样的事情
update({'someIdentifier':1}, $newDocument)
而不是:
$set : { internalName : 'newName' }
不确定性能是否比执行$set
要差得多。
我们可以做些什么来尝试分散负载?我可以为VM分配更多内存,如果这也有帮助的话。
我很乐意提供更多信息。
答案 0 :(得分:5)
以下是我的想法:
1)正确解释您的表现问题。
到目前为止,我无法弄清楚问题是什么,或者你有一个问题。据我所知,你正在做大约GB的更新,并且正在向磁盘写一个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 - 实际上写入量更少。
到目前为止,我能看到的最大缺点是,使用 big 数据可以看到它的最佳性能 - 如果你的数据适合RAM而不是在一堆测试中输给BT。仍然很快,但速度不快。
所以是的,它是非常新的,我不相信任何没有测试的东西,即使只是非关键任务的东西,但它可能是你正在寻找的东西。而TBH,因为它只是一个新的索引/商店子系统...它适合作为mongodb的优化而不是单独的产品。特别是因为mongodb中的索引/存储系统总是有点简单 - '让我们使用内存映射文件进行缓存'等。