- 求職 : Linux運(yùn)維
- 論壇徽章:
- 203
|
生產(chǎn)環(huán)境實(shí)例頻繁 OOM ,調(diào)查發(fā)現(xiàn)主要由一些$near查詢導(dǎo)致,查詢類似如下,其中 latlng 字段建立了2d index。
{
"find" : "userData",
"filter" : {
"latlng" : {
"$near" : [
116.34642045073839,
39.87082232130999
],
"$maxDistance" : 0.9009009009009009
}
},
"ntoreturn" : 10000
}
官方解釋是因?yàn)?near需要排序,實(shí)際上是從中心點(diǎn),不斷往外擴(kuò)展,找出附近的點(diǎn),所以$near cursor會緩存計(jì)算結(jié)果。MongoDB cursor 的默認(rèn)超時(shí)時(shí)間是10分鐘,所以如果10分鐘內(nèi)所有打開 cursor 緩存的內(nèi)存總量超過總內(nèi)存,就會出現(xiàn) OOM 的情況。
針對上述問題,應(yīng)用有如下2種方式優(yōu)化內(nèi)存使用
設(shè)置更小的 cursor timeout
啟動(dòng)時(shí)設(shè)置 mongod –setParameter cursorTimeoutMillis=60000,也可以放到配置文件
在線修改 db.runCommand({setParameter: 1, cursorTimeoutMillis: 60000})
find 時(shí)設(shè)置{singeBatch: true}選項(xiàng),讓 mongod在查詢后立即關(guān)閉 cursor,這種方法只適用于不需要對 cursor 進(jìn)行 getMore 查詢的情況。
了解問題詳細(xì)情況可以查看 SERVER-25141 |
|