HugetlbをPostgreSQLでつかうためのテキスト

# このテキストは、PostgreSQLにおいて、
# Hugetlbをもちいた共有メモリの使用法について説明するものです
# (2004/11/26)

1 Linuxに関する留意点 (kernel2.6)
1.1 HUGETLBに関するコンフィグ
カーネルコンパイル時に HUGETLBが使用できるようにコンフィグ設定してください。

CONFIG_HUFETLB_PAGE
CONFIG_HUGETLBFS

の2つです。
デフォルトではfalseになっているので気をつけてください。

1.2 Hugetlbを一般ユーザでつかうために
Hugetlbを共有メモリで使用するためには、スーパーユーザである必要があります。
しかし、PostgreSQLではrootで操作することをゆるしていません。

この問題を解決するには、

  1. .postgresユーザにgid=0(root)をあたえる
  2. .kernelソースに変更を加える
  3. .必要なケイパビリティをあたえる(推奨、しかし未調査)
  4. .PostgreSQLを書き換える :-)

1.は usermod -g root postgres でできます。たぶん。
があります。2を使用する場合、ソースの fs/hugetlbfs/inode.cの

if(!capable(CAP_IPC_LOCK))
return ERP_PTR(-EPERM);

という部分をコメントアウトしてください。
またkernelのバージョンによって記述がちがうことがあるかもしれませんが、
CAP_IPC_LOCKに関する部分をコメントアウトしてみてください。
たぶん
//if (!can_do_hugetlb_shm())
// return ERR_PTR(-EPERM);
です。
2 PostgreSQLのソースの変更
PostgreSQLのソースに変更を加えます。大きく2箇所です。
2.1 共有メモリ確保部分の変更
src/backend/port/sysv_shmem.c において、shmget()のためのフラグを

#define SHM_HUGETLB 04000 // flag for hugetlb

として定義します。

そして、InternalIpcMemoryCreate()内のshmget部を

shmid = shmget(memKey, size,IPC_CREAT | IPC_EXCL | IPCProtection | SHM_HUGETLB );

というふうに書き換えます。shmget()のflag部にSHM_HUGETLBを追加しただけです。

2.2 確保サイズ計算部の変更
デフォルトでは8KBの倍数になるように共有メモリを確保します。
これをHugetlbがあつかうページサイズにします。(IA-32なら4MB?)
src/backend/storage/ipc/ipci.cにおいて、

size += 8192 - (size % 8192);

の8192部分を環境のページサイズに変更します。
4MBなら、

size += 4*1024*1024 - (size % (4*1024*1024));

です。