Mongodb

如何減少獲取 mongodb 模式鎖所花費的時間?

  • February 8, 2020

我們有一個由 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 中引入的新萬用字元索引

引用自:https://dba.stackexchange.com/questions/249601