HugePagesの利用
MySQLやPostgreSQLなど、大規模にメモリを利用する際に有効だとされるHugePagesの利用方法。
kernel設定
kernelでHubePagesが利用できるようにしておく。
kernelの設定ファイル「.config」
CONFIG_HUGETLBFS=y CONFIG_HUGETLB_PAGE=y
HugePagesの確保
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」のlog_min_messagesパラメータを「DEBUG3」に変更する。
- HugePagesを無効にして(後述)PostgreSQLを再起動する
- ログファイル(dataディレクトリのpostmaster.logなど)の「invoking IpcMemoryCreate」の値を確認する
- sizeの単位はバイト。これをHugePageのサイズである2048[キロ]バイト(=2MB)で除して、大まかなHugePagesの必要量を求める
DBサーバ側の設定
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が利用されているはず。