Benchmarking
============

CNP kubectlプラグインは、Kubernetes用のEDB
Postgresを使用して、KubernetesでPostgreSQL展開をベンチマークする簡単な方法を提供します。

ベンチマークは、2つの側面に焦点を当てています。

- **データベース** 、 `pgbench <https://www.postgresql.org/docs/current/pgbench.html>`_ に依存すること

- **ストレージ** `fio <https://fio.readthedocs.io/en/latest/fio_doc.html>`_ に依存すること

..  IMPORTANT::
   `pgbench` および`fio` は、ステージングまたは実稼働前環境で実行する必要があります。運用環境ではこれらのプラグインを使用しないでください。データベースと、同じ共有環境で実行される他のワークロード/アプリケーションに壊滅的な結果をもたらす可能性があります。

pgbench
^^^^^^^

``kubectl`` CNPプラグインコマンド ``pgbench``
は、既存のPostgresクラスターに対してユーザー定義の\ ``pgbench``
ジョブを実行します。

``--dry-run``
フラグを介して、後の変更/実行のためにジョブのマニフェストを生成できます。

``pgbench`` を使用した一般的なコマンド構造は次のとおりです。

.. code:: shell

   kubectl cnp pgbench \
     -n <namespace> <cluster-name> \
     --job-name <pgbench-job> \
     --db-name <db-name> \
     -- <pgbench options>

..  IMPORTANT::
   `pgbench <https://www.postgresql.org/docs/current/pgbench.html>`_ を参照してください。

ジョブで使用される特定のオプションについては、

この例では、 ``pgbench``
OLTPのような目的で、スケールファクター1000を使用して\ ``cluster-example``
という名前の\ ``Cluster`` の\ ``app``
データベースを初期化する\ ``pgbench-init`` というジョブを作成します。

.. code:: shell

   kubectl cnp pgbench \
     --job-name pgbench-init \
     cluster-example \
     -- --initialize --scale 1000

..  Note::
   これにより、100000000レコードを含むデータベースが生成され、ディスク上に約13GBの領域が必要です。

ジョブの進行状況は次の方法で確認できます。

.. code:: shell

   kubectl logs jobs/pgbench-run

次の例では、単一の接続を使用して、以前に初期化されたデータベースに対して30秒間\ ``pgbench``
を実行する\ ``pgbench-run`` というジョブを作成します。

.. code:: shell

   kubectl cnp pgbench \
     --job-name pgbench-run \
     cluster-example \
     -- --time 30 --client 1 --jobs 1

次の例では、 ``--db-name`` フラグと\ ``pgbench``
名前空間を使用して、既存のデータベースに対して\ ``pgbench``
を実行します。

.. code:: shell

   kubectl cnp pgbench \
     --db-name pgbench \
     --job-name pgbench-job \
     cluster-example \
     -- --time 30 --client 1 --jobs 1

デフォルトでは、ジョブに有効期限はありません。 ``--ttl``
フラグを使用して自動削除を有効にできます。ジョブは指定された期間秒単位で削除されます。

.. code:: shell

   kubectl cnp pgbench \
     --job-name pgbench-run \
     --ttl 600 \
     cluster-example \
     -- --time 30 --client 1 --jobs 1

特定のワーカーノードで\ ``pgbench`` ジョブを実行する場合は、
``--node-selector`` オプションを使用できます。 ``workload=pgbench``
ラベルを持つノードで以前の初期化ジョブを実行する場合、次のことを実行できます。

.. code:: shell

   kubectl cnp pgbench \
     --db-name pgbench \
     --job-name pgbench-init \
     --node-selector workload=pgbench \
     cluster-example \
     -- --initialize --scale 1000

ジョブステータスは、次のコマンドを実行して取得できます。

::

   kubectl get job/pgbench-job -n <namespace>

   NAME       COMPLETIONS   DURATION   AGE
   job-name   1/1           15s        41s

ジョブが完了すると、次のことを実行して結果を収集できます。

::

   kubectl logs job/pgbench-job -n <namespace>

fio
^^^

kubectl CNPプラグインコマンド ``fio``
は、デフォルト値と読み取り操作を使用してfioジョブを実行します。
``--dry-run``
フラグを介して、後の変更/実行のためにジョブのマニフェストを生成できます。

..  Note::
   kubectlプラグインコマンド`fio` は、ConfigMapを使用して事前定義されたfioジョブ値を使用してデプロイメントを作成します。カスタムジョブ値を提供する場合は、 `--dry-run` フラグを使用してマニフェストを生成し、生成されたConfigMapでカスタムジョブ値を提供することをお勧めします。

デフォルトの使用例

.. code:: shell

   kubectl cnp fio <fio-name>

カスタム値を使用した例

.. code:: shell

   kubectl cnp fio <fio-name> \
     -n <namespace>  \
     --storageClass <name> \
     --pvcSize <size>

``fio`` 名前空間の\ ``standard`` および\ ``pvcSize: 2Gi``
という名前の\ ``StorageClass`` に対して\ ``fio``
コマンドを実行する方法の例

.. code:: shell

   kubectl cnp fio fio-job \
     -n fio  \
     --storageClass standard \
     --pvcSize 2Gi

展開ステータスは、次のコマンドを実行して取得できます。

.. code:: shell

   kubectl get deployment/fio-job -n fio

   NAME          READY   UP-TO-DATE   AVAILABLE   AGE
   fio-job        1/1     1            1           14s

kubectlプラグインコマンド\ ``fio`` を実行した後。

それは次のことを行います。

1. PVCを作成する

2. fioジョブの構成を表すConfigMapを作成する

3. 単一のポッドで構成されるfio展開を作成し、PVCでfioを実行し、ベンチマークの完了後にグラフを作成し、ウェブサーバーで生成されたファイルの提供を開始します。そのためには、
   `fio-tools <https://github.com/wallnerryan/fio-tools`>`_ イメージを使用します。

デプロイメントによって作成されたポッドは、結果の提供を開始すると準備が整います。デプロイメントによって作成されるポッドのポートを転送できます

::

   kubectl port-forward -n <namespace> deployment/<fio-name> 8000

次に、ブラウザを使用して\ ``http://localhost:8000/``
に接続してデータを取得します。

PostgreSQLワークロードをエミュレートするために、デフォルトの8kブロックサイズが選択されました。使用可能なIOPSの量を制限するディスクは、このパラメーターを変更すると、非常に異なるスループット値を示す場合があります。

以下は、専用のKubernetesノードにマウントされたローカルディスクへのシークエンシャル書き込みの図の例1時間ベンチマーク。

.. figure:: /images/write_bw.1-2Draw.png
   :width: 70% 
   :alt: Sequential writes bandwidth

   Sequential writes bandwidth

すべてのテストが完了したら、fio展開とリソースを次の方法で削除できます。

.. code:: shell

   kubectl cnp fio <fio-job-name> --dry-run | kubectl delete -f -

fio展開の作成に使用したものと同じ名前を使用して、必要に応じて名前空間を追加します。
