mirror of
https://github.com/isar/libmdbx.git
synced 2025-04-05 16:27:46 +08:00
mdbx: дополнительные условия для prefault-write.
This commit is contained in:
parent
1ae6a398ed
commit
1c93cff825
18
src/core.c
18
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 bool readahead_enabled = env->me_lck->mti_readahead_anchor & 1;
|
||||||
const pgno_t readahead_edge = env->me_lck->mti_readahead_anchor >> 1;
|
const pgno_t readahead_edge = env->me_lck->mti_readahead_anchor >> 1;
|
||||||
|
/* В случае если страница в памяти процесса, то излишняя запись может быть
|
||||||
|
* достаточно дорогой. Кроме системного вызова и копирования данных, в особо
|
||||||
|
* одаренных ОС при этом могут включаться файловая система, выделяться
|
||||||
|
* временная страница, пополняться очереди асинхронного выполнения,
|
||||||
|
* обновляться PTE с последующей генерацией page-fault и чтением данных из
|
||||||
|
* грязной I/O очереди. Из-за этого штраф за лишнюю запись может быть
|
||||||
|
* сравним с избегаемым ненужным чтением.
|
||||||
|
*
|
||||||
|
* Проверка посредством minicore() существенно снижает затраты, но в
|
||||||
|
* простейших случаях (тривиальный бенчмарк) интегральная производительность
|
||||||
|
* становится вдвое меньше. А на платформах без minocore() и с проблемной
|
||||||
|
* подсистемой виртуальной памяти ситуация может быть многократно хуже.
|
||||||
|
* Поэтому избегаем затрат в ситуациях когда prefaukt-write скорее всего не
|
||||||
|
* нужна. Стоит подумать над дополнительными критериями. */
|
||||||
|
if (/* Не суетимся если GC почти пустая и БД маленькая */
|
||||||
|
(txn->mt_dbs[FREE_DBI].md_branch_pages || txn->mt_geo.now > 1234) &&
|
||||||
/* Не суетимся если страница в зоне включенного упреждающего чтения */
|
/* Не суетимся если страница в зоне включенного упреждающего чтения */
|
||||||
if (!readahead_enabled || pgno + num > readahead_edge) {
|
(!readahead_enabled || pgno + num > readahead_edge)) {
|
||||||
void *const pattern = ptr_disp(
|
void *const pattern = ptr_disp(
|
||||||
env->me_pbuf, need_clean ? env->me_psize : env->me_psize * 2);
|
env->me_pbuf, need_clean ? env->me_psize : env->me_psize * 2);
|
||||||
size_t file_offset = pgno2bytes(env, pgno);
|
size_t file_offset = pgno2bytes(env, pgno);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user