parser

Написать ответ на текущее сообщение

 

 
   команды управления поиском

Автоматический режим сборщика мусора

moko 16.01.2021 01:40

Там слишком коротко описано, на самом деле это просто разовая проверка в начале обработки запроса и ручной вызов ^memory:compact[].

Но: сборщик мусора действительно можно переключить в автоматический режим (надо только придумать название опции в @conf или как-то иначе). Правда это имеет свою цену.

Вот у меня под рукой сейчас был код, который обрабатывает json из примерно 1,500,000 строк.
При сборке в ручном режиме:

before: cpu 0.823952 rss 414300 used 348200 free 43076 since 0 total 385920.78125
after: cpu 6.165322 rss 2485644 used 2293276 free 6736 since 2795594.046875 total 3181514.828125
compact: cpu 6.337695 rss 2485644 used 309192 free 1990820 since 0 total 3181519.09375

При сборке в автоматическом режиме:

before: cpu 0.936338 rss 340444 used 311780 free 5640 since 67844.421875 total 385927.203125
after: cpu 8.878208 rss 459392 used 387092 free 36824 since 93077.25 total 3181518.671875
compact: cpu 8.878228 rss 459392 used 387092 free 36824 since 93081.34375 total 3181522.765625

Видно, что в ручном режиме процесс вырос до ~2.5Gb, разовая сборка мусора (освободившая ~2Gb) заняла ~0.17 sec. Но результат мы получили за 6.3 sec. В автоматическом режиме процесс вырос всего до ~500Mb, но потратили на 2,5 sec больше. Можно предположить, что в процессе автоматическая сборка мусора запускалась порядка 20 раз.

В сборщике мусора есть параметр GC_free_space_divisor, который влияет на частоту сборки мусора.
По умолчанию 3. Можно например в @conf разрешить его задавать (и если он задан, переходить на автоматическую сборку).

/* We try to make sure that we allocate at */
/* least N/GC_free_space_divisor bytes between */
/* collections, where N is twice the number */
/* of traced bytes, plus the number of untraced */
/* bytes (bytes in "atomic" objects), plus */
/* a rough estimate of the root set size. */
/* N approximates GC tracing work per GC. */
/* The initial value is GC_FREE_SPACE_DIVISOR. */
/* Increasing its value will use less space */
/* but more collection time. Decreasing it */
/* will appreciably decrease collection time */
/* at the expense of space. */
/* The setter and getter are unsynchronized, so */
/* GC_call_with_alloc_lock() is required to */
/* avoid data races (if the value is modified */
/* after the GC is put to multi-threaded mode). */
/* In version 7.1 (and before), the setter */
/* returned the old value. */

При минимальном значении (1) результат такой:

before: cpu 0.928119 rss 339220 used 311788 free 5632 since 67854.09375 total 385928.65625
after: cpu 7.505589 rss 636636 used 384148 free 203608 since 116849.65625 total 3181518.015625
compact: cpu 7.505618 rss 636636 used 384148 free 203608 since 116851.625 total 3181519.984375