MongoDB выделяет много памяти при одновременном обновлении одного документа - PullRequest
0 голосов
/ 13 ноября 2018

Может ли кто-нибудь объяснить мне ситуацию, когда Монго выделяет много памяти при одновременном обновлении одного документа.

О чем я говорю:

У меня есть один документ со структурой, подобной этой:

{ id, data: [{id, status}] }

Поле данных содержит много объектов (в моем тестовом случае 5000 объектов).

В тесте я просто обновляю каждый объект данных в одном документе.

Когда я делаю это синхронно, никаких дополнительных выделений памяти нет. Но когда я обновляю документ параллельно, Mongo выделяет более 2 ГБ дополнительной памяти.

В первом случае имеются выделения (синхронно):

{
    "pageheap_free_bytes" : 23552000,
    "pageheap_unmapped_bytes" : 0,
    "max_total_thread_cache_bytes" : NumberLong(1073741824),
    "current_total_thread_cache_bytes" : 994032,
    "total_free_bytes" : 7793496,
    "central_cache_free_bytes" : 4958056,
    "transfer_cache_free_bytes" : 1841408,
    "thread_cache_free_bytes" : 994032,
    "aggressive_memory_decommit" : 0,
    "pageheap_committed_bytes" : 112832512,
    "pageheap_scavenge_count" : 0,
    "pageheap_commit_count" : 85,
    "pageheap_total_commit_bytes" : 112832512,
    "pageheap_decommit_count" : 0,
    "pageheap_total_decommit_bytes" : 0,
    "pageheap_reserve_count" : 85,
    "pageheap_total_reserve_bytes" : 112832512,
    "spinlock_total_delay_ns" : NumberLong(1169495344),
    "formattedString" : "------------------------------------------------\nMALLOC:       81487592 (   77.7 MiB) Bytes in use by application\nMALLOC: +     23552000 (   22.5 MiB) Bytes in page heap freelist\nMALLOC: +      4958056 (    4.7 MiB) Bytes in central cache freelist\nMALLOC: +      1841408 (    1.8 MiB) Bytes in transfer cache freelist\nMALLOC: +       993456 (    0.9 MiB) Bytes in thread cache freelists\nMALLOC: +      2318592 (    2.2 MiB) Bytes in malloc metadata\nMALLOC:   ------------\nMALLOC: =    115151104 (  109.8 MiB) Actual memory used (physical + swap)\nMALLOC: +            0 (    0.0 MiB) Bytes released to OS (aka unmapped)\nMALLOC:   ------------\nMALLOC: =    115151104 (  109.8 MiB) Virtual address space used\nMALLOC:\nMALLOC:           2618              Spans in use\nMALLOC:             25              Thread heaps in use\nMALLOC:           4096              Tcmalloc page size\n------------------------------------------------\nCall ReleaseFreeMemory() to release freelist memory to the OS (via madvise()).\nBytes released to the OS take up virtual address space but no physical memory.\n"
}

И второй:

{
    "pageheap_free_bytes" : 1020854272,
    "pageheap_unmapped_bytes" : 13770752,
    "max_total_thread_cache_bytes" : NumberLong(1073741824),
    "current_total_thread_cache_bytes" : 1996120,
    "total_free_bytes" : 24262888,
    "central_cache_free_bytes" : 19604560,
    "transfer_cache_free_bytes" : 2662208,
    "thread_cache_free_bytes" : 1996120,
    "aggressive_memory_decommit" : 0,
    "pageheap_committed_bytes" : NumberLong(2859118592),
    "pageheap_scavenge_count" : 51,
    "pageheap_commit_count" : 2781,
    "pageheap_total_commit_bytes" : NumberLong(2886373376),
    "pageheap_decommit_count" : 51,
    "pageheap_total_decommit_bytes" : 27254784,
    "pageheap_reserve_count" : 2690,
    "pageheap_total_reserve_bytes" : NumberLong(2872889344),
    "spinlock_total_delay_ns" : NumberLong(158962109950),
    "formattedString" : "------------------------------------------------\nMALLOC:     1814002008 ( 1730.0 MiB) Bytes in use by application\nMALLOC: +   1020854272 (  973.6 MiB) Bytes in page heap freelist\nMALLOC: +     19604560 (   18.7 MiB) Bytes in central cache freelist\nMALLOC: +      2662208 (    2.5 MiB) Bytes in transfer cache freelist\nMALLOC: +      1995544 (    1.9 MiB) Bytes in thread cache freelists\nMALLOC: +     12574976 (   12.0 MiB) Bytes in malloc metadata\nMALLOC:   ------------\nMALLOC: =   2871693568 ( 2738.7 MiB) Actual memory used (physical + swap)\nMALLOC: +     13770752 (   13.1 MiB) Bytes released to OS (aka unmapped)\nMALLOC:   ------------\nMALLOC: =   2885464320 ( 2751.8 MiB) Virtual address space used\nMALLOC:\nMALLOC:          19410              Spans in use\nMALLOC:             28              Thread heaps in use\nMALLOC:           4096              Tcmalloc page size\n------------------------------------------------\nCall ReleaseFreeMemory() to release freelist memory to the OS (via madvise()).\nBytes released to the OS take up virtual address space but no physical memory.\n"
}

Как вы можете видеть Байты, используемые приложением и Байты в свободном списке кучи страниц увеличены с 77,7 / 22,5 МБ до 1730 / 973,6 МБ.

Так что, если я запускаю параллельный код несколько раз, эти числа возрастают линейно.

Может ли кто-нибудь объяснить, что происходит, когда mongo обрабатывает параллельные запросы и как предотвратить распределение?

В своих тестах я использую mongoDb 4.0.4 ( здесь - это образ докера) и .net core client .

1 Ответ

0 голосов
/ 14 ноября 2018

Когда вы делаете последовательное обновление, вы делаете это с одним потоком. Который будет использовать только одно соединение. Каждый протектор соединения может потребовать до 1 МБ. согласно документации

Если вы выполняете параллельные обновления, это будет иметь несколько протекторов подключения, каждый из которых будет использовать 1 МБ, что приведет к увеличению использования памяти.

...