Mongodb背景刷新会阻止所有请求:
服务器: Windows Server 2008 R2
CPU使用率: 10%
内存: 64G,7%使用,Mongod 250MB
磁盘读/写时间小于5%(根据Perfmon)
Mongodb版本: 2.4.6
Mongostat通常:
insert:509 query:608 update:331 delete:*0 command:852|0 flushes:0 mapped:63.1g vsize:127g faults:6449 locked db:Radius:12.0%
Mongostat之前(可能正在)刷新:
insert:1 query:4 update:3 delete:*0 command:7|0 flushes:0 mapped:63.1g vsize:127g faults:313 locked db:local:0.0%
冲洗后的Mongostat :
insert:1572 query:1849 update:1028 delete:*0 command:2673|0 flushes:1 mapped:63.1g vsize:127g faults:21065 locked db:.:99.0%
正如您所看到的,当发生冲突时,锁定为99%,此时mongod停止响应任何读/写操作(mongotop
和mongostat
也停止)。冲洗大约需要7到8秒才能完成,这不会使磁盘负载增加10%以上。
有什么建议吗?
答案 0 :(得分:3)
在Windows server 2008 R2(以及我怀疑的Windows的其他版本,虽然我不确定),MongoDB(2.4及更早版本)后台刷新进程强加全局锁定,做大量工作阻塞读取和写入,并且刷新时间的长度往往与MongoDB使用的内存量(内存映射文件的驻留和系统缓存)成比例,即使实际写入活动很少。这是我们在商店遇到的一种现象。
在我们使用MongoDB版本2.2.2的一个副本集中,在具有大约128 GB RAM的主机上,当大多数RAM作为常驻内存或备用系统缓存使用时,刷新时间是可靠的在几乎无负载的情况下,在10到15秒之间,在负载下可能会高达30到40秒。这可能会导致Mongo每分钟都进入长时间无反应的状态。我们的仓库没有出现压力的迹象。
基本问题似乎是Windows处理刷新到内存映射文件的方式与Linux不同。显然,这个过程在Windows下是同步的,这有很多副作用,虽然我不太了解技术细节以便发表评论。
MongoDb,Inc。知道这个问题,正在进行优化以解决它。这个问题记录在几张票中:
https://jira.mongodb.org/browse/SERVER-13444
https://jira.mongodb.org/browse/SERVER-12401
怎么办?
答案 1 :(得分:0)
默认情况下,后台刷新不会阻止读/写。除非使用-syncDelay参数另行指定,否则mongod每隔60秒刷新一次。 syncDelay使用fsync()操作,该操作可以设置为在内存页面刷新到磁盘时阻止写入。被阻止的写入也有可能阻止读取。阅读更多:http://docs.mongodb.org/manual/reference/command/fsync/
但是,通常冲洗不应超过1000毫秒(1秒)。如果是这样,则刷新到磁盘的数据量可能太大而无法处理磁盘。
解决方案:升级到更快的磁盘,如SSD,或减少刷新间隔(尝试30秒,而不是默认的60秒)。