mdbx: подстройка rp_augment_limit в зависимости от gc_time_limit.

Когда rp_augment_limit не задан пользователем посредством
`MDBX_opt_rp_augment_limit`, то как и ранее он подстраивается в
зависимости от текущего размера БД (актуального кол-ва страниц).

Теперь-же авто-устанавливаемое значение rp_augment_limit вычисляется
обратно-пропорционально `MDBX_opt_gc_time_limit`:

 - Если gc_time_limit == 0, то rp_augment_limit устанавливается в 1/3 от
   общего кол-ва страниц БД, но не меньше рационального минимума.
   Это соответствует прежнему поведению и обеспечивает достаточно глубокую
   переработку GC во всех не-экстремальных сценариях.

 - При gc_time_limit >= 16_секунд
   rp_augment_limit устанавливается в минимальное значение.

 - Когда 0 < gc_time_limit < 16_секунд
   rp_augment_limit устанавливается между минимумом и 1/3 от размера БД
   пропорционально остатку gc_time_limit до 16 секунд.

Соответственно, при больших значениях gc_time_limit, выбирается меньшее
значение rp_augment_limit, и контроль глубины переработки GC
ограничивается в основном по-времени.
This commit is contained in:
Леонид Юрьев (Leonid Yuriev) 2023-11-30 22:53:28 +03:00
parent eeec44f56d
commit 169e69c52e

View File

@ -6423,11 +6423,21 @@ __cold static void munlock_all(const MDBX_env *env) {
}
__cold static unsigned default_rp_augment_limit(const MDBX_env *env) {
/* default rp_augment_limit = npages / 3 */
const size_t augment = env->me_dbgeo.now / 3 >> env->me_psize2log;
eASSERT(env, augment < MDBX_PGL_LIMIT);
return pnl_bytes2size(pnl_size2bytes(
(augment > MDBX_PNL_INITIAL) ? augment : MDBX_PNL_INITIAL));
const size_t timeframe = 16 << 16;
const size_t remain_1sec =
(env->me_options.gc_time_limit < timeframe)
? timeframe - (size_t)env->me_options.gc_time_limit
: 0;
const size_t minimum = (env->me_maxgc_ov1page * 2 > MDBX_PNL_INITIAL)
? env->me_maxgc_ov1page * 2
: MDBX_PNL_INITIAL;
const size_t one_third = env->me_dbgeo.now / 3 >> env->me_psize2log;
const size_t augment_limit =
(one_third > minimum)
? minimum + (one_third - minimum) / timeframe * remain_1sec
: minimum;
eASSERT(env, augment_limit < MDBX_PGL_LIMIT);
return pnl_bytes2size(pnl_size2bytes(augment_limit));
}
static bool default_prefault_write(const MDBX_env *env) {
@ -25918,6 +25928,8 @@ __cold int mdbx_env_set_option(MDBX_env *env, const MDBX_option_t option,
if (env->me_txn && env->me_txn0->mt_owner != osal_thread_self())
return MDBX_EPERM;
env->me_options.gc_time_limit = value;
if (!env->me_options.flags.non_auto.rp_augment_limit)
env->me_options.rp_augment_limit = default_rp_augment_limit(env);
}
break;