Details
-
Bug
-
Status: In Testing (View Workflow)
-
Critical
-
Resolution: Unresolved
-
N/A
-
None
Description
UPDATE performance_schema.setup_instruments |
SET enabled='YES', timed='YES' |
WHERE name LIKE 'memory%'; |
|
|
--echo #
|
--echo # max_heap_table_size = 64M, MIN_ROWS = 2M
|
--echo #
|
|
|
SET SESSION max_heap_table_size= 64*1024*1024; |
|
|
CREATE TABLE t1 (a INT, b INT, KEY(a)) ENGINE=MEMORY MIN_ROWS=20000000; |
INSERT INTO t1 VALUES (1,1); |
SELECT format_bytes(DATA_LENGTH), format_bytes(INDEX_LENGTH) |
FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1'; |
SELECT format_bytes(current_alloc), format_bytes(high_alloc) |
FROM sys.x$memory_global_by_current_bytes |
WHERE event_name = 'memory/memory/HP_PTRS'; |
|
|
DROP TABLE t1; |
|
|
--echo #
|
--echo # max_heap_table_size = 256M, MIN_ROWS = 2M
|
--echo #
|
|
|
SET SESSION max_heap_table_size= 256*1024*1024; |
|
|
CREATE TABLE t1 (a INT, b INT, KEY(a)) ENGINE=MEMORY MIN_ROWS=20000000; |
INSERT INTO t1 VALUES (1,1); |
SELECT format_bytes(DATA_LENGTH), format_bytes(INDEX_LENGTH) |
FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1'; |
SELECT format_bytes(current_alloc), format_bytes(high_alloc) |
FROM sys.x$memory_global_by_current_bytes |
WHERE event_name = 'memory/memory/HP_PTRS'; |
|
|
DROP TABLE t1; |
|
|
--echo #
|
--echo # max_heap_table_size = 256M, MIN_ROWS = 4M
|
--echo #
|
|
|
CREATE TABLE t1 (a INT, b INT, KEY(a)) ENGINE=MEMORY MIN_ROWS=40000000; |
INSERT INTO t1 VALUES (1,1); |
SELECT format_bytes(DATA_LENGTH), format_bytes(INDEX_LENGTH) |
FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1'; |
SELECT format_bytes(current_alloc), format_bytes(high_alloc) |
FROM sys.x$memory_global_by_current_bytes |
WHERE event_name = 'memory/memory/HP_PTRS'; |
|
|
DROP TABLE t1; |
|
pull/5481 f2c88afdbd8322654255b8ba281c91b967cc3a39 |
#
|
# max_heap_table_size = 64M, MIN_ROWS = 2M
|
#
|
SET SESSION max_heap_table_size= 64*1024*1024; |
CREATE TABLE t1 (a INT, b INT, KEY(a)) ENGINE=MEMORY MIN_ROWS=20000000; |
INSERT INTO t1 VALUES (1,1); |
SELECT format_bytes(DATA_LENGTH), format_bytes(INDEX_LENGTH) |
FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1'; |
format_bytes(DATA_LENGTH) format_bytes(INDEX_LENGTH)
|
512.00 MiB 512.00 MiB
|
SELECT format_bytes(current_alloc), format_bytes(high_alloc) |
FROM sys.x$memory_global_by_current_bytes |
WHERE event_name = 'memory/memory/HP_PTRS'; |
format_bytes(current_alloc) format_bytes(high_alloc)
|
1.00 GiB 1.00 GiB
|
DROP TABLE t1; |
#
|
# max_heap_table_size = 256M, MIN_ROWS = 2M
|
#
|
SET SESSION max_heap_table_size= 256*1024*1024; |
CREATE TABLE t1 (a INT, b INT, KEY(a)) ENGINE=MEMORY MIN_ROWS=20000000; |
INSERT INTO t1 VALUES (1,1); |
SELECT format_bytes(DATA_LENGTH), format_bytes(INDEX_LENGTH) |
FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1'; |
format_bytes(DATA_LENGTH) format_bytes(INDEX_LENGTH)
|
512.00 MiB 512.00 MiB
|
SELECT format_bytes(current_alloc), format_bytes(high_alloc) |
FROM sys.x$memory_global_by_current_bytes |
WHERE event_name = 'memory/memory/HP_PTRS'; |
format_bytes(current_alloc) format_bytes(high_alloc)
|
1.00 GiB 1.00 GiB
|
DROP TABLE t1; |
#
|
# max_heap_table_size = 256M, MIN_ROWS = 4M
|
#
|
CREATE TABLE t1 (a INT, b INT, KEY(a)) ENGINE=MEMORY MIN_ROWS=40000000; |
INSERT INTO t1 VALUES (1,1); |
SELECT format_bytes(DATA_LENGTH), format_bytes(INDEX_LENGTH) |
FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1'; |
format_bytes(DATA_LENGTH) format_bytes(INDEX_LENGTH)
|
1.00 GiB 1.00 GiB
|
SELECT format_bytes(current_alloc), format_bytes(high_alloc) |
FROM sys.x$memory_global_by_current_bytes |
WHERE event_name = 'memory/memory/HP_PTRS'; |
format_bytes(current_alloc) format_bytes(high_alloc)
|
2.00 GiB 2.00 GiB
|
Compare to the baseline:
|
main c3ec2dc368a8c7165cdbea58208eb828e76ebc57 |
#
|
# max_heap_table_size = 64M, MIN_ROWS = 2M
|
#
|
SET SESSION max_heap_table_size= 64*1024*1024; |
CREATE TABLE t1 (a INT, b INT, KEY(a)) ENGINE=MEMORY MIN_ROWS=20000000; |
INSERT INTO t1 VALUES (1,1); |
SELECT format_bytes(DATA_LENGTH), format_bytes(INDEX_LENGTH) |
FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1'; |
format_bytes(DATA_LENGTH) format_bytes(INDEX_LENGTH)
|
32.00 MiB 64.00 MiB
|
SELECT format_bytes(current_alloc), format_bytes(high_alloc) |
FROM sys.x$memory_global_by_current_bytes |
WHERE event_name = 'memory/memory/HP_PTRS'; |
format_bytes(current_alloc) format_bytes(high_alloc)
|
96.00 MiB 96.02 MiB
|
DROP TABLE t1; |
#
|
# max_heap_table_size = 256M, MIN_ROWS = 2M
|
#
|
SET SESSION max_heap_table_size= 256*1024*1024; |
CREATE TABLE t1 (a INT, b INT, KEY(a)) ENGINE=MEMORY MIN_ROWS=20000000; |
INSERT INTO t1 VALUES (1,1); |
SELECT format_bytes(DATA_LENGTH), format_bytes(INDEX_LENGTH) |
FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1'; |
format_bytes(DATA_LENGTH) format_bytes(INDEX_LENGTH)
|
128.00 MiB 256.00 MiB
|
SELECT format_bytes(current_alloc), format_bytes(high_alloc) |
FROM sys.x$memory_global_by_current_bytes |
WHERE event_name = 'memory/memory/HP_PTRS'; |
format_bytes(current_alloc) format_bytes(high_alloc)
|
384.00 MiB 384.02 MiB
|
DROP TABLE t1; |
#
|
# max_heap_table_size = 256M, MIN_ROWS = 4M
|
#
|
CREATE TABLE t1 (a INT, b INT, KEY(a)) ENGINE=MEMORY MIN_ROWS=40000000; |
INSERT INTO t1 VALUES (1,1); |
SELECT format_bytes(DATA_LENGTH), format_bytes(INDEX_LENGTH) |
FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1'; |
format_bytes(DATA_LENGTH) format_bytes(INDEX_LENGTH)
|
128.00 MiB 256.00 MiB
|
SELECT format_bytes(current_alloc), format_bytes(high_alloc) |
FROM sys.x$memory_global_by_current_bytes |
WHERE event_name = 'memory/memory/HP_PTRS'; |
format_bytes(current_alloc) format_bytes(high_alloc)
|
384.00 MiB 384.02 MiB
|
The memory consumption is real (not an I_S/P_S glitch), so even with the moderate max_heap_table_size several tables with large enough MIN_ROWS easily cause OOM.
Attachments
Issue Links
- is caused by
-
MDEV-38975 BLOBs in MEMORY (HEAP) Engine
-
- In Testing
-
-
MDEV-40447 HEAP initial block allocation is sized from max_records, causing per-statement giant mmap/munmap and mmap_lock contention with large tmp_table_size
-
- In Testing
-