MySQLやPostgreSQLなど、大規模にメモリを利用する際に有効だとされるHugePagesの利用方法。
kernelでHubePagesが利用できるようにしておく。
kernelの設定ファイル「.config」
CONFIG_HUGETLBFS=y CONFIG_HUGETLB_PAGE=y
HugePagesを確保する。
# Procファイルシステムに書き込む > echo 50 > /proc/sys/vm/nr_hugepages # sysctlを利用する > sysctl -w vm.nr_hugepages=50
設定後、/proc/sys/vm/nr_hugepagesを読みだして値が設定されていれば確保完了。0のままだと確保が失敗している。メモリが断片化していると確保できないようだが、再起動すれば確保できる。
設定を永続化するために、/etc/sysctl.confにエントリを追加することを忘れないようにする。
PostgreSQLの場合、以下の方法で必要な量を見積もることができる。少し多めに設定しておくのが良いようだ。
PostgreSQLの場合は、postgresql.confに以下のエントリを追加する
huge_pages = on
MySQLの場合は設定ファイルに以下のエントリを追加の上、権限設定も行う必要がある。標準ではrootしか利用できないため。PostgreSQLとは起動時の処理が異なるようである。
[mysqld] large-pages
HugePagesを利用するグループを設定
# グループIDが102のグループで利用できるようにする > echo 102 > /proc/sys/vm/hugetlb_shm_group # もしくは > sysctl -w vm.hugetlb_shm_group=102
直接MySQLのグループIDを設定してもよいが、ここではhugepagesグループを作成して、mysqlユーザをそこに追加した。
# グループ追加 > groupadd -g 300 hugepages # mysqlをhugepagesグループに参加 > gpasswd -a hugepages mysql
この場合、上記手順ではグループIDに300を指定する。MySQLのマニュアルには、「ulimit -l unlimited」など、MySQLのリソース制限を解除する手順が書かれているが、特に必要なかった。リソース制限を書けている場合には注意が必要。
最後にDBサーバ、ないしはサーバ全体を再起動する。
再起動後にHugePagesが利用されていればOK。
> grep ^Huge /proc/meminfo HugePages_Total: 1000 HugePages_Free: 975 HugePages_Rsvd: 511 HugePages_Surp: 0 Hugepagesize: 2048 kB
HugePagesのステータス(HugePages_Rsvd)が「0」でなければHugePagesが利用されているはず。