PostgreSQLの巨大なページ

バージョン9.4以降のPostgreSQLでは、ラージページのサポートが導入されました。 これは非常に良いニュースです。仮想化で作業したときに大きなページに出会いました。 簡単に言うと何ですか。 Linuxでは、メモリの操作はサイズが4kBのページへのアクセスに基づいているため(実際はプラットフォームによって異なります。getconfPAGE_SIZEで確認できます)、メモリ量が数十、または数百ギガバイトを超えると、管理が難しくなります。メモリのアドレス指定とページテーブルのメンテナンスのオーバーヘッドが増加しています。 生活を楽にするために、2MBまたは1GBのサイズの大きなページが発明されました。 大きなページを使用することで、メモリを積極的に使用しているアプリケーションの速度を明確に向上させ、応答性を向上させることができます。 既に述べたように、仮想化、特にKVMで作業するときに初めて大きなページに出くわしました。 当時行われたテストでは、仮想マシンのパフォーマンスの向上は7〜10%であることが示されました(このすべては、仮想マシン内のredis / memcache / postgres /などのさまざまなサービスの総合テストによって測定されました)。 現在、PostgreSQLに登場しています。



画像








記事のトピックに戻って、PostgreSQLで大きなページをサポートします。 正直に言うと、私はこれを長い間待っていました。 一般に、以前はlibhugetlbfsを使用して、ラージページをサポートしたPostgreSQLを実行できました。 ただし、現在は組み込みのサポートがあります。 そのため、以下は、ラージページをサポートするPostgreSQLのセットアップと実行のプロセスの説明です。



まず、カーネルがラージページをサポートしていることを確認する必要があります。 CONFIG_HUGETLBFSおよびCONFIG_HUGETLB_PAGEオプションが存在するかどうか、カーネル構成を確認します。

# grep HUGETLB /boot/config-$(uname -r) CONFIG_CGROUP_HUGETLB=y CONFIG_HUGETLBFS=y CONFIG_HUGETLB_PAGE=y
      
      







これらのオプションがない場合、何も機能せず、カーネルを再構築する必要があります(たとえば、Gentooに関連)。

明らかに、PostgreSQLバージョン9.4が必要です。 パッケージのインストールとクラスターの初期化はバックグラウンドで行うため、 分布に応じて、方法は異なります。 すぐにpostgresql.conf構成ファイルに進みます。 huge_pageパラメーターは、3つの値を取ることができるラージページのサポートを担当します。 オフ -ラージページを使用しない、 オン -ラージページを使用する、 試す -ラージページを使用する、そしてアクセスできない場合は通常のページを使用するようにロールバックします。 try値はデフォルトで使用され、安全なオプションです。 onの場合、システムでラージページが定義されていない(または十分な数がない)場合、サービスは開始されません。 開始の場合、次のエラーを受け取る可能性があります。



致命的:匿名共有メモリをマップできませんでした:メモリを割り当てることができません

ヒント:通常、このエラーは、PostgreSQLの共有メモリセグメントに対する要求が、使用可能なメモリ、スワップ領域、または巨大ページを超えたことを意味します。 要求サイズ(現在148324352バイト)を減らすには、おそらくshared_buffersまたはmax_connectionsを減らして、PostgreSQLの共有メモリの使用量を減らします。



したがって、postgresql.confを修正します(私のpostgresql.confはRHELベースのディストリビューションの標準の場所にあります)。



 # vi /var/lib/pgsql/9.4/data/postgresql.conf huge_page = try
      
      







システムの大規模ページのサポートを有効にしました。デフォルトでは、それらは関与していません。 ページの計算は概算です。ここでは、DBMSのニーズに割り当てる準備ができているメモリ量に依存する必要があります。 値は2Mbページで測定されることに注意してください。16GBを割り当てたい場合、8000ページになります。



公式文書では、postmasterプロセス番号に対応する/ proc / PID /ディレクトリにあるステータスファイルのVmPeak値に依存することを推奨しています。 VmPeakは、その名前が示すとおり、仮想メモリ使用量のピーク値です。 このオプションを使用すると、開始する最小バーを決定できますが、私の判断では、この決定方法も本質的にランダムです。



 # head -1 /var/lib/pgsql/9.4/data/postmaster.pid 3076 # grep ^VmPeak /proc/3076/status VmPeak: 4742563 kB # echo $((4742563 / 2048 + 1)) 2316 # echo 'vm.nr_hugepages = 2316' >> /etc/sysctl.d/30-postgresql.conf # sysctl -p --system
      
      







PostgreSQLの起動に進みます。 初期化システムに応じて、開始方法が異なる場合があります、私はトレンディな若者を持っていますsystemd。



 # systemctl start postgresql-9.4.service
      
      







大きなページのリサイクルについては、こちらをご覧ください。



 # grep ^HugePages /proc/meminfo HugePages_Total: 2316 HugePages_Free: 2301 HugePages_Rsvd: 128 HugePages_Surp: 0
      
      







それだけです。特定のワークロードでベンチマークにアクセスできます。 ご清聴ありがとうございました!



All Articles