メモリ1Gの Amazon Linux 2023 を稼働させていたのですが、いつもほとんどメモリが残っていない状況でした。以下がそのときのfreeコマンドです。
$ free -m
availableが46Mしかありません。psコマンドを見てみたらMySQLがかなりのメモリを使っていることがわかりました。
$ ps aux
全メモリの半分近く(49.8%)をMySQLが使用していました。MySQLのバージョンは 8.4.0 です。データベースとしては数テーブルを使っているだけなので、MySQLの使用メモリ量を抑えたい。
とりあえず、MySQLの innodb_buffer_pool_size と innodb_log_file_size をそれぞれ確認してみました。
mysql> SELECT @@GLOBAL.INNODB_BUFFER_POOL_SIZE/1024/1024 as メモリサイズ(単位:MB);
mysql> SELECT @@GLOBAL.INNODB_LOG_FILE_SIZE/1024/1024 as ログファイルサイズ(単位:MB);
それほど大きくはなさそうです。他をネットで調べてみたところ table_definition_cache というものを下げれば良いらしいです。
mysql> show variables like 'table_definition_cache';
今の設定は2000になっていました。これを最小値の400にします。MySQLの設定ファイルである /etc/my.cnf を編集します。my.cnf ファイルに以下の1行を追記します。
table_definition_cache=400
MySQLを再起動させます。
# systemctl restart mysqld
table_definition_cache が変更されいてるか確認します。
400に変更されていました。空きメモリをfreeコマンドで確認すると空きができていました。ただMySQLは使用しているうちに使用メモリが増えていくようなので、肌感覚では多少は空いた程度の気がします。
もう少し使用メモリを下げられないか調べていると performance_schema というものをOFFにすれば良いらしいことがわかりました。現状はデフォルトでONのようです。
mysql> show variables like 'performance_schema';
performance_schema をONにしているとDBのパフォーマンスに関する統計情報を収集できるようですが、レコード数がそれほど多くない現状では不要と判断してOFFにすることにしました。my.cnf ファイルに以下の1行も追記します。
performance_schema=0
MySQLを再起動させて performance_schema の値を確認します。
performance_schema がOFFになりました。
table_definition_cache と performance_schema の値を変更してからしばらくMySQLを稼働させます。freeコマンドで確認するとメモリは以下で落ち着いてきているようです。
availableが234Mまで増えています。
psコマンドでもMySQLの使用メモリも確認しました。
全メモリの1/4(25.3%)まで下がりました。
感覚的には table_definition_cache を下げるより performance_schema をOFFにしたほうが効果があったような気がします。
[ 2025/08/30追記 ]
performance_schema をOFFにすることは効果がありました。その後、他を調べたりして、cnf ファイルに以下の設定をすることにしました。
[mysqld]
innodb_buffer_pool_size = 64M
innodb_log_buffer_size = 8M
innodb_buffer_pool_instances = 1
max_connections = 20
sort_buffer_size = 256K
join_buffer_size = 256K
read_buffer_size = 128K
read_rnd_buffer_size = 256K
thread_stack = 192K
tmp_table_size = 8M
max_heap_table_size = 8M
table_definition_cache=400
performance_schema=OFF
この設定で、さらにメモリが50〜60M程度、解放されました。