mirror of
https://github.com/isar/libmdbx.git
synced 2024-10-30 11:29:19 +08:00
mdbx: дополнительные условия для prefault-write.
This commit is contained in:
parent
1ae6a398ed
commit
1c93cff825
20
src/core.c
20
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);
|
||||
|
Loading…
Reference in New Issue
Block a user