-
Notifications
You must be signed in to change notification settings - Fork 32
Update chaindb to use a slab allocator for small size buffers.
#1070
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: release/2.0
Are you sure you want to change the base?
Conversation
|
Note:start |
chaindb to use a slab allocator for small size buffers.
| _file_mapping = bip::file_mapping(_data_file_path.generic_string().c_str(), bip::read_write); | ||
| _file_mapped_region = bip::mapped_region(_file_mapping, bip::read_write); | ||
| file_mapped_segment_manager = new ((char*)_file_mapped_region.get_address()+header_size) segment_manager(shared_file_size-header_size); | ||
| new (_file_mapped_region.get_address()) db_header; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This line must remain when merged.
The change from: 5153e29#diff-4598b34f65fa412d3263ad3b6d1d1711c29a7c1b7689ed659c63a5ab1cc0b682R141
Doesn't work with the small allocator.
| if(hs.fail()) | ||
| BOOST_THROW_EXCEPTION(std::system_error(make_error_code(db_error_code::bad_header))); | ||
|
|
||
| db_header* dbheader = reinterpret_cast<db_header*>(header); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This also must remain when merged.
Resolves #1049.
Now this integrates the changes from AntelopeIO/chainbase#54, which can be referred to for previous comments.
As the issue describes, the current chainbase does a lot of small buffer allocations directly through the bip allocator which hits the segment manager directly. Not only this is inefficient (the rbtree of free buffers need to be rebalanced for every alloc/free), it also has a higher memory overhead.
The slab allocators for small buffers (in the updated chainbase submodule) batch allocations of small buffers into larger blocks, reducing the fragmentattion within the shared memory segment, and providing better efficiency and a smaller memory footprint.
For comparison, here are some results comparing snapshot loading on my linux box (release build)
snapshot from Aug 11, 2024
snapshot from Sept 29, 2024
I also expect a slight performance increase for processing transactions, as the
_undo_stackdeque allocations used to go through the segment allocator as well (for blocks of 16undo_state), and these allocations are now batched.