Description:
As reported in bug #112223 AHI allocates memory on server startup, even if it is disabled.
This report is about that memory not being visible to Performannce Schema. For example, on a machine with a 192 GB buffer pool 3 GB is allocated to AHI hash table. But this is what gets reported by Performance Schema:
mysql> select * from sys.memory_global_by_current_bytes limit 3;
+---------------------------------+---------------+---------------+-------------------+------------+------------+----------------+
| event_name | current_count | current_alloc | current_avg_alloc | high_count | high_alloc | high_avg_alloc |
+---------------------------------+---------------+---------------+-------------------+------------+------------+----------------+
| memory/innodb/buf_buf_pool | 1512 | 192.97 GiB | 130.69 MiB | 1512 | 192.97 GiB | 130.69 MiB |
| memory/innodb/log_buffer_memory | 1 | 64.00 MiB | 64.00 MiB | 1 | 64.00 MiB | 64.00 MiB |
| memory/innodb/ut0link_buf | 2 | 24.00 MiB | 12.00 MiB | 2 | 24.00 MiB | 12.00 MiB |
+---------------------------------+---------------+---------------+-------------------+------------+------------+----------------+
3 rows in set (0.00 sec)
The reason is that ib_create() where that allocation happens uses allocation facilities that are not instrumented with Performance Schema:
hash_table_t *ib_create(size_t n, latch_id_t id, size_t n_sync_obj,
uint32_t type) {
hash_table_t *table;
ut_a(type == MEM_HEAP_FOR_BTR_SEARCH || type == MEM_HEAP_FOR_PAGE_HASH);
ut_ad(ut_is_2pow(n_sync_obj));
table = ut::new_<hash_table_t>(n); // <-- not PS-instrumented allocation
How to repeat:
select * from sys.memory_global_by_current_bytes;