• 検索結果がありません。

Huge Pages

ドキュメント内 PostgreSQL Internals (1) (ページ 32-35)

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)

ドキュメント内 PostgreSQL Internals (1) (ページ 32-35)