Mongodb
如何減少獲取 mongodb 模式鎖所花費的時間?
我們有一個由 WiredTiger 支持的 mongodb 4.0.10 集群,在生產中,有一個由一個主節點和兩個從節點組成的 3 節點副本集。其中一個從站有另一個服務,該服務位於同一位置,廣泛地查詢從站。在解決託管服務中的一些緩慢問題時,我看到了很多令人驚訝的緩慢查詢。這個耗時 3.3 秒:
find: "myColl", filter: { myField: "myValue" }, projection: { name: 1 }, $db: "myDb", $clusterTime: { clusterTime: Timestamp(1568198047, 3), signature: { hash: BinData(0, 0000000000000000000000000000000000000000), keyId: 0 } }, lsid: { id: UUID("2ed823aa-e6af-4898-a4c1-c039d28a32ab") }, $readPreference: { mode: "secondary" } } planSummary: IXSCAN { myField: 1 } keysExamined:0 docsExamined:0 cursorExhausted:1 numYields:0 nreturned:0 reslen:232 locks:{ Global: { acquireCount: { r: 1 } }, Database: { acquireCount: { r: 1 } }, Collection: { acquireCount: { r: 1 } } } storage:{ data: { bytesRead: 355, timeReadingMicros: 4 }, timeWaitingMicros: { schemaLock: 3284692 }
對我來說最突出的一行是最後一行,表明它花費了 99.9% 的時間來等待獲取稱為模式鎖的東西。
我檢查了這個特定的數據庫和集合,結果發現該集合在查詢時有 50 個項目,並且數據庫本身很小(總共不到 1k 個文件)。此外,還有一個關於
myField
.以下是有關我們對 mongodb 的特定使用的一些其他數據,這些數據可能相關:
- 多租戶,每個客戶都有一個數據庫
- 大多數文件都很小
- 大多數文件在其整個生命週期中都將具有相似的大小(我在這裡讀到其他一些文件存在與填充相關的性能問題,並且文件隨著大小的增長而移動)
- 客戶數據通過文件數量而不是文件大小增長
我一直在監視這些減慢查詢有一段時間了,但我看不到任何模式。就像 mongodb 每隔一段時間就會執行一些維護任務,並且當時執行的任何查詢都被迫等待。
為什麼讀取查詢等待獲取模式鎖?我能做些什麼來消除這個漫長的等待?
這是 WiredTiger 儲存引擎的一般架構問題。現在正在這裡討論:https ://jira.mongodb.org/browse/WT-5479
長話短說,您打開的文件數量過多。如果可以,請考慮刪除不必要的索引,例如小型集合上的索引。您還可以探索 MongoDB 4.2 中引入的新萬用字元索引