mirror of
https://github.com/MariaDB/server.git
synced 2025-11-27 05:41:41 +03:00
The rw_lock_s_lock() calls for the buf_pool.page_hash became a clear bottleneck after MDEV-15053 reduced the contention on buf_pool.mutex. We will replace that use of rw_lock_t with a special implementation that is optimized for memory bus traffic. The hash_table_locks instrumentation will be removed. buf_pool_t::page_hash: Use a special implementation whose API is compatible with hash_table_t, and store the custom rw-locks directly in buf_pool.page_hash.array, intentionally sharing cache lines with the hash table pointers. rw_lock: A low-level rw-lock implementation based on std::atomic<uint32_t> where read_trylock() becomes a simple fetch_add(1). buf_pool_t::page_hash_latch: The special of rw_lock for the page_hash. buf_pool_t::page_hash_latch::read_lock(): Assert that buf_pool.mutex is not being held by the caller. buf_pool_t::page_hash_latch::write_lock() may be called while not holding buf_pool.mutex. buf_pool_t::watch_set() is such a caller. buf_pool_t::page_hash_latch::read_lock_wait(), page_hash_latch::write_lock_wait(): The spin loops. These will obey the global parameters innodb_sync_spin_loops and innodb_sync_spin_wait_delay. buf_pool_t::freed_page_hash: A singly linked list of copies of buf_pool.page_hash that ever existed. The fact that we never free any buf_pool.page_hash.array guarantees that all page_hash_latch that ever existed will remain valid until shutdown. buf_pool_t::resize_hash(): Replaces buf_pool_resize_hash(). Prepend a shallow copy of the old page_hash to freed_page_hash. buf_pool_t::page_hash_table::n_cells: Declare as Atomic_relaxed. buf_pool_t::page_hash_table::lock(): Explain what prevents a race condition with buf_pool_t::resize_hash().
65 lines
2.4 KiB
Plaintext
65 lines
2.4 KiB
Plaintext
UPDATE performance_schema.setup_instruments SET enabled = 'NO', timed = 'YES';
|
|
UPDATE performance_schema.setup_instruments SET enabled = 'YES'
|
|
WHERE name like 'wait/synch/sxlock/%';
|
|
TRUNCATE TABLE performance_schema.events_waits_history_long;
|
|
TRUNCATE TABLE performance_schema.events_waits_history;
|
|
TRUNCATE TABLE performance_schema.events_waits_current;
|
|
select name from performance_schema.setup_instruments
|
|
where name like "wait/synch/sxlock/%"
|
|
and name not in
|
|
("wait/synch/sxlock/innodb/buf_block_lock",
|
|
"wait/synch/sxlock/innodb/buf_block_debug_latch")
|
|
order by name;
|
|
name
|
|
wait/synch/sxlock/innodb/btr_search_latch
|
|
wait/synch/sxlock/innodb/dict_operation_lock
|
|
wait/synch/sxlock/innodb/dict_table_stats
|
|
wait/synch/sxlock/innodb/fil_space_latch
|
|
wait/synch/sxlock/innodb/fts_cache_init_rw_lock
|
|
wait/synch/sxlock/innodb/fts_cache_rw_lock
|
|
wait/synch/sxlock/innodb/index_online_log
|
|
wait/synch/sxlock/innodb/index_tree_rw_lock
|
|
wait/synch/sxlock/innodb/trx_i_s_cache_lock
|
|
wait/synch/sxlock/innodb/trx_purge_latch
|
|
select name from performance_schema.rwlock_instances
|
|
where name in
|
|
(
|
|
'wait/synch/sxlock/innodb/btr_search_latch',
|
|
'wait/synch/sxlock/innodb/checkpoint_lock',
|
|
'wait/synch/sxlock/innodb/dict_operation_lock',
|
|
'wait/synch/sxlock/innodb/trx_i_s_cache_lock',
|
|
'wait/synch/sxlock/innodb/trx_purge_latch'
|
|
)
|
|
order by name;
|
|
name
|
|
wait/synch/sxlock/innodb/btr_search_latch
|
|
wait/synch/sxlock/innodb/btr_search_latch
|
|
wait/synch/sxlock/innodb/btr_search_latch
|
|
wait/synch/sxlock/innodb/btr_search_latch
|
|
wait/synch/sxlock/innodb/btr_search_latch
|
|
wait/synch/sxlock/innodb/btr_search_latch
|
|
wait/synch/sxlock/innodb/btr_search_latch
|
|
wait/synch/sxlock/innodb/btr_search_latch
|
|
wait/synch/sxlock/innodb/dict_operation_lock
|
|
wait/synch/sxlock/innodb/trx_i_s_cache_lock
|
|
wait/synch/sxlock/innodb/trx_purge_latch
|
|
drop table if exists t1;
|
|
create table t1(a int) engine=innodb;
|
|
begin;
|
|
insert into t1 values (1), (2), (3);
|
|
insert into t1 values (1), (2), (3);
|
|
insert into t1 values (1), (2), (3);
|
|
commit;
|
|
drop table t1;
|
|
select operation from performance_schema.events_waits_history_long
|
|
where event_name like "wait/synch/sxlock/%"
|
|
and operation = "shared_lock" limit 1;
|
|
operation
|
|
shared_lock
|
|
select operation from performance_schema.events_waits_history_long
|
|
where event_name like "wait/synch/sxlock/%"
|
|
and operation = "exclusive_lock" limit 1;
|
|
operation
|
|
exclusive_lock
|
|
UPDATE performance_schema.setup_instruments SET enabled = 'YES', timed = 'YES';
|