[MDEV-15053] Reduce buf_pool_t::mutex contention Created: 2018-01-24 Updated: 2024-01-30 Resolved: 2020-06-05 |
|
| Status: | Closed |
| Project: | MariaDB Server |
| Component/s: | Storage Engine - InnoDB |
| Fix Version/s: | 10.5.4 |
| Type: | Task | Priority: | Critical |
| Reporter: | Marko Mäkelä | Assignee: | Marko Mäkelä |
| Resolution: | Fixed | Votes: | 1 |
| Labels: | performance | ||
| Attachments: |
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Issue Links: |
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Sprint: | 10.3.6-1, 10.4.0-1 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Description |
|
MySQL 8.0.0 split the InnoDB buf_pool_t::mutex. MariaDB should do something similar. Instead of introducing more mutexes or radically changing the latching rules of various buf_pool_t and buf_block_t data members, I think that it is possible to reduce the contention on buf_pool.mutex by other means:
|
| Comments |
| Comment by Marko Mäkelä [ 2018-02-08 ] |
|
This was originally contributed by kastauyra as MySQL Bug #75534: Solve buffer pool mutex contention by splitting it. |
| Comment by Laurynas Biveinis [ 2018-02-09 ] |
|
Make sure to review https://bugs.mysql.com/bug.php?id=85205, https://bugs.mysql.com/bug.php?id=85208. If your starting point is Oracle 8.0.3 commit, try to find follow-up fixes too, I only recall 946996a3767, e34c6b0dea2 from the top of my head. |
| Comment by Marko Mäkelä [ 2018-02-21 ] |
|
kastauyra, thank you for the helpful pointers! |
| Comment by Marko Mäkelä [ 2018-02-21 ] |
|
thiru, a search of the MySQL 8.0 commit history reveals quite a few follow-up commits. Please cherry-pick those as well. |
| Comment by Marko Mäkelä [ 2018-02-22 ] |
|
Let us use the new branch bb-10.3-MDEV-15053 for this. What remains to be done:
|
| Comment by Marko Mäkelä [ 2019-01-21 ] |
|
In MySQL 8.0.14 there is a related bug fix: |
| Comment by Marko Mäkelä [ 2020-01-27 ] |
|
The work is not only splitting buf_pool_t::mutex but also changing some data fields to rely on atomic memory operations instead of mutexes for controlling concurrent access. The work so far was done on 10.3, where std::atomic is not available to InnoDB. Starting with 10.4, it is available and should be used. I think that we should try to use std::memory_order_relaxed where available. |
| Comment by Marko Mäkelä [ 2020-03-17 ] |
|
This will require some more work and a careful review. At the moment, cmake -DWITH_ASAN is reporting heap-use-after-free in numerous tests. |
| Comment by Matthias Leich [ 2020-03-23 ] |
|
Result of RQG testing on origin/bb-10.5-marko commit ab5fe285276ab2dc4d87fb59a31655db51706da5 |
| Comment by Matthias Leich [ 2020-05-27 ] |
|
Result of RQG testing on origin/bb-10.5- |
| Comment by Marko Mäkelä [ 2020-05-29 ] |
|
kevg, after your review I still fixed one thing that probably caused the occasional hangs that axel reproduced in buf_page_init_for_read(). I had wrongly released the buf_pool.page_hash latch before buf_page_t::set_io_fix(BUF_IO_READ) was called. This was a functional change from earlier. |
| Comment by Marko Mäkelä [ 2020-06-04 ] |
|
The hang was very elusive, but finally I found the reason. Now that we removed buf_block_t::mutex, we must release buf_block_t::lock before invoking buf_block_t::unfix() or buf_block_t::io_unfix(). Otherwise, something bad will happen somewhere, causing a block in the buf_pool.free list to permanently remain in X-latched state, with block->lock.writer_thread==0. We only experienced the hang in a release build, and it never reproduced under rr record. In the end, I disabled buf_page_optimistic_get() and added debug assertions on buf_block_t::lock when the buf_pool.free list is modified. To be able to do that, I had to fix a glitch in dict_check_sys_tables(). |
| Comment by Marko Mäkelä [ 2020-06-09 ] |
|
To reduce contention especially in read-only workloads, we increased svr_n_page_hash_locks from 16 to 64 and added LF_BACKOFF() to the spin loop in rw_lock_lock_word_decr(). |