From 1c93cff8252dea5af1d9298c5e09584ad439d1a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9B=D0=B5=D0=BE=D0=BD=D0=B8=D0=B4=20=D0=AE=D1=80=D1=8C?= =?UTF-8?q?=D0=B5=D0=B2=20=28Leonid=20Yuriev=29?= Date: Sun, 11 Dec 2022 00:14:40 +0300 Subject: [PATCH] =?UTF-8?q?mdbx:=20=D0=B4=D0=BE=D0=BF=D0=BE=D0=BB=D0=BD?= =?UTF-8?q?=D0=B8=D1=82=D0=B5=D0=BB=D1=8C=D0=BD=D1=8B=D0=B5=20=D1=83=D1=81?= =?UTF-8?q?=D0=BB=D0=BE=D0=B2=D0=B8=D1=8F=20=D0=B4=D0=BB=D1=8F=20prefault-?= =?UTF-8?q?write.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/core.c | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/src/core.c b/src/core.c index 0c3d7cbc..311e52d3 100644 --- a/src/core.c +++ b/src/core.c @@ -7046,8 +7046,24 @@ static __inline pgr_t page_alloc_finalize(MDBX_env *const env, * неё пишет ЦПУ. */ const bool readahead_enabled = env->me_lck->mti_readahead_anchor & 1; const pgno_t readahead_edge = env->me_lck->mti_readahead_anchor >> 1; - /* Не суетимся если страница в зоне включенного упреждающего чтения */ - if (!readahead_enabled || pgno + num > readahead_edge) { + /* В случае если страница в памяти процесса, то излишняя запись может быть + * достаточно дорогой. Кроме системного вызова и копирования данных, в особо + * одаренных ОС при этом могут включаться файловая система, выделяться + * временная страница, пополняться очереди асинхронного выполнения, + * обновляться PTE с последующей генерацией page-fault и чтением данных из + * грязной I/O очереди. Из-за этого штраф за лишнюю запись может быть + * сравним с избегаемым ненужным чтением. + * + * Проверка посредством minicore() существенно снижает затраты, но в + * простейших случаях (тривиальный бенчмарк) интегральная производительность + * становится вдвое меньше. А на платформах без minocore() и с проблемной + * подсистемой виртуальной памяти ситуация может быть многократно хуже. + * Поэтому избегаем затрат в ситуациях когда prefaukt-write скорее всего не + * нужна. Стоит подумать над дополнительными критериями. */ + if (/* Не суетимся если GC почти пустая и БД маленькая */ + (txn->mt_dbs[FREE_DBI].md_branch_pages || txn->mt_geo.now > 1234) && + /* Не суетимся если страница в зоне включенного упреждающего чтения */ + (!readahead_enabled || pgno + num > readahead_edge)) { void *const pattern = ptr_disp( env->me_pbuf, need_clean ? env->me_psize : env->me_psize * 2); size_t file_offset = pgno2bytes(env, pgno);