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で操作することをゆるしていません。
この問題を解決するには、
- .postgresユーザにgid=0(root)をあたえる
- .kernelソースに変更を加える
- .必要なケイパビリティをあたえる(推奨、しかし未調査)
- .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));
です。