Назад | Перейти на главную страницу

не отображаемая виртуальная память и общее количество подключений

У нас есть два узла данных MongoDB (набор реплик) - первичный и вторичный. Я заметил, что non-mapped virtual memory относительно высока и задается вопросом, не влияют ли они на производительность нашей MongoDB (сервер обычно достигает пика около 6-7K запросов в секунду).

В MMS сообщалось: «Самый распространенный случай использования большого объема памяти для не отображаемой - это наличие очень большого количества подключений к базе данных».

Итак, мы проверили использование памяти с помощью db.serverStatus().mem в нашей средней школе:

{
    "bits" : 64,
    "resident" : 6846,
    "virtual" : 416797,
    "supported" : true,
    "mapped" : 205549,
    "mappedWithJournal" : 411098,
    "note" : "virtual minus mapped is large. could indicate a memory leak"
}

Примечание. Мы используем 2.0.4, и теперь размер стека по умолчанию должен составлять 1 МБ на каждое соединение.

Текущее количество подключений составляет около 1,1 КБ, но не отображаемая виртуальная память (virtual-mappedWithJournal) составляет около 5699 МБ. Тенденция довольно устойчивая, поэтому не могу сказать, что здесь утечка, но куда девается память?

Любая идея?

Во-первых, позвольте мне сказать, что если он относительно стабилен, у вас нет утечки памяти, и это примечание в serverStatus () было удалено в 2.2 из-за частоты ложных срабатываний.

Не отображенная виртуальная память - это внутренние структуры данных и стеки потоков MongoDB, по сути, все, что не поддерживается файлами на диске. Как вы упомянули, это обычно обусловлено стеком соединений из расчета 1 МБ на соединение. В вашем случае похоже, что это должно быть около отметки 1,1–1,2 ГБ (если у вас не было скачка соединения и память еще не была освобождена).

Если вы делаете много встроенных карт / сокращений, сортировки в памяти и т. Д., Они также могут увеличить использование не отображаемой памяти. Если вы установите MMS (что является бесплатным), неотображенная память - это одна из статистических данных, отслеживаемых с течением времени, и вы можете легко сопоставить увеличение не сопоставленной статистики с активностью в вашей базе данных. Однако, если вы еще не запускали его, вам может потребоваться перезапустить процесс, чтобы снова отслеживать использование с нуля.

Этот тип анализа использования зачастую проще, чем использование pmap (или аналогичный), чтобы попытаться привязать память к определенным частям внутри процесса

Наконец, если использование без сопоставления выходит из-под контроля, иногда это может быть вызвано проблемами с libc malloc в 2.0 - среди прочего, именно поэтому версия 2.2 отправлен с участием TCMalloc вместо. Так что, возможно, стоит проверить версию 2.2, если она остается высокой без очевидной причины.