Uploaded image for project: 'MariaDB Server'
  1. MariaDB Server
  2. MDEV-40669

HEAP tables with MIN_ROWS ignore max_heap_table_size, leads to OOM

    XMLWordPrintable

Details

    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

          Activity

            People

              elenst Elena Stepanova
              elenst Elena Stepanova
              Votes:
              0 Vote for this issue
              Watchers:
              2 Start watching this issue

              Dates

                Created:
                Updated:

                Git Integration

                  Error rendering 'com.xiplink.jira.git.jira_git_plugin:git-issue-webpanel'. Please contact your Jira administrators.