メモリ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にしたほうが効果があったような気がします。