目次


EnterpriseDB Postgres Advanced Server のための IBM Power Systems ソリューション

Linux を稼働する IBM POWER8 プロセッサー・ベースのサーバー上での PostgreSQL および EnterpriseDB Postgres Advanced Server に関する記事: IBM Power サーバーのインストールおよびチューニングのベスト・プラクティス

Comments

はじめに

この記事は主に、新しい IBM POWER8 プロセッサー・テクノロジーを使用した IBM Power Systems サーバー上で動作する PostgreSQL および EnterpriseDB Postgres Advanced Server の使用、構成、最適化を焦点としています。

注: オペレーティング・システムには Red Hat Enterprise Linux (RHEL) 7.2 を使用しました。この記事の目的は、オープンソースの PostgreSQL データベースを構築してセットアップするにはどのようするのか、そしてEnterpriseDB Postgres Advanced Server を有効利用するために Power にインストールして構成するにはどのようにするのかについて説明することです。Linux を稼働する IBM Power Systems 上の EnterpriseDB Postgres Advanced Server は、オープンソースのデータベースである PostgreSQL をベースに構築されており、さまざまな大量トランザクションおよび集約的レポート作成のワークロードを処理することができます。

一般的な推奨

一般的には、ルートおよびデータ・システムを別個の物理ディスクまたは RAID (Redundant Array of Independent Disks) 上に置くことが推奨されますが、異なるストレージ・テクノロジーの間でのパフォーマンスの差による影響を排除するために、データベースは tmpfs 仮想ファイル・システム上のメモリーに維持することにしました。

Linux を稼働する IBM Power Systems 上の EnterpriseDB Postgres Advanced Server

EnterpriseDB (EDB) Postgres Advanced Server は、最も先進的なオープンソース・データベースの 1 つとして数えられる PostgreSQL をベースに、以下の分野での機能性と性能を追加して構築された製品です。

  • パフォーマンス
  • 互換性
  • セキュリティー
  • ツール

EDB Postgres Advanced Server は Oracle との互換性を備えているため、低コストでハイパフォーマンスの PostgreSQL ベースのプラットフォーム上で、既存の Oracle ベースのアプリケーションを実行できます。さらに、Oracle ライセンスを追加で購入することなく、ミッション・クリティカルなデータベースとシームレスに統合するアプリケーションを隣接させて実行することもできます。

EDB Postgres Advanced Server をインストールする際は必ず、以下の EDB Web サイトから入手できる最新のサービス・パックと一緒にインストールしてください。
https://www.enterprisedb.com/downloads/postgres-postgresql-downloads

前提条件

ソフトウェア前提条件については、EDB マニュアルを参照してください。

  • /tmp および / (ルート) ファイル・システムに十分なページング・スペースと空き容量があることを確認します。
  • ulimit –a コマンドを使用して、製品ごとのシステム・リソース制限の設定を確認します。
  • EnterpriseDB チューニング・ガイドとベスト・プラクティス・ガイドを参照します。
  • EDB Postgres Advanced Server のセットアップには Java が必要です。以下の URL にアクセスして、IBM developerWorks Web サイトから Java SE バージョンをダウンロードし、Java をインストールしてください。
    https://www.ibm.com/developerworks/java/jdk/linux/download.html

PostgreSQL および EnterpriseDB Postgres Advanced Server のセットアップ

EDB Postgres Advanced Server をインストールするには、rpm コマンド・ラインまたは yum インストーラーのいずれかを使用できます。yum ツールを使用してインストールを実行することをお勧めします。

まず始めに、RHEL の yum リポジトリーが定義されている場所を確認する必要があります。また、EDB の yum リポジトリーを定義して、ワンステップで簡単にインストールできるようにすることもできます。ベース OS およびソフトウェア・インストール・パッケージの yum リポジトリーを定義しておくと、ソフトウェアのインストール時に自動的に rpm パッケージ (前提条件) を取り込むことができます。

yum リポジトリーを構成する

ベース OS に yum リポジトリーが定義されるようにしてください。RHEL の yum リポジトリーは、CD/DVD メディア、共有ネットワーク・ロケーション、または RHEL インストール・メディアが格納されているローカル・ディレクトリーを指すことによって定義できます。テスト・チームはローカル・ディレクトリーを使用して RHEL の yum リポジトリーを定義しました。yum 構成ファイルは /etc/yum.repos.d/ ディレクトリーにあります。

yum リポジトリーについての詳細は、以下のリンク先のページで調べることができます。
https://access.redhat.com/documentation/ja-JP/Red_Hat_Enterprise_Linux/7/html/System_Administrators_Guide/sec-Configuring_Yum_and_Yum_Repositories.html

