Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance 如何在mongo shell中停用安全模式?_Performance_Mongodb_Mongo Shell_Safe Mode - Fatal编程技术网

Performance 如何在mongo shell中停用安全模式?

Performance 如何在mongo shell中停用安全模式?,performance,mongodb,mongo-shell,safe-mode,Performance,Mongodb,Mongo Shell,Safe Mode,标题上有一个简短的问题:我使用默认处于安全模式的mongo Shell,我希望通过禁用此行为获得更好的性能 对于那些愿意了解上下文的人来说,这是一个很长的问题: 我正在处理大量的数据,比如 { _id:ObjectId("azertyuiopqsdfghjkl"), stringdate:"2008-03-08 06:36:00" } 还有其他一些字段,大约有2.5亿个这样的文档(整个数据库都有索引)。我想转换实际ISODATE字段中的日期。我搜索了一下如何进行更新查询,如 db.data.u

标题上有一个简短的问题:我使用默认处于安全模式的mongo Shell,我希望通过禁用此行为获得更好的性能

对于那些愿意了解上下文的人来说,这是一个很长的问题: 我正在处理大量的数据,比如

{
_id:ObjectId("azertyuiopqsdfghjkl"),
stringdate:"2008-03-08 06:36:00"
}
还有其他一些字段,大约有2.5亿个这样的文档(整个数据库都有索引)。我想转换实际ISODATE字段中的日期。我搜索了一下如何进行更新查询,如

db.data.update({},{$set:{date:new Date("$stringdate")}},{multi:true})
但是,我没有找到如何实现这一点,于是我决定制作一个脚本,一个接一个地获取文档,并进行更新,以设置一个新字段,该字段将新日期(stringdate)作为其值。查询使用_id,因此使用默认索引


问题是这需要很长时间。我已经发现,如果我在创建数据库时插入了空dates对象,我现在会获得更好的性能,因为添加新字段时会出现数据重新定位的问题。我还在相关字段上设置了一个索引,以逐块处理数据库。最后,我在服务器和工作站上运行了几个并发mongo客户端,以确保限制因素是数据库锁可用性,而不是cpu或网络成本等任何其他因素

我用mongotop、mongostats和web监控界面监控了整个过程,这些界面确认写锁占用了70%的时间。我有点失望mongodb的写锁没有更精确的粒度,为什么不允许在同一个集合上进行并发写操作,只要没有干扰的风险?现在我想起来了,我应该在同一台服务器上把集合分成十几个碎片,因为每个碎片上都有单独的锁

但是,由于我现在无法对当前的数据库结构做任何事情,我搜索了如何提高性能,至少花90%的时间在mongo中编写(目前为70%),我发现,由于我在默认的mongo shell中运行脚本,每次更新时,都会出现一个getLastError()这是事后调用的,我不想要它,因为有99.99%的成功几率,即使失败,我仍然可以在大流程结束后发出聚合请求来检索单个异常

我不认为通过停用getLastError调用可以获得这么多性能,但我认为值得一试

我查看了文档,发现默认行为得到了确认,但没有更改它的过程。有什么建议吗

我使用默认处于安全模式的mongo Shell,我希望通过禁用此行为获得更好的性能

您可以使用
db.getLastError({w:0})
()来做您想做的事情,但它没有帮助

这是因为:

制作一个脚本,一个接一个地获取文档,并进行更新以设置一个以新日期(stringdate)为其值的新字段

当以非交互模式(如在循环中)使用shell时,它实际上不会调用
getLastError()
。因此,将您的写关注点删除到
0
将毫无用处


我已经发现,如果我在创建数据库时插入了空dates对象,我现在会获得更好的性能,因为添加新字段时会出现数据重新定位的问题

当人们问起这个问题时,我确实告诉过他们要添加这些字段,以防移动,但他们却听了那个人的话,他说:“不要这样!他们使用空间!”

我不应该自鸣得意,但我确实如此。不幸的是,当你被告知自己错了的时候,这是一个正确的副作用

mongostats和web监控界面,确认写锁占用了70%的时间

那是因为你的文档中有很多移动,有点难以修复

我有点失望mongodb的写锁没有更精确的粒度

写锁实际上并不表示MongoDB的并发性,这是源于事务SQL技术的另一个常见误解

MongoDB中的写锁是其中一个的互斥锁

不仅如此,还有许多规则规定,在某些情况下,操作将退化为排队操作,一个是等待的操作数,另一个是数据是否在RAM中,等等


不幸的是,我相信你已经陷入了一个艰难的境地,没有简单的出路。这种情况确实会发生。

db.getLastError({w:0})
会做到的,我相信,但你犯了一个很大的错误,我仍然在阅读长篇回答“性能,因为添加新字段时存在数据重新定位问题”当人们询问是否应该添加某些字段时,我在回答中告诉了他们这一点,相反,他们听了那个说“不,把那些字段排除在外”的家伙的话,我知道我不应该感到自鸣得意,但我知道锁粒度的原因是因为对排队的操作依赖于沉降操作,例如如果操作正在等待运行,你的更新操作实际上会让位于它们,等等,基于一组规则,但是,由于移动,您的锁正在建立。请注意,getlasterror仅在交互模式下调用,也就是说,在循环中,它实际上不会调用,因此,您使用循环的尝试在结束之前永远不会调用getlasterror。因此,关闭getlasterror不会有帮助。使用%的时间锁不会告诉您任何事情,除了写入正在发生的事实。您应该查看队列的大小,特别是写队列,这将指示您是否被锁阻塞。即使你是,如果只是因为你是