解析服务器 + mongoDB - 服务器过载高
Parse-server + mongoDB - high server overload
我们在自己的服务器上使用 parse-server + mongoDB 作为手游后端。大约有 200K 用户同时连接约 2k。 “_Session”集合大约有 100 万条记录,并且还在继续增长。
每个服务器的 CPU 持续加载 100%。
在 MongoDB 日志中,我可以看到 95% 的记录如下:
2017-05-11T16:25:24.738+0300 I COMMAND [conn1] command appdb1._Session command: find { find: "_Session", filter: { _session_token: "r:9eaba843dc3f8b482dbc76009f94c18a" }, sort: {}, projection: {}, limit: 1 } planSummary: COLLSCAN keysExamined:0 docsExamined:1015131 cursorExhausted:1 keyUpdates:0 writeConflicts:0 numYields:7930 nreturned:1 resle
n:428 locks:{ Global: { acquireCount: { r: 15862 } }, Database: { acquireCount: { r: 7931 } }, Collection: { acquireCount: { r: 7931 } } } protocol:op_query 556ms
我已经为 _Session 集合创建了索引,
db.getCollection("_Session").getIndexes()
[
{
"v" : 1,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "appdb1._Session"
},
{
"v" : 1,
"key" : {
"sessionToken" : 1
},
"name" : "sessionToken_1",
"ns" : "appdb1._Session",
"background" : true
}
]
但是据我了解,并没有用到,DB每次查找记录的时候都会进行全集合扫描
所以服务器响应很慢,请帮忙解决这个问题。
谢谢!
尝试在后台对键 _session_token 创建索引:
db.yourCollection.ensureIndex({ "_session_token":1}, {background:true})
这将避免对具有键 _session_token
的查询进行集合扫描。
我们在自己的服务器上使用 parse-server + mongoDB 作为手游后端。大约有 200K 用户同时连接约 2k。 “_Session”集合大约有 100 万条记录,并且还在继续增长。
每个服务器的 CPU 持续加载 100%。 在 MongoDB 日志中,我可以看到 95% 的记录如下:
2017-05-11T16:25:24.738+0300 I COMMAND [conn1] command appdb1._Session command: find { find: "_Session", filter: { _session_token: "r:9eaba843dc3f8b482dbc76009f94c18a" }, sort: {}, projection: {}, limit: 1 } planSummary: COLLSCAN keysExamined:0 docsExamined:1015131 cursorExhausted:1 keyUpdates:0 writeConflicts:0 numYields:7930 nreturned:1 resle n:428 locks:{ Global: { acquireCount: { r: 15862 } }, Database: { acquireCount: { r: 7931 } }, Collection: { acquireCount: { r: 7931 } } } protocol:op_query 556ms
我已经为 _Session 集合创建了索引, db.getCollection("_Session").getIndexes() [
{
"v" : 1,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "appdb1._Session"
},
{
"v" : 1,
"key" : {
"sessionToken" : 1
},
"name" : "sessionToken_1",
"ns" : "appdb1._Session",
"background" : true
}
]
但是据我了解,并没有用到,DB每次查找记录的时候都会进行全集合扫描
所以服务器响应很慢,请帮忙解决这个问题。
谢谢!
尝试在后台对键 _session_token 创建索引:
db.yourCollection.ensureIndex({ "_session_token":1}, {background:true})
这将避免对具有键 _session_token
的查询进行集合扫描。