sql >> データベース >  >> RDS >> PostgreSQL

PostgreSQL拡張機能であるpgFincore1.2

    pgFincore 1.2は、オペレーティングシステムのデータページキャッシュを監査および操作するためのPostgreSQL拡張機能です。拡張機能にはすでに7年間の使用の歴史があり、生産ニーズに対応する進化があります。

    PostgreSQL9.6と互換性のある最新バージョン1.2をここからダウンロードしてください。

    データキャッシュ

    データページのキャッシュは、データ管理のいくつかのレベルで「自然に」行われる操作です。オブジェクトは単純です。ディスクに物理的に記録されたデータとユーザーへの復元の間に多数のレイヤーが重ねられています。現在、ほぼすべてのデータレイヤーには、読み取りおよび書き込みコマンドをより高速に提供するための抽象化があります。したがって、ハードドライブの大部分は、物理的な書き込みを遅らせる書き込みキャッシュと、将来の要求を予測してデータをより迅速に提供できる読み取りキャッシュを提供します。同等のシステムがSAN、RAIDカード、オペレーティングシステム、ソフトウェアなどに存在します。

    もちろん、PostgreSQLには、書き込みと読み取りのための独自の管理システム、共有バッファがあります。 、pg_buffercache拡張機能で監査できます。

    システムツールとpgFincoreを使用して、オペレーティングシステムのキャッシュを監査することができます。 これをPostgreSQLに移植します。

    先読み

    ほとんどのオペレーティングシステムは、先読みウィンドウを提供することでデータパスを最適化します。これにより、データをキャッシュして、アプリケーションにより迅速に提供します。 PostgreSQLには、システムレベルでこの動作を優先するためのいくつかの最適化が含まれており、effective_io_concurrencyオプションで同様の機能を備えています。

    これらの最適化を容易にする1つの解決策は、POSIX_FADVISEシステムコールを使用することです。 再びpgFincore このソリューションをPostgreSQLに移植します。

    pgFincore 1.2

    したがって、この拡張機能により、次のことが可能になります。

    • POSIXをサポートするシステム(Linux、BSDなど)のキャッシュ内のテーブルまたはインデックス(およびPostgreSQLで使用されるその他のファイル)の占有に関する正確な情報を取得するため。
    • このキャッシュを操作するには:マップを作成し、後でまたは別のサーバーに復元します。
    • posix_fadvise呼び出しを介してパスを最適化します。

    pgFincoreを入手

    ディストリビューションで利用可能なDebianおよびRedHatパッケージ、およびAptPGDGおよびRPMPGDGリポジトリ上のPostgreSQLの各バージョン。

    そして、pgfincoregitリポジトリのソース。

    助けが必要ですか?

    コミュニティサポートに加えて、2ndQuadrantに連絡することもできます。

    使用例

    セットアップ

    $ sudo apt-get install postgresql-9.6-pgfincore
    $ psql -c 'CREATE EXTENSION pgfincore;'

    システム情報

    # select * from pgsysconf_pretty();
     os_page_size | os_pages_free | os_total_pages 
    --------------+---------------+----------------
     4096 bytes   | 314 MB        | 16 GB

    ランダムウォークを最適化する(先読みウィンドウを縮小する)

    # select * from pgfadvise_random('pgbench_accounts_pkey');
              relpath | os_page_size | rel_os_pages | os_pages_free 
    ------------------+--------------+--------------+---------------
     base/16385/24980 | 4096         | 2            | 1853808

    シーケンシャルトラバーサルを最適化する(先読みウィンドウを大きくする)

    # select * from pgfadvise_sequential('pgbench_accounts');
     relpath          | os_page_size | rel_os_pages | os_pages_free 
    ------------------+--------------+--------------+---------------
     base/16385/25676 | 4096         | 3176         | 1829288

    キャッシュ監査

    # select * from pgfincore('pgbench_accounts');
          relpath       | segment | os_page_size | rel_os_pages | pages_mem | group_mem | os_pages_free | databit 
    --------------------+---------+--------------+--------------+-----------+-----------+---------------+---------
     base/11874/16447   |       0 |         4096 |       262144 |         3 |         1 |        408444 | 
     base/11874/16447.1 |       1 |         4096 |        65726 |         0 |         0 |        408444 | 
    

    テーブルをメモリにロードする

    # select * from pgfadvise_willneed('pgbench_accounts');
          relpath       | os_page_size | rel_os_pages | os_pages_free 
    --------------------+--------------+--------------+---------------
     base/11874/16447   |         4096 |       262144 |         80650
     base/11874/16447.1 |         4096 |        65726 |         80650

    テーブルのキャッシュをクリアする

    # select * from pgfadvise_dontneed('pgbench_accounts');
          relpath       | os_page_size | rel_os_pages | os_pages_free
    --------------------+--------------+--------------+---------------
     base/11874/16447   |         4096 |       262144 |        342071
     base/11874/16447.1 |         4096 |        65726 |        408103

    キャッシュされたページを復元する

    ここでは、メモリからロードおよびアンロードするページを表すビット文字列タイプのパラメータを使用します。

    # select * 
      from pgfadvise_loader('pgbench_accounts', 0, true, true, 
                           B'101001'); -- Varbit décrivant les pages à manipuler
         relpath      | os_page_size | os_pages_free | pages_loaded | pages_unloaded 
    ------------------+--------------+---------------+--------------+----------------
     base/11874/16447 |         4096 |        408376 |            3 |              3

    注:デモの場合、上記で処理されるデータページは6つだけで、1つはページをロードし、0つはページをアンロードします。


    1. MariaDBでのSHOWCOLLATIONの仕組み

    2. PostgreSQL-データベースの名前を変更

    3. MySQLのCHAR_LENGTH()とは何ですか?

    4. MySQLで同等のDATALENGTH()とは何ですか?