ユーザ用ツール

サイト用ツール


linux:hugepages

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が利用されているはず。

linux/hugepages.txt · 最終更新: 2017/02/22 13:05 by Wiki Editor