EnterpriseDB Postgres Advanced Server をインストールする

EDB Postgres Advanced Server のインストールについての詳細は、以下のリンク先のページで調べることができます。
https://www.enterprisedb.com/products-services-training/products/documentation/enterpriseedition

インストールを開始する前に、以下のリンク先の記事を参照してください。
https://www.ibm.com/developerworks/linux/library/l-edb-getstart-trs/

Linux on Power に EDB Postgres Advanced Server をインストールするには、EDB によって指定されている yum リポジトリーの定義を使用します。yum リポジトリーがシステム内に定義された後は、単純なインストール・コマンドを使用して EDB Postgres Advanced Server をインストールできます。このコマンドの例は以下のとおりです。
yum install ppas95-server

このコマンドは、すべての前提条件をインストールします。さらに、データベース管理者ユーザーがまだ存在していない場合は、enterprisedb も作成します。

DB インスタンスを作成して構成する前に、チューニングを適用しておくことをお勧めします。この演習では、テスト・チームがカーネルのチューニングを含む各種のシステム・チューングを行いました。

PostgreSQL Server をビルドしてインストールする

IBM POWER8 の機能と最適化されたビルドを最大限に利用するために、最新バージョンの IBM Advance Toolchain for PowerLinux を使用することをお勧めします。Advance Toolchain をダウンロードするには、AT Downloader というツールを使用できます。AT Downloader は、サポートされているディストリビューションの最新バージョンの Advance Toolchain パッケージをダウンロードするスクリプトです。
ftp://ftp.unicamp.br/pub/linuxpatch/toolchain/at/at_downloader/

Advance Toolchain パッケージがダウンロードされたら、そのパッケージを手作業でインストールします。

インストール・パスが、AT に付属の gcc コンパイラーを含めるように設定されていることを確認します。このコンパイラーは通常、/opt/atX/bin にあります。ここで、X は Advance Toolchain のバージョンです。

Postgres のソースと関連資料はすべて、www.postgresql.org に揃っています。このサイトからソース・コードをダウンロードして、中身を抽出します。

  • ソース・コードを構成し、CFLAGS、CPPFLAGS、および LDFLAGS のオプションを「-Wl,-q -mcpu=power8 -mtune=power8 -O3 -m64」として追加します。例:
    ./configure CFLAGS='-Wl,-q -mcpu=power8 -mtune=power8 -O3 -m64' CPPFLAGS='-Wl, -q -mcpu=power8 -mtune=power8 -O3 -m64' LDFLAGS='-Wl,-q -mcpu=power8 -mtune=power8 -O3 -m64'
  • 構成プロセスの必要に応じて、ベース OS メディアから追加の依存関係パッケージをインストールしなければならない場合もあります。
  • ビルド・プロセス時には、必ず make all を指定してください。pgbench やその他の追加パッケージは、contrib フォルダー内にあります。

Power Systems の構成

この演習で使用した設定は以下のとおりです。

  • 単一パーティション・モデル (非仮想化論理パーティション (LPAR)) を設定して、システム全体を単一のパーティションに割り当て、すべてのコアを専用で使用できるようにしました。この LPAR を作成するには、ハードウェア管理コンソール (HMC) にアクセスする必要があります。この LPAR が、システム上で唯一の LPAR になります。
  • POWER8 プロセッサー・ベース・システムの以下の省電力設定項目を無効にしました。
    • 「Idle Power Saver (アイドル状態での省電力)」項目をオフにしました。
    • 「Dynamic Power Saver (動的省電力)」モードを「enabled, favor performance (有効、電力優先)」に設定しました。

以上の設定変更は、ASMI (Advanced System Management Interface) からのみ行うことができます。ASMI には、HMC を使用してアクセスできます。または、管理システムの IP を使用してブラウザーから直接アクセスするという方法もあります。

注: IBM PowerVM 以外のファイアウォール (例えば OPAL など) が設定されていると、ASMI の設定項目を使用できない場合があります。その場合は、Linux コマンド・ラインから、governor オプションを performance モードに設定した cpupower ユーティリティーを使用してプロセッサー・モードを設定してください。この設定は、システム上のすべてのコアに適用する必要があります。

例:cpupower frequency-set --governor performance

詳細については、以下のリンク先のページを参照してください。
https://access.redhat.com/documentation/ja-JP/Red_Hat_Enterprise_Linux/7/html/Power_Management_Guide/cpufreq_governors.html

HMC から特定のシステムの ASMI を起動します。以下に示すスクリーン・キャプチャーは単に参考用です。

図 1. HMC から ASMI にアクセスする

「Idle Power Saver (アイドル状態での省電力)」設定項目をオフにするには、ASMI にログインして「System Configuration (システム構成)」 -> 「Power Management (電源管理)」 -> 「Idle Power Saver (アイドル状態での省電力)」の順にクリックします。

図 2. ASMI: 「Idle Power Saver (アイドル状態での省電力)」ページ

動的省電力モードを有効にするには、以下の手順に従います。

  1. 左側ペインにある「Power Mode Setup (電源モードの設定)」をクリックし、右側ペインにある「Enable Dynamic Power Saver (favor performance) mode (動的省電力 (電力優先) モードを有効にする)」項目を選択します。
  2. 「Continue (続行)」をクリックします。
図 3. ASMI: 「Power Mode Setup (電源モードの設定)」ページ

以上のように設定すると、プロセッサーの速度を上げるのに役立ちます。プロセッサー速度が向上しているかどうかは、シェルで ppc64_cpu –freq コマンドを使用して確認できます。この操作の後に、システムをシャットダウンしたり再起動したりする必要はありません。変更は直ちに適用されます。

注: これらの設定項目の場所は、ファイアウォールの今後の更新やリリースで変わる可能性があります。その場合は、単に別の場所を調べて、必要な構成を見つけてください。

注: 図 1 から 3 に示した ASMI の設定項目は、IBM PowerVM 以外のファイアウォール (例えば OPAL など) が設定されていると使用できない場合があります。その場合は、Linux コマンド・ラインから、governor オプションを performance mode に設定した cpupower ユーティリティーを使用してプロセッサー・モードを設定してください。この設定は、システム上のすべてのコアに適用する必要があります。

例: cpupower frequency-set --governor performance

詳細については、以下のリンク先のページを参照してください。
https://access.redhat.com/documentation/ja-JP/Red_Hat_Enterprise_Linux/7/html/Power_Management_Guide/cpufreq_governors.html

カーネルおよび OS のチューニング

内部テストの際に、以下のカーネル・パラメーターを使用して望ましい結果が示されました。これらのパラメーターの設定は、root ユーザーとして適用されます。パラメーターを設定する際は、システムのハードウェア仕様とオペレーティング・システムの実装に従って慎重に値を設定してください。

  • fs.file-max
  • vm.dirty_background_bytes
  • vm.dirty_ratio
  • vm.dirty_background_ratio
  • vm.hugetlb_shm_group
  • vm.dirty_bytes
  • vm.swappiness
  • vm.hugepages_treat_as_movable
  • vm.zone_reclaim_mode
  • vm.drop_caches
  • kernel.sched_migration_cost
  • kernel.sched_autogroup_enabled
  • kernel.numa_balancing
  • vm.zone_reclaim_mode

以下の設定はシステムのメモリー・サイズに応じて設定して調整する必要があります。

  • shmall
    shmall=$((grep MemTotal /proc/meminfo |awk '{print $2}'` * 1024 * 9 / (`getconf PAGE_SIZE` * 10)))
    sysctl -w kernel.shmall=$shmall
  • shmmax
    shmmax=$((grep MemTotal /proc/meminfo |awk '{print $2}'` * 1024 * 8 / 10 ))
    sysctl -w kernel.shmmax=$shmmax

OS に関する以下の変更を適用してください。これらのチューニングの変更は、pgbench テストの際に有効性が明らかになったものです。

  • 以下のコマンドを使用して、プロセッサーの同時マルチスレッディング (SMT) のスヌーズ遅延の値を大きくします (この変更は IBM POWER7 ハードウェアおよび IBM POWER7+ にのみ適用してください。POWER8 ハードウェアには必要のない変更です)。
    ppc64_cpu --smt-snooze-delay=16777215

    デフォルト値は 100 です。このパラメーターは、スリープ状態に入る時間を遅延するためにチューニングできます。

  • 以下のコマンドを使用して I/O プリエンプトをオフにします。
    mount -t debugfs debugfs /sys/kernel/debug
    echo NO_WAKEUP_PREEMPT > /sys/kernel/debug/sched_features

    プリエンプト・スケジューラーは、優先順位の高い処理が必要に応じてプロセッサー時間を使用できるようにするためのものです。したがって、同様の優先順位の処理が多数ある場合は、この入れ替えによって複数のプロセスがプロセッサー時間を使用できます。場合によっては、以下の設定も役立つことがありました。

    LATENCY=$(cat /proc/sys/kernel/sched_latency_ns)
    echo $((LATENCY/2)) > /proc/sys/kernel/sched_min_granularity_ns
  • Linux システム上で以下のコマンドを実行して、ハードウェア・データ・プリフェッチを無効にします (通常は、ostgresql パフォーマンスが向上します)。
    ppc64_cpu -dscr=1
  • デフォルト値に戻すには、以下のコマンドを実行します。
    ppc64_cpu -dscr=0

PostgreSQL (オープンソース)

任意: Power サーバー上で大容量ページを使用することを予定している場合は、以下の手順に従うことを考慮してください。

  • PostgreSQL ソース・コード (sysv_shmem.c) 内では、大容量ページのサイズが 2 MB (Intel のサイズ) にハードコーディングされています。IBM Power Architecture で使用する大容量ページのサイズは 16 MB であるため、サイズを変更する必要があります。
    1. Postgresql ソース・ディレクトリー内で、以下のコマンドを実行します。
      cd postgresql
    2. 以下のファイル内で、大容量ページのサイズを手作業で 16 MB に変更します。
      src/backend/port/sysv_shmem.c:360

以下のカーネル値を使用して、大容量ページ・プールを 32 GB (16 MB * 2000) に設定します (このサイズは、postgresql.org の構成に応じて調整する必要があります)。
vm.nr_hugepages=2000
vm.nr_overcommit_hugepages=512

postgresql.conf を変更して、Postgres が大容量ページを使用するようにします。

huge_page = try #it will use huge pages if exists
または
huge_page=on #it will force to use huge pages

EDB Postgres Advanced Server

EDB Postgres Advanced Server には以下の変更を適用します。これらのチューニングの変更は、pgbench テストの際に有効性が明らかになったものです。

  • /etc/security/limits.conf に、EDB ユーザー (または、該当する場合は Postgres ユーザー) に対する以下のエントリーを追加します。
    enterprisedb soft memlock 68719476736
    enterprisedb hard memlock 68719476736

    これにより、メモリーにロックするアドレス空間の最大量が制限されます。

  • 任意: EDB Postgres Advanced Server で大容量ページを使用可能にする場合は、EDB ユーザー・シェル・プロファイルに以下の行を追加します。
    HUGETLB_SHM=yes
    LD_PRELOAD='/usr/lib64/libhugetlbfs.so'
    export HUGETLB_SHM
    export LD_PRELOAD

    EDB Postgres Advanced Server が大容量ページの使用に関してエラーを出した場合は、root として以下のコマンドを実行するとエラーを解消できます。
    hugeadm --pool-pages-min DEFAULT:16M

    : Power 用の EDB 内で実際に大容量ページが 2MB ではなく 16 MB に設定されているかどうかを確認する必要があります。前の「PostgreSQL (オープンソース)」のセクションを参照してください。

データベース・ファイル・システムをメモリーに固定する

この演習で使用したファイル・システムの名前は tmpfs です。テスト・ラボ内では、EDB または PostgreSQL 用に 20 GB のメモリーを割り当てました。pgbench のスケーリング・ファクターを 1000 に設定した場合、実行中に使用された合計容量は 15 GB から 19 GB までの範囲でした。

以下のコマンドを実行して tmfs ファイル・システムを作成します。
mkdir -p /media/tmp
mount -t tmpfs -o size=20G tmpfs /media/tmp

注: システムをリブートすると、このファイル・システムとその情報が削除されます。必要に応じてバックアップを作成してください。

また、サービスやプロセスのうち、この実行に必要のないものやシステムにとって重要でないものは停止するか、無効にする必要があります。例えば、IPV6 を使用していない場合は、これを無効にできます。さらに、メール・サーバーなども停止できます。

EnterpriseDB/PostgreSQL データベースのセットアップ

このセクションでは、データベース・クラスター・インスタンスをどのようにして初期化するのか、DB クラスター・パラメーターにチューニングをどのようにして適用するのか、およびデータベースをどのようにして作成するのかを説明します。

始めに、enterprise/postgres ユーザーとしてログインし、パスにサーバー・ユーティリティーのバイナリーが定義されていることを確認します。以下のデフォルト・インストール先でバイナリー・ファイルを見つけてください。

EnterpriseDB - /usr/ppas-X/bin。ここで、X はリリース・バージョン番号です。
PostgreSQL - /usr/local/pgsql/bin

a. DB クラスター・インスタンスを初期化する

DB クラスター・インスタンスを作成するには、initdb ユーティリティーを使用します。このコマンドには DB ファイルの場所を指定する必要があります。ここでは、データベース・インスタンス・フォルダーとして、前のステップで作成した tmpfs ファイルを使用します。

initdb -D /media/tmp/data

上記のコマンドにより、データベース・リポジトリーと postgresql.conf というデータベース・パラメーター・ファイルが作成されます。

b. DB サーバー・パラメーターにチューニングを適用する

postgresql.conf ファイル内でデフォルト DB クラスター・パラメーターを見つけます。この演習では以下のパラメーターを、選択したワークロード (pgbench) に応じた推奨値に変更しました。実行するワークロードによって、パラメーターは異なる場合があります。

  • shared_buffers = 20 GB (このパラメーターは、LPAR に割り当てられたメモリーに応じて調整してください。ただし、値は LPAR メモリーの 4 分の 1 未満にすることをお勧めします。
  • maintenance_work_mem = 512 MB
  • checkpoint_completion_target = 0.9
  • effective_cache_size = 64 GB
  • work_mem = 512 MB
  • wal_buffers = 16 MB
  • checkpoint_segments = 300
  • synchronous_commit = off
  • edb_dynatune および edb_dynatune_profiles をコメント化して Dynatune を無効にします。

注: 一部のパラメーターのチューニングは、製品の今後のリリースで無効になる可能性があります。また、EDB Postgres Advanced Server にのみ有効なチューニングもあります。パラメーターが失敗した場合、またはエラーが表示された場合は、そのパラメーターをコメント化してください。一般に、このセクションに記載したリストに挙げられている定義済みパラメーターのうち、見つからないものがあれば、そのパラメーターは省くことをお勧めします。

c. DB クラスターを起動して DB を作成する

DB クラスターを起動するには、サーバー・バイナリーに付属している pg_ctl ユーティリティーを使用します。–l オプションを使用して、出力をファイルにリダイレクトします。

  • pg_ctl -D /media/tmp/data -l logfile start
    edb-postgres -D /media/tmp/data コマンドを使用して起動することもできます。
  • データベースを作成するには、createdb コマンド・ライン・ユーティリティーを使用します。以下の例では、データベース名として pgbench が使用されています。
    createdb pgbench

PostgreSQL および EnterpriseDB Postgres Advanced Server データベースのベンチマーキング

このセクションでは、ワークロードを初期化した後にデータベースに対して実行したベンチマーク・テストについて説明します。

実行のたびに DB を再初期化する必要はありませんが、再初期化すると DB が更新されるため、再初期化することを推奨します。

pgbench ベンチマーキング・ツール

pgbench は、EDB Postgres Advanced Server や PostgreSQL に対してベンチマーク・テストを実行するための単純なユーティリティーです。このユーティリティーについての詳細は、以下のリンク先のページを参照してください。
https://www.postgresql.jp/document/9.2/html/pgbench.html

pgbench では、さまざまな読み取り専用モード (select only クエリー) と読み取り/書き込みモード (select、update、および insert クエリー) を使用できるようになっています。この演習では、pgbench の select only モードを使用しました。このユーティリティーは、PostgreSQL または EDB Postgres Advanced Server と同じシステム上で実行できます。また、ネットワーク上の別個のコンピューター上で実行することも可能です。

データベースを初期化する

まず、データベースを初期化する必要があります。pgbench ユーティリティーを呼び出すには、-I オプションを使用し、スケーリング・ファクターを指定します。テスト・チームがこの演習で使用したスケーリング・ファクターは 1000 です。
pgbench -i -s 1000 pgbench

初期化では DB にデータを取り込むため、完了するまでに時間がかかります。スケーリング・ファクターを 1000 に設定すると、通常は約 16 GB のメモリーが消費されます。

ベンチマーキング・ツールを実行する

ツールの実行期間を指定するには、パラメーターとして -T を渡します。-S により、select only ロードが有効になります。-c でクライアント数を指定し、-j でワーカー・スレッド数を指定します。このテストは、クライアント数とスレッド数をさまざまに変えて実行できます。このテストの場合、クライアントとスレッドは同じコア上に存在します。pgbench ツールの実行時間は 5 分間 (300 秒) です。安定した結果を得るためには、pgbench を 5 分以上実行することをお勧めします。
pgbench -n -S -c 64 -j 64 pgbench -T 300

実行の終了時に、このユーティリティーは接続数を含めた結果と除いた結果の両方を、1 秒あたりのトランザクション数 (TPS) として表示します。

図 4. pgbench ツールの出力例

ダウンロード可能なリソース


関連トピック


コメント

コメントを登録するにはサインインあるいは登録してください。

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Linux
ArticleID=1041016
ArticleTitle=EnterpriseDB Postgres Advanced Server のための IBM Power Systems ソリューション
publish-date=01052017