C# 为什么MongoDB更新字段如此CPU密集?
我有一个用C#编写的社交帖子爬虫程序,带有MongoDB WiredTiger(3.2.3)存储 我在测试服务器上收集了400.000个文档,其中包含2核Xeon和7GB内存,Windows server 2012。现在Mongod需要2.7GB的内存 文档看起来像:C# 为什么MongoDB更新字段如此CPU密集?,c#,mongodb,C#,Mongodb,我有一个用C#编写的社交帖子爬虫程序,带有MongoDB WiredTiger(3.2.3)存储 我在测试服务器上收集了400.000个文档,其中包含2核Xeon和7GB内存,Windows server 2012。现在Mongod需要2.7GB的内存 文档看起来像: public class Post { public Guid Id { get; set; } public string SysId { get; set; } public Guid SiteId
public class Post
{
public Guid Id { get; set; }
public string SysId { get; set; }
public Guid SiteId { get; set; }
public DateTime Date { get; set; }
public string Type { get; set; }
public string Text { get; set; }
public string ImageUrl { get; set; }
public User User { get; set; }
public bool IsApproved { get; set; }
}
带索引
{
"SiteId" : 1,
"IsApproved" : -1,
"Date" : -1
}
在我的UI中,我有一个带有以下代码的批准切换按钮:
....
var collection = database.GetCollection<Post>("Posts");
var postStatus = await collection.AsQueryable().Select(x => new { x.Id, x.IsApproved }).FirstOrDefaultAsync(x => x.Id == postId);
if (postStatus == null)
throw new EntityNotFoundException<Guid>(post.Id);
var filter = Builders<Post>.Filter.Eq(post => post.Id, postId);
var update = Builders<Post>.Update.Set(x => x.IsApproved, !postStatus.IsApproved);
await collection.UpdateOneAsync(filter, update);
。。。。
var collection=database.GetCollection(“Posts”);
var postStatus=await collection.AsQueryable().Select(x=>new{x.Id,x.IsApproved}).FirstOrDefaultAsync(x=>x.Id==postId);
if(postStatus==null)
抛出新EntityNotFoundException(post.Id);
var filter=Builders.filter.Eq(post=>post.Id,posted);
var update=Builders.update.Set(x=>x.IsApproved,!postStatus.IsApproved);
wait collection.UpdateOneAsync(过滤器,更新);
当我多次按下Approve按钮时,我看到CPU的利用率为100%,5秒钟后一切正常。为什么最简单的操作会占用大量CPU?看起来很糟糕…使用的是什么存储引擎?我使用的是WiredTiger storage v3.2.3。我怀疑这是一个通用的MongoDB问题,而是MongoDB在等待IO。我不明白为什么要使用异步操作,然后使用阻塞“wait”。这很可能会导致更多的开销,而不是任何好处。这只是一个粗略的猜测,但异步的东西会导致IO中断吗?像这样进行查找/更新分离也可能不是最明智的设计选择。更好的方法是使用“使用更新”操作符中描述的内容,并选择“切换”每次更新的值。因此,只需在这里应用一个
.updateOneAsync()
就可以减少很多IO。尼尔·伦恩,谢谢!但是,如果在许多其他更新中使用近似值,它看起来就不太好了。