Updated on 2024-04-19 GMT+08:00

RDS for MySQL Memory Usage Too High

For a DB instance storing mission-critical application data

Scale up your instance by referring to Changing a DB Instance Class.

For a DB instance not storing mission-critical application data

Check the memory usage of the local computer. If the memory usage curve is stable, no action is required.

For a DB instance storing mission-critical application data and configured with a large instance class

  1. During off-peak hours, change the value of performance_schema to OFF. For RDS for MySQL 5.6 and earlier versions, you should reboot the instance for the change to take effect.
  2. View the memory usage of your instance using DBA Assistant. For details, see Viewing Performance Metrics.
    If the memory usage remains high, perform either of the following operations:
    • Scale up the instance class.
    • Change the value of innodb_buffer_pool_size. Table 1 lists the recommended values for different memory specifications. The actual value ranges are displayed on the RDS console.
      Table 1 Recommended values for different memory specifications

      Memory (GB)

      Recommended Value in Version 5.6

      Recommended Value in Version 5.7

      Recommended Value in Version 8.0

      2

      536,870,912 bytes (512 MB)

      536,870,912 bytes (512 MB)

      536,870,912 bytes (512 MB)

      4

      1,073,741,824 bytes (1 GB)

      1,073,741,824 bytes (1 GB)

      1,073,741,824 bytes (1 GB)

      8

      4,294,967,296 bytes (4 GB)

      4,294,967,296 bytes (4 GB)

      5,368,709,120 bytes (5 GB)

      16

      8,589,934,592 bytes (8 GB)

      8,589,934,592 bytes (8 GB)

      9,663,676,416 bytes (9 GB)

      32

      22,548,578,304 bytes (21 GB)

      22,548,578,304 bytes (21 GB)

      21,474,836,480 bytes (20 GB)

      64

      47,244,640,256 bytes (44 GB)

      47,244,640,256 bytes (44 GB)

      47,244,640,256 bytes (44 GB)

      128

      96,636,764,160 bytes (90 GB)

      94,489,280,512 bytes (88 GB)

      94,489,280,512 bytes (88 GB)

      192

      146,028,888,064 bytes (136 GB)

      146,028,888,064 bytes (136 GB)

      146,028,888,064 bytes (136 GB)

      256

      193,273,528,320 bytes (180 GB)

      193,273,528,320 bytes (180 GB)

      193,273,528,320 bytes (180 GB)

      384

      298,500,227,072 bytes (278 GB)

      300,647,710,720 bytes (280 GB)

      300,647,710,720 bytes (280 GB)

      512

      412,316,860,416 bytes (384 GB)

      412,316,860,416 bytes (384 GB)

      412,316,860,416 bytes (384 GB)

      768

      618,475,290,624 bytes (576 GB)

      618,475,290,624 bytes (576 GB)

      618,475,290,624 bytes (576 GB)

      1024

      824,633,720,832 bytes (768 GB)

      824,633,720,832 bytes (768 GB)

      824,633,720,832 bytes (768 GB)

  • Change the value of innodb_buffer_pool_size as needed.
  • MySQL has a dynamic memory balancing mechanism. If the memory usage is less than 90%, no action is required.
  • RDS for MySQL memory is allocated to the engine layer and server layer.
    • The memory allocated to the engine layer includes the InnoDB buffer pool, log buffer, and full text index cache. The InnoDB buffer pool is resident memory and accounts for a large proportion.

      The InnoDB buffer pool is a memory area that holds cached InnoDB data for tables, indexes, and other auxiliary buffers. You can use the innodb_buffer_pool_size parameter to define the buffer pool size.

    • The memory allocated to the server layer is occupied by the thread cache, binlog cache, sort buffer, read buffer, and join buffer. These caches and buffers are usually released when connections are closed.

    Such memory allocation keeps memory usage of a running RDS for MySQL instance at about 80%.