2011-12-13 89 views
1

我正在創建一個應用程序,它有幾個服務器同時運行,並且在每個服務器上有多個進程正在處理數據,以便查詢/更新和插入。因此,總共有35個以上的併發連接正在進行。這些服務器都處理髮送到單個mongodb服務器(mongod)的數據。目前我沒有分割我的數據庫。問題是我受到我的mongodb服務器的限制。每當我添加更多的服務器時,查詢/更新/插入的運行速度會變慢(它們需要更多時間)。我正在運行這個mongohq.com,然後我最近爲mongod創建了我自己的amazon服務器,但我仍然得到幾乎相同的結果。下面的列表是我的db.serverStatus({})。我對mongodb有點新,但基本上我需要知道如何加快mongo服務器進行併發操作的過程。我需要它能夠處理很多請求。我知道分片是一種可能的解決方法,但如果可以的話,你可以列出一些可用的其他解決方案。謝謝。MongoDB限制併發量

> db.serverStatus({}) 
{ 
"host" : "ip-10-108-245-21:28282", 
"version" : "2.0.1", 
"process" : "mongod", 
"uptime" : 11380, 
"uptimeEstimate" : 11403, 
"localTime" : ISODate("2011-12-13T22:27:56.865Z"), 
"globalLock" : { 
    "totalTime" : 11380429167, 
    "lockTime" : 86138670, 
    "ratio" : 0.007569017717695356, 
    "currentQueue" : { 
     "total" : 0, 
     "readers" : 0, 
     "writers" : 0 
    }, 
    "activeClients" : { 
     "total" : 35, 
     "readers" : 35, 
     "writers" : 0 
    } 
}, 
"mem" : { 
    "bits" : 64, 
    "resident" : 731, 
    "virtual" : 6326, 
    "supported" : true, 
    "mapped" : 976, 
    "mappedWithJournal" : 1952 
}, 
"connections" : { 
    "current" : 105, 
    "available" : 714 
}, 
"extra_info" : { 
    "note" : "fields vary by platform", 
    "heap_usage_bytes" : 398656, 
    "page_faults" : 1 
}, 
"indexCounters" : { 
    "btree" : { 
     "accesses" : 798, 
     "hits" : 798, 
     "misses" : 0, 
     "resets" : 0, 
     "missRatio" : 0 
    } 
}, 
"backgroundFlushing" : { 
    "flushes" : 189, 
    "total_ms" : 29775, 
    "average_ms" : 157.53968253968253, 
    "last_ms" : 185, 
    "last_finished" : ISODate("2011-12-13T22:27:16.651Z") 
}, 
"cursors" : { 
    "totalOpen" : 34, 
    "clientCursors_size" : 34, 
    "timedOut" : 0, 
    "totalNoTimeout" : 34 
}, 
"network" : { 
    "bytesIn" : 89743967, 
    "bytesOut" : 59379407, 
    "numRequests" : 840133 
}, 
"opcounters" : { 
    "insert" : 5437, 
    "query" : 8957, 
    "update" : 4312, 
    "delete" : 0, 
    "getmore" : 76, 
    "command" : 821388 
}, 
"asserts" : { 
    "regular" : 0, 
    "warning" : 0, 
    "msg" : 0, 
    "user" : 0, 
    "rollovers" : 0 
}, 
"writeBacksQueued" : false, 
"dur" : { 
    "commits" : 29, 
    "journaledMB" : 0.147456, 
    "writeToDataFilesMB" : 0.230233, 
    "compression" : 0.9999932183619632, 
    "commitsInWriteLock" : 0, 
    "earlyCommits" : 0, 
    "timeMs" : { 
     "dt" : 3031, 
     "prepLogBuffer" : 0, 
     "writeToJournal" : 29, 
     "writeToDataFiles" : 2, 
     "remapPrivateView" : 0 
    } 
}, 
"ok" : 1 

}

+0

我在狀態報告中看不到任何內容這看起來像一個大問題。隊列是空的,鎖比率低,看起來不算太壞。 v2應該比舊版本具有更好的併發性。我建議你發佈在谷歌用戶組。 – mnemosyn 2011-12-13 22:26:33

+0

謝謝,是的,我只是更新了我的serverStatus響應。我正在顯示一個不正確的 - 我的錯誤。我將發佈到谷歌用戶組。我正在運行mongo v2.0.1。我也在和mongohq的支持交流,他們說這可能是索引問題,我們正在尋求解決方案。 – PetersCodeProblems 2011-12-13 22:33:17

回答

1

令人驚訝的更多負載從mongod的生成更高的響應時間?性能下降有幾個可能的原因。

例如,每次寫入mongod都使用進程寬寫入鎖定。因此,嘗試添加更多更新的服務器(假設每個服務器的更新負載穩定),因此進程在寫入鎖定時花費的時間越長。您可以通過mongostat的「鎖定%」字段來關注此問題。如果你使用JS支持的功能(m/r,db.eval()等),這些操作不能由mongod同時執行,因爲每個mongod都有一個JavaScript上下文(它是單線程的)。

如果你想要更具體的分析,那麼你可能要考慮張貼確切的數字。每秒執行多少次讀寫操作,執行查詢的查詢計劃是什麼,添加額外的應用服務器會對整體數據庫性能產生什麼影響等等。