mdbx: дополнительные условия для prefault-write.

This commit is contained in:
Леонид Юрьев (Leonid Yuriev) 2022-12-11 00:14:40 +03:00
parent 1ae6a398ed
commit 1c93cff825

View File

@ -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);