2. プロセスとメモリー
2.2 メモリー構成
2.2.3 Huge Pages
大規模メモリーを搭載した Linux ではメモリー管理負荷を削減するためにHuge Pages を利用することができます。Huge Pagesへの対応はPostgreSQL 9.4の新機能であり、パ ラメーターhuge_pagesにより決定されます。Huge Pagesを使用する場合のページ・サイ ズは 2 MBです(2 × 1,024 × 1,024バイト)。 Huge Pagesを使用する場合、確保さ れる共有メモリーのサイズは計算値を元に2 MB の倍数に調整され、mmapシステムコー
ルにMAP_HUGETLBマクロが指定されます。
□ パラメーター設定
PostgreSQLが使用する共有メモリーとしてHuge Pagesを使用するには、パラメーター
huge_pagesを設定します。
キー = パラメーターport * 1000 + 1
表 18 パラメーターhuge_pagesに指定できる値
パラメーター値 説明 備考
on Huge Pagesを使用する
off Huge Pagesを使用しない
try Huge Pagesの使用を試し、使えれば使う デフォルト値
デフォルト値のtryを指定すると、mmapシステムコールにMAP_HUGETLBマクロを 指定して共有メモリーを作成しようとします。処理に失敗した場合は、共有メモリーを、
MAP_HUGETLBマクロを削除して再作成します。このパラメーターをonに指定すると強
制的にHuge Pagesを使用します。プラットフォームが Huge Pagesをサポートしていな
い場合、pg_ctlコマンドは以下のエラー・メッセージを出力してインスタンスは起動できま
せん。
例 9 エラー・メッセージ
□ Huge Pagesの設定方法
Linux 環境でHuge Pagesを有効にするにはカーネル・パラメーターvm.nr_hugepages
に2 MB単位のページ数の最大値を指定します。このパラメーターのデフォルト値は0で す。使用中のHuge Pagesの情報は、/proc/meminfoファイルを参照します。
例 10 LinuxのHuge Pages設定
FATAL: huge pages not supported on this platform
# sysctl –a | grep nr_hugepages vm.nr_hugepages = 0
vm.nr_hugepages_mempolicy = 0
# sysctl –w vm.nr_hugepages = 1000 vm.nr_hugepages = 1000
# grep ^Huge /proc/meminfo HugePages_Total: 1000 HugePages_Free: 1000 HugePages_Rsvd: 0 HugePages_Surp: 0 Hugepagesize: 2048 kB
#
パラメーターhuge_pages=on を指定した環境でインスタンス起動時に必要なページが確 保できない場合、以下のエラーが発生してインスタンスを起動できません。
例 11 Huge Pagesページ不足エラー
注意
□ Huge Pages として必要なメモリー領域の計算
PostgreSQL インスタンスが使用する共有メモリーの容量はパラメーターの値から計算
されます。パラメーターshared_buffers とパラメーターwal_buffersの容量に10~50 MB 程 度 を 追 加 し ま す 。 こ の 追 加 の メ モ リ ー 量 は 、 パ ラ メ ー タ ーmax_connections、
autovacuum_max_workers、max_worker_processes 等いくつかのパラメーターから計算
されます。カーネル・パラメーターvm.nr_hugepagesには上記の値を2 MB単位に切り上 げて指定します。
正確な共有メモリーの必要量を知るためには、パラメーターlog_min_messages に
DEBUG3を指定してインスタンスを起動します。インスタンス起動ログ(pg_ctl —l で指
定)に以下のメッセージが出力されます。
例 12 共有メモリー必要容量
Red Hat Enterprise Linux 6.4では、ヘッダ・ファイルにMAP_HUGETLBマクロが欠
落しているため、ソースコードからビルドすると Huge Pages 非対応のバイナリが作成 されます。バイナリ作成時に、/usr/include/bits/mman.h内に以下の行があるか確認して ください。
# define MAP_HUGETLB 0x40000 /* Create huge page mapping. */
$ pg_ctl -D data start -w server starting
FATAL: could not map anonymous shared memory: Cannot allocate memory
HINT: This error usually means that PostgreSQL's request for a shared memory segment exceeded available memory, swap space or huge pages. To reduce the request size (currently 148324352 bytes), reduce PostgreSQL's shared memory usage, perhaps by reducing shared_buffers or max_connections.
DEBUG: invoking IpcMemoryCreate(size=148324352)