Upgrade to Pro — share decks privately, control downloads, hide ads and more …

HugePageテストonWindows

 HugePageテストonWindows

Windows版PostgreSQLでHugePageが利用可能か検証した結果です。

SatoshiMitsufuji

July 04, 2023
Tweet

Other Decks in Technology

Transcript

  1. © NEC Solution Innovators, Ltd. 2023 HugePage(LargePage)テストon Windows for PostgreSQL

    2023/7/3 第42回 PostgreSQLアンカンファレンス@オンライン NECソリューションイノベータ株式会社 光藤 智
  2. 1. 自己紹介 2. 本発表の背景 3. HugePageについて 4. テスト目的 5. テスト環境

    6. 事前準備 7. HugePageの有効化 8. テスト結果 9. 調査 10.まとめ 目次
  3. © NEC Solution Innovators, Ltd. 2023 3 ◆ 氏名:光藤 智(みつふじ

    さとし) ◆ 会社:NECソリューションイノベータ株式会社 ◆ 経歴:Oracleのポーティング、サポート、技術支援(1994-2023) PostgreSQL、EDB技術支援(2021-2023) 自己紹介
  4. © NEC Solution Innovators, Ltd. 2023 4 ◆ Windows環境にPostgreSQLを導入する案件があり、HugePageが利用可能かどう かを確認しておきたい。

    ◆ ドキュメントを見ながらテストしたところ、HugePageが使われていないように 見えて、調査したら既知のバグでした。 本発表の背景
  5. © NEC Solution Innovators, Ltd. 2023 5 ◆ 仮想メモリで管理されるページは通常4Kbyteですが、大規模な共有メモリを管理 するために、ページのサイズを2MbyteにしたものをHugePage(LargePage)とい

    います。 ◼ HugePageを採用することで、共有メモリを使う時のPTE(ページ・テーブル・エントリ)で使用 するメモリ量を減らすことが出来ます。 ◼ HugePageを採用することで、 CPU上のTLB(トランスレーション・ルックアサイド・バッファ) の利用効率を高めることができ、TLBミスヒットのオーバーヘッドを減らせます。 ◼ PTEはセッション間で共有されないので、 HugePageを採用しない場合、共有メモリが大きく、 セッション数が多いときにPTEとして使用するメモリ量が大きくなります。PTEは仮想メモリ管 理に使う領域なのでメモリ上に常駐する必要があります。 • PTEの容量計算例 –条件:ページサイズ4Kbyte、共有メモリ16Gbyte、セッション数512 –8byte(PTE1エントリのサイズ) * 16Gbyte/4Kbyte(管理するメモリのページ数) * 512(セッション) = 16Gbyte HugePageについて
  6. © NEC Solution Innovators, Ltd. 2023 7 ◆ HW ◼

    プロセッサ Intel(R) Core(TM) i7-10510U CPU @ 1.80GHz 2.30 GHz ◼ 実装 RAM 16.0 GB ◆ OS ◼ エディション Windows 11 Home ◼ バージョン 22H2 ◼ インストール日 2022/10/18 ◼ OS ビルド 22621.819 ◆ PostgreSQL ◼ PostgreSQL14.3 ◼ shared_buffers=4GB ◼ huge_pages=on/off テスト環境(私有PC)
  7. © NEC Solution Innovators, Ltd. 2023 8 ◆ gpedit.mscのインストール ◼

    HugePageを有効にするには、グループポリシーエディター(gpedit.msc)を利用し、「メモリ内 のページのロック」から、PostgresSQLの起動に利用するユーザーを登録する必要があります。 ◼ グループポリシーエディター(gpedit.msc) はWindows10/11のHomeエディションにはデフォル トで入っていないため、Windows10/11の場合はgpedit.mscを追加インストールする必要があ ります。 ※インストール方法はググると色々出てきます 事前準備
  8. © NEC Solution Innovators, Ltd. 2023 9 ◆ HugePageの有効化の方法はPostgreSQLドキュメントのhuge_pagesパラメータ の説明にあります。

    ◆ Windowsキー+Rを押して「ファイル名を指定して実行」を起動し、gpedit.msc と入力してOKを押す。 HugePageの有効化(1/6)
  9. © NEC Solution Innovators, Ltd. 2023 12 ◆ 「名前が見つかりません」というエラーが出るので、「オブジェクトの種類 (O)

    」ボタンを押して「グループ」にチェックを入れ、「OK」を押す。 HugePageの有効化(4/6)
  10. © NEC Solution Innovators, Ltd. 2023 13 ◆ もういちど「ユーザまたはグループの追加(U)」を押して「NETWORK SERVICE」を入力、「名前の確認(C)」ボタンを押す。

    「OK」、「OK」を押す。 HugePageの有効化(5/6) ※NETWORK SERVICEはPostgreSQLのサービス以外で も利用されるためPostgreSQLサービスの起動ユーザ を別に作成したほうが良い。
  11. © NEC Solution Innovators, Ltd. 2023 15 ◆ psqlを500セッションつなぐ ◆

    約1GBのテーブルをSeqScanした後10分sleep テスト方法 --テストデータ作成 drop table test; create table test(col1 integer,col2 char(100)); insert into test (col1,col2) select generate_series(1,10000000),'AAAAAAAAAA; REM テスト用バッチファイル SET PGPASSWORD=postgres for /l %%i in (1,1,500) do ( START /B psql -h localhost -U postgres -p 5432 -f LargePageTest.sql ) pause --テスト用SQL(LargePageText.sql) select count(*) from test; select pg_sleep(600); ¥q
  12. © NEC Solution Innovators, Ltd. 2023 16 ◆ SysInternalsのRAMMapを利用する ◆

    ダウンロードサイト ◼ https://learn.microsoft.com/ja-jp/sysinternals/downloads/rammap ◆ 確認項目 ◼ 「Use Contents」タブの「Page Table」、「Large Page」 HugePageの使用状況確認方法
  13. © NEC Solution Innovators, Ltd. 2023 23 ◆ ¥src¥backend¥port¥win32_shmem.c Large

    Pageに関連するソースコード if (huge_pages == HUGE_PAGES_ON || huge_pages == HUGE_PAGES_TRY) { /* Does the processor support large pages? */ largePageSize = GetLargePageMinimum(); if (largePageSize == 0) { ereport(huge_pages == HUGE_PAGES_ON ? FATAL : DEBUG1, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("the processor does not support large pages"))); ereport(DEBUG1, (errmsg_internal("disabling huge pages"))); } else if (!EnableLockPagesPrivilege(huge_pages == HUGE_PAGES_ON ? FATAL : DEBUG1)) { ereport(DEBUG1, (errmsg_internal("disabling huge pages"))); } else { /* Huge pages available and privilege enabled, so turn on */ flProtect = PAGE_READWRITE | SEC_COMMIT | SEC_LARGE_PAGES; /* Round size up as appropriate. */ if (size % largePageSize != 0) size += largePageSize - (size % largePageSize); } }
  14. © NEC Solution Innovators, Ltd. 2023 24 ◆ MapViewOfFileEx のFILE_MAP_LARGE_PAGESの説明は以下

    ◼ Windows 10 バージョン 1703 以降では、このフラグは、大きなページのサポートを使用してビューをマッ プする必要があることを指定します。 ビューのサイズは 、GetLargePageMinimum 関数によって報告され る大きなページのサイズの倍数である必要があり、ファイル マッピング オブジェクト は SEC_LARGE_PAGES オプションを使用して作成されている必要があります。 lpBaseAddress に null 以外 の値を指定する場合、値は GetLargePageMinimum の倍数である必要があります。 ◼ https://learn.microsoft.com/ja-jp/windows/win32/api/memoryapi/nf-memoryapi-mapviewoffileex ◆ ⇒ MapViewOfFileExをコールしているところで、 FILE_MAP_LARGE_PAGES をセットしていないのはバグじゃないか? ググっているとこんな情報を発見! /* * Get a pointer to the new shared memory segment. Map the whole segment * at once, and let the system decide on the initial address. */ memAddress = MapViewOfFileEx(hmap2, FILE_MAP_WRITE | FILE_MAP_READ, 0, 0, 0, NULL); if (!memAddress) ereport(FATAL, (errmsg("could not create shared memory segment: error code %lu", GetLastError()), errdetail("Failed system call was MapViewOfFileEx."))); 15.3
  15. © NEC Solution Innovators, Ltd. 2023 25 https://www.postgresql.org/message-id/[email protected] BUG #17448:

    In Windows 10, version 1703 and later, huge_pages doesn't work. The following bug has been logged on the website: Bug reference: 17448 Logged by: Okano Naoki Email address: okano(dot)naoki(at)jp(dot)fujitsu(dot)com PostgreSQL version: 14.2 Operating system: Windows Description: With huge_pages = on, the postgres process does not appear to use large pages. I checked with VMMap if the large pages are used in the following environment. Environment PostgreSQL version: 14.2 Operating system : Windows 10 20H2 On this page (*) says that in Windows 10, version 1703 and later OS versions, you must specify the FILE_MAP_LARGE_PAGES flag with the MapViewOfFile function to map large pages. I think it seems to be the cause that MapViewOfFile() in src/backend/port/win32_shmem.c does not specify FILE_MAP_LARGE_PAGES flag. (*) MapViewOfFileEx function https://docs.microsoft.com/en-us/windows/win32/api/memoryapi/nf-memoryapi-mapviewoffileex FILE_MAP_LARGE_PAGES Starting with Windows 10, version 1703, this flag specifies that the view should be mapped using large page support. The size of the view must be a multiple of the size of a large page reported by the GetLargePageMinimum function, and the file-mapping object must have been created using the SEC_LARGE_PAGES option. If you provide a non-null value for lpBaseAddress, then the value must be a multiple of GetLargePageMinimum.
  16. © NEC Solution Innovators, Ltd. 2023 26 ◆ ¥src¥backend¥port¥win32_shmem.c(MapViewOfFileEx部分) PostgreSQL16beta1のソースコード

    desiredAccess = FILE_MAP_WRITE | FILE_MAP_READ; #ifdef FILE_MAP_LARGE_PAGES /* Set large pages if wanted. */ if ((flProtect & SEC_LARGE_PAGES) != 0) desiredAccess |= FILE_MAP_LARGE_PAGES; #endif /* * Get a pointer to the new shared memory segment. Map the whole segment * at once, and let the system decide on the initial address. */ memAddress = MapViewOfFileEx(hmap2, desiredAccess, 0, 0, 0, NULL); if (!memAddress) ereport(FATAL, (errmsg("could not create shared memory segment: error code %lu", GetLastError()), errdetail("Failed system call was MapViewOfFileEx."))); 16beta1 FILE_MAP_LARGE_PAGES が設定されている
  17. © NEC Solution Innovators, Ltd. 2023 29 ◆ Windows環境でHugePageを使いたい場合は、PostgreSQL16(GA)がリリースさ れるまで待ちましょう!

    ◆ 現時点で、shared_buffersが大きくなる場合はLinuxを使いましょう! ◆ OSがWindows Server 2019でも同じ結果でした。 ◆ PostgreSQL16が正式リリースされたらまたテストしてみようと思います。 まとめ