![Mongodb 在更强大的服务器上速度较慢。这是怎么回事?](https://linux22.com/image/686772/Mongodb%20%E5%9C%A8%E6%9B%B4%E5%BC%BA%E5%A4%A7%E7%9A%84%E6%9C%8D%E5%8A%A1%E5%99%A8%E4%B8%8A%E9%80%9F%E5%BA%A6%E8%BE%83%E6%85%A2%E3%80%82%E8%BF%99%E6%98%AF%E6%80%8E%E4%B9%88%E5%9B%9E%E4%BA%8B%EF%BC%9F.png)
我今天想迁移我们的服务器,但我无法迁移,因为在新的(更大的)服务器上,MongoDB 对于特定集合的运行速度非常慢。首先,以下是规格。
旧服务器:
Digital Ocean 80$ Instance
RAM: 4GB
vCPUs: 4 (I can't find the GHZ)
新服务器:
Switch Engines c1.large Instance
RAM: 8GB
vCPUs: 8 (again, I can't find the GHZ)
两台服务器都有足够的 SSD 空间。
当我从这个特定集合中检索文档时。之后,mongodb 仍然占用 43% 的内存。在旧服务器上,mongo 始终使用大约 8% 的内存,当我从有问题的集合中请求文档时,没有出现 CPU 峰值。
我正在做的事情是从集合中检索东西:
Iterator<CompilerCacheEntry> found = ds()
.find(CompilerCacheEntry.class).filter("hash", hash)
while (found.hasNext()) {...
ds
源自哪里org.mongodb.morphia.Datastore;
,过滤器的实现如下:
public Query<T> filter(String condition, Object value) {
String[] parts = condition.trim().split(" ");
if(parts.length >= 1 && parts.length <= 6) {
String prop = parts[0].trim();
FilterOperator op = parts.length == 2?this.translate(parts[1]):FilterOperator.EQUAL;
this.add(new Criteria[]{new FieldCriteria(this, prop, op, value, this.validateName, this.validateType)});
return this;
} else {
throw new IllegalArgumentException("\'" + condition + "\' is not a legal filter condition");
}
}
同样令人好奇的是,迁移之前的 mongodb 是 30GB,现在只有 3GB,但据我了解,这只是因为 mongo 在迁移时进行了清理。
所以我留下了普遍的困惑和一些疑问:
- 为什么在更强大的机器上 mongo 反而更慢呢?
- 为什么mongo占用了43%的内存?
- 看起来 mongo 只使用了一个 CPU,这可能是问题所在吗?
- 这个问题与内存有关还是与 CPU 有关,或者都与这些无关?
- mongo 和我的程序分别存在什么问题?为什么 mongo 检索此对象如此困难?
- 我的收藏是不是太大了,超出了我的内存?
以下是部分收藏统计数据,供参考:
>db.compilercache.stats()
{
"ns" : "taskbase.compilercache",
"count" : 21191,
"size" : 4592895563,
"avgObjSize" : 216738,
"storageSize" : 1814052864,
"capped" : false,
如果您需要更多信息,请告诉我。提前谢谢!