MongoDB currentOp () и Cursor.explain () показывают разные результаты для одного и того же запроса - PullRequest
0 голосов
/ 13 октября 2019

Я использую MongoDB 3.2 годами и обнаружил, что currentOp() и Cursor.explain() показывают разные результаты для одного и того же запроса.

Я обнаружил, что несколько запросов выполняются очень долго (20+ секунд), я думал, что это невозможно, потому что я много тестировал и у меня есть индекс. Запросы, как правило, такие же, насколько я видел. Я думаю, что они вызывают целые блокировки базы данных, потому что когда некоторые запросы становятся медленнее, почти 40-50 запросов застряли в currentOp().

Но когда я выполнил ту же операцию чтения в оболочке, она запустилась очень быстро, как я и предполагал. Я взял тот же запрос из currentOp и выполнил.

Когда база данных блокируется (я думаю, что она заблокирована), загрузка процессора достигает 100% в течение нескольких часов, и мое приложение будет работать очень медленно. Я отслеживаю currentOp каждую 1 минуту, и когда это не заканчивается в течение нескольких секунд, мне пришлось перезапустить приложение, затем оно работает нормально.

Вот один из запросов, который занимает очень много времени. Как только это происходит, 40-50 других, но похожих запросов также застряли в currentOp.

{
    "desc"              : "conn32882",
    "threadId"          : "140677207643904",
    "connectionId"      : 32882,
    "client"            : "client",
    "active"            : true,
    "opid"              : 1374027609,
    "secs_running"      : 20,
    "microsecs_running" : NumberLong(20560351),
    "op"                : "query",
    "ns"                : "db.collection",
    "query"             : {
        "find"         : "collection",
        "filter"       : {
            "p"    : {
                "$gt" : 0
            },
            "type" : "canvas",
            "id"   : {
                "$in" : [
                    576391,
                    570391,
                    767422
                ]
            }
        },
        "sort"         : {
            "_id" : -1
        },
        "projection"   : {

        },
        "limit"        : 5000,
        "returnKey"    : false,
        "showRecordId" : false
    },
    "numYields"         : 2761,
    "locks"             : {
        "Global"     : "r",
        "Database"   : "r",
        "Collection" : "r"
    },
    "waitingForLock"    : false,
    "lockStats"         : {
        "Global"     : {
            "acquireCount"        : {
                "r" : NumberLong(5524)
            },
            "acquireWaitCount"    : {
                "r" : NumberLong(349)
            },
            "timeAcquiringMicros" : {
                "r" : NumberLong(6613952)
            }
        },
        "Database"   : {
            "acquireCount" : {
                "r" : NumberLong(2762)
            }
        },
        "Collection" : {
            "acquireCount" : {
                "r" : NumberLong(2762)
            }
        }
    }
}

А вот вывод того же запроса в оболочке с параметром executionStats.

Команда:

db.canvasdatas.find({
        "p"   : {
            "$gt": 0
        },
        "type": "canvas",
        "id"  : {
            "$in": [
                576391,
                570391,
                767422
            ]
        }
    }, {}).sort({ _id: -1 }).limit(5000).explain('executionStats');

Вывод:

{
    "queryPlanner"   : {
        "plannerVersion" : 1,
        "namespace"      : "db.collection",
        "indexFilterSet" : false,
        "parsedQuery"    : {
            "$and" : [
                {
                    "type" : {
                        "$eq" : "canvas"
                    }
                },
                {
                    "p" : {
                        "$gt" : 0
                    }
                },
                {
                    "id" : {
                        "$in" : [
                            570391,
                            576391,
                            767422
                        ]
                    }
                }
            ]
        },
        "winningPlan"    : {
            "stage"       : "SORT",
            "sortPattern" : {
                "_id" : -1
            },
            "limitAmount" : 5000,
            "inputStage"  : {
                "stage"      : "SORT_KEY_GENERATOR",
                "inputStage" : {
                    "stage"      : "FETCH",
                    "filter"     : {
                        "$and" : [
                            {
                                "type" : {
                                    "$eq" : "canvas"
                                }
                            },
                            {
                                "p" : {
                                    "$gt" : 0
                                }
                            }
                        ]
                    },
                    "inputStage" : {
                        "stage"        : "IXSCAN",
                        "keyPattern"   : {
                            "id" : 1
                        },
                        "indexName"    : "id_1",
                        "isMultiKey"   : false,
                        "isUnique"     : false,
                        "isSparse"     : false,
                        "isPartial"    : false,
                        "indexVersion" : 1,
                        "direction"    : "forward",
                        "indexBounds"  : {
                            "id" : [
                                "[570391.0, 570391.0]",
                                "[576391.0, 576391.0]",
                                "[767422.0, 767422.0]"
                            ]
                        }
                    }
                }
            }
        },
        "rejectedPlans"  : [
            {
                "stage"       : "SORT",
                "sortPattern" : {
                    "_id" : -1
                },
                "limitAmount" : 5000,
                "inputStage"  : {
                    "stage"      : "SORT_KEY_GENERATOR",
                    "inputStage" : {
                        "stage"      : "FETCH",
                        "filter"     : {
                            "id" : {
                                "$in" : [
                                    570391,
                                    576391,
                                    767422
                                ]
                            }
                        },
                        "inputStage" : {
                            "stage"        : "IXSCAN",
                            "keyPattern"   : {
                                "p"    : 1,
                                "type" : 1
                            },
                            "indexName"    : "p_1_type_1",
                            "isMultiKey"   : false,
                            "isUnique"     : false,
                            "isSparse"     : false,
                            "isPartial"    : false,
                            "indexVersion" : 1,
                            "direction"    : "forward",
                            "indexBounds"  : {
                                "p"    : [
                                    "(0.0, inf.0]"
                                ],
                                "type" : [
                                    "[\"canvas\", \"canvas\"]"
                                ]
                            }
                        }
                    }
                }
            },
            {
                "stage"       : "SORT",
                "sortPattern" : {
                    "_id" : -1
                },
                "limitAmount" : 5000,
                "inputStage"  : {
                    "stage"      : "SORT_KEY_GENERATOR",
                    "inputStage" : {
                        "stage"      : "FETCH",
                        "filter"     : {
                            "$and" : [
                                {
                                    "type" : {
                                        "$eq" : "canvas"
                                    }
                                },
                                {
                                    "id" : {
                                        "$in" : [
                                            570391,
                                            576391,
                                            767422
                                        ]
                                    }
                                }
                            ]
                        },
                        "inputStage" : {
                            "stage"        : "IXSCAN",
                            "keyPattern"   : {
                                "p" : 1
                            },
                            "indexName"    : "p_1",
                            "isMultiKey"   : false,
                            "isUnique"     : false,
                            "isSparse"     : false,
                            "isPartial"    : false,
                            "indexVersion" : 1,
                            "direction"    : "forward",
                            "indexBounds"  : {
                                "p" : [
                                    "(0.0, inf.0]"
                                ]
                            }
                        }
                    }
                }
            },
            {
                "stage"       : "SORT",
                "sortPattern" : {
                    "_id" : -1
                },
                "limitAmount" : 5000,
                "inputStage"  : {
                    "stage"      : "SORT_KEY_GENERATOR",
                    "inputStage" : {
                        "stage"      : "FETCH",
                        "filter"     : {
                            "$and" : [
                                {
                                    "p" : {
                                        "$gt" : 0
                                    }
                                },
                                {
                                    "id" : {
                                        "$in" : [
                                            570391,
                                            576391,
                                            767422
                                        ]
                                    }
                                }
                            ]
                        },
                        "inputStage" : {
                            "stage"        : "IXSCAN",
                            "keyPattern"   : {
                                "type" : 1
                            },
                            "indexName"    : "type_1",
                            "isMultiKey"   : false,
                            "isUnique"     : false,
                            "isSparse"     : false,
                            "isPartial"    : false,
                            "indexVersion" : 1,
                            "direction"    : "forward",
                            "indexBounds"  : {
                                "type" : [
                                    "[\"canvas\", \"canvas\"]"
                                ]
                            }
                        }
                    }
                }
            },
            {
                "stage"       : "LIMIT",
                "limitAmount" : 5000,
                "inputStage"  : {
                    "stage"      : "FETCH",
                    "filter"     : {
                        "$and" : [
                            {
                                "type" : {
                                    "$eq" : "canvas"
                                }
                            },
                            {
                                "p" : {
                                    "$gt" : 0
                                }
                            },
                            {
                                "id" : {
                                    "$in" : [
                                        570391,
                                        576391,
                                        767422
                                    ]
                                }
                            }
                        ]
                    },
                    "inputStage" : {
                        "stage"        : "IXSCAN",
                        "keyPattern"   : {
                            "_id" : 1
                        },
                        "indexName"    : "_id_",
                        "isMultiKey"   : false,
                        "isUnique"     : true,
                        "isSparse"     : false,
                        "isPartial"    : false,
                        "indexVersion" : 1,
                        "direction"    : "backward",
                        "indexBounds"  : {
                            "_id" : [
                                "[MaxKey, MinKey]"
                            ]
                        }
                    }
                }
            }
        ]
    },
    "executionStats" : {
        "executionSuccess"    : true,
        "nReturned"           : 2,
        "executionTimeMillis" : 0,
        "totalKeysExamined"   : 5,
        "totalDocsExamined"   : 2,
        "executionStages"     : {
            "stage"                       : "SORT",
            "nReturned"                   : 2,
            "executionTimeMillisEstimate" : 0,
            "works"                       : 10,
            "advanced"                    : 2,
            "needTime"                    : 6,
            "needYield"                   : 0,
            "saveState"                   : 0,
            "restoreState"                : 0,
            "isEOF"                       : 1,
            "invalidates"                 : 0,
            "sortPattern"                 : {
                "_id" : -1
            },
            "memUsage"                    : 906,
            "memLimit"                    : 33554432,
            "limitAmount"                 : 5000,
            "inputStage"                  : {
                "stage"                       : "SORT_KEY_GENERATOR",
                "nReturned"                   : 0,
                "executionTimeMillisEstimate" : 0,
                "works"                       : 6,
                "advanced"                    : 0,
                "needTime"                    : 3,
                "needYield"                   : 0,
                "saveState"                   : 0,
                "restoreState"                : 0,
                "isEOF"                       : 1,
                "invalidates"                 : 0,
                "inputStage"                  : {
                    "stage"                       : "FETCH",
                    "filter"                      : {
                        "$and" : [
                            {
                                "type" : {
                                    "$eq" : "canvas"
                                }
                            },
                            {
                                "p" : {
                                    "$gt" : 0
                                }
                            }
                        ]
                    },
                    "nReturned"                   : 2,
                    "executionTimeMillisEstimate" : 0,
                    "works"                       : 5,
                    "advanced"                    : 2,
                    "needTime"                    : 2,
                    "needYield"                   : 0,
                    "saveState"                   : 0,
                    "restoreState"                : 0,
                    "isEOF"                       : 1,
                    "invalidates"                 : 0,
                    "docsExamined"                : 2,
                    "alreadyHasObj"               : 0,
                    "inputStage"                  : {
                        "stage"                       : "IXSCAN",
                        "nReturned"                   : 2,
                        "executionTimeMillisEstimate" : 0,
                        "works"                       : 5,
                        "advanced"                    : 2,
                        "needTime"                    : 2,
                        "needYield"                   : 0,
                        "saveState"                   : 0,
                        "restoreState"                : 0,
                        "isEOF"                       : 1,
                        "invalidates"                 : 0,
                        "keyPattern"                  : {
                            "id" : 1
                        },
                        "indexName"                   : "id_1",
                        "isMultiKey"                  : false,
                        "isUnique"                    : false,
                        "isSparse"                    : false,
                        "isPartial"                   : false,
                        "indexVersion"                : 1,
                        "direction"                   : "forward",
                        "indexBounds"                 : {
                            "id" : [
                                "[570391.0, 570391.0]",
                                "[576391.0, 576391.0]",
                                "[767422.0, 767422.0]"
                            ]
                        },
                        "keysExamined"                : 5,
                        "dupsTested"                  : 0,
                        "dupsDropped"                 : 0,
                        "seenInvalidated"             : 0
                    }
                }
            }
        }
    },
    "serverInfo"     : {
        "host"       : "host",
        "port"       : 27017,
        "version"    : "3.2.21",
        "gitVersion" : ""
    },
    "ok"             : 1
}

Я прибегнул к этому неожиданному поведению, но не нашел никакого решения. Поэтому мне пришлось перезапустить сервер, когда он зависает ..

Чтобы помочь пониманию, вот мой случай:

  1. Я использую MongoDB Cloud Manager, а экземпляры БД размещаются на AWS EC2
  2. Я использую ReplicaSet и предпочитаю читать secondaryPreferred. Таким образом, все операции чтения идут к вторичному узлу.
  3. Версия MongoDB - 3.2
  4. Я создал индекс для всех полей, используемых в запросе (для каждого поля)
  5. Я выполнил один и тот же запрос как в первичном узле, так и во вторичном узле (с помощью *)1041 *)
  6. Коллекция содержит 20 млн. Объектов.

Это не происходит каждый раз для одного и того же запроса. Я думаю, что есть что-то еще, что влияет на производительность (например, репликация?)

Но я не знаю, как отладить этот случай. Есть ли лучшая идея для этой проблемы или способ отладки?

Спасибо,

Редактировать : Я до сих пор не понимаю, в чем причина, но попыталсярешить это путем внесения каких-либо изменений. Я удалил $gt и похоже на работу. Но у $gt нет проблем в моем предыдущем исполнении, и я думаю, что это потому, что в данный момент мало пользователей.

Редактировать : У меня есть диспетчер облаков MongoDB, поэтому я могу внести некоторые изменения в метрики, я думаю, что таргетинг на запросы увеличен, хотя я до сих пор не знаю. Обычно это около 100 на 1 документ, но сегодня он превышает 2K. Может быть связано?

Ориентация на запрос в течение 2 месяцев

1 Ответ

0 голосов
/ 14 октября 2019

Я думаю, это объясняет то, что вы видите:

"lockStats"         : {
        "Global"     : {
            "acquireCount"        : {
                "r" : NumberLong(5524)
            },
            "acquireWaitCount"    : {
                "r" : NumberLong(349)
            },
            "timeAcquiringMicros" : {
                "r" : NumberLong(6613952)
            }
        },

Похоже, что остановленное чтение требует времени, пытаясь получить блокировку намерения чтения. Это ожидается в более старой версии MongoDB (до 4.0), так как чтение из вторичного сервера будет ждать, пока идет операция применения oplog. Это сделано для того, чтобы вторичное чтение не считывало данные в несогласованной форме во время применения оплога.

Это длительное вторичное поведение чтения, начиная с самых ранних версий MongoDB, и я думаю, вы видите этоТеперь, когда ваша база данных достигла точки, когда она достаточно занята, чтобы это могло стать проблемой.

Эта ситуация была улучшена в MongoDB 4.0 и новее с помощью SERVER-34192 , что позволяет продолжить вторичное чтениев то время как применяется оплог.

...