PostgreSQL のメニーコア時代に向けた機能(後編)

PostgreSQL のメニーコア時代に向けた機能(後編)

OSS×クラウド最新TOPICS 2013年12月17日 09:51

PostgreSQL のメニーコア時代に向けた機能(後編)

NTTデータの笠原です。本稿では、メニーコア時代に向けたPostgreSQLの既存機能や新機能の開発状況についてご紹介します。本稿は「PostgreSQLのメニーコア時代に向けた機能」の後編となっています。
 前ブログでは、今のPostgreSQLで実施可能なメニーコアの有効利用について簡単に紹介しました。本稿ではパラレルクエリというキーワードをもとに開発中の新機能について紹介していきます。
 
パラレルクエリとPostgreSQL
 新機能の話の前に、少しパラレルクエリについて説明します。パラレルクエリは、1つのSQLを複数のプロセス(あるいはワーカーやスレッドとも呼称する)で分担して実行する機能です。商用DBMSの多くにはこの機能が搭載されています。パラレルクエリは特に大規模データに対する処理実施に効果的です。例えば、通常のSQL処理で多数のテーブルから読み込み集計する場合でも、実行するのが1プロセスでは、「データ読みこみ」->「演算」->「データ読み込み」->「演算」という流れとなり処理が直列化します。特にデータ読み込み時はCPUが暇になっているため無駄です。これを複数プロセスで並列に行い、「データ読み込み(並列)」-> 「演算(並列)」とすることで、処理時間の短縮を図ることができます。さらにこれらSQL内部のデータ読み込みや演算処理を非同期的/非順序的に実行することで、処理待ちとなるような無駄時間を極力減らすアーキテクチャのDBMSも出てきています。このパラレルクエリは、I/Oの高速化とメニーコア化が進む昨今では特に効果が大きい機能です。
 さて、DBMSがパラレルクエリを実施するにあたり、必要となる機能はいろいろあります。誤解を恐れずにざっくり言うと以下になるかと思います。

並列化時に性能上最適な粒度になるよう処理を分解する機能
分解した処理を効率よくスケジューリングする機能
実際に処理を行うプロセスやスレッドを制御する機能
並列処理間のコミュニケーション領域をつくる機能
並列処理結果をまとめる(結果のマージや集計する)機能

 上記のうち、現在開発中のPostgreSQL9.4に取り込まれた機能は3と4に該当します。では、それらの機能について簡単に紹介していきます。
 
Dynamic Background Worker
 これは、ユーザ定義のプロセスを動的に作動させることができる機能です。PostgreSQLはプロセスアーキテクチャを採っており、ユーザからSQLを受け付けたり、DBMSの裏方の処理をしたりするのは各プロセスとなります。もともとPostgreSQLでは定められたプロセスしか実行されませんでしたが、PostgreSQL9.3からはBackground Workerという機能が付与され、ユーザが定義した処理を行うプロセスを作動させることができます。これにより、例えば定期的なジョブなどをPostgreSQLのプロセスとして動かすことができます。しかし、このプロセスはPostgreSQLの起動時にのみ生成され、予め定められた処理をする機能です。これをPostgreSQLの稼働中に、動的に生成するように改良したのがDynamic Background Workerです。この機能により、アドホックに任意の数、(ある程度)任意の処理をこなすプロセスを起こせるようになります。パラレルクエリにおける実行プロセスの制御にうってつけというわけです。(図)
 
 
Dynamic Shared Memory
 前述のとおり、PostgreSQLはプロセスアーキテクチャを採っているため、プロセス間のコミュニケーションや共通して使用するデータ格納領域として、基本的に共有メモリを利用します。従来のPostgreSQLでは、共有メモリはPostgreSQLの起動時に定められた領域を確保(実際には利用時に確保)していました。この静的な共有メモリを使うこともできますが、現行のPostgreSQLでは起動時に共有メモリのサイズを指定しなければなりません。そのため、予めパラレル処理で使うサイズを見積もっておく必要があり、サイジングが難しいでしょう。また内部で頻繁にパラレル用の領域の確保とリリースが行われることが予想されますし、セキュリティ上の分離性なども考えると、メモリ制御機能が複雑化します。これらの課題を解決するため、特定の処理用に動的に共有メモリを作成する機能が取り込まれました。動的共有メモリ領域は、生成時に自由にサイズを指定可能で、特定のプロセス間でのみデータを共有することができ、使い終わればその領域を一括で破棄します。パラレルクエリで、分散した処理結果の格納や受け渡し、各プロセス間の状態を互いに確認するにはとても有用な機能なのです。(図)
 
 
パラレルへの道のり
 さて、パラレルクエリ実現に向けて実装された新機能を見てみました。これらの機能はまだ発展途中です。いくつかの便利なインターフェイスの追加や、この仕組みをもっと使いやすくするための機能が提案されています。
 冒頭で述べたようにまだまだパラレルクエリを行うには機能が不足しています。PostgreSQLがメニーコアを有効に使い、複雑なSQLを効率よく実行するには多くの課題が残っています。しかし、今回紹介した新機能は、クエリをパラレル化するだけでなく、現状1プロセスで実施している処理のパラレル化にも有用な機能です。例えば、インデックス作成やデータコピー、一部の大規模データの単一ソートやファイル読み込みなどの比較的単純な処理は、近い将来にパラレル化が実現できるのではないかと思います。すぐさまパラレルクエリとはいかないかもしれませんが、着実にメニーコアを有効活用できる準備が整っていくでしょう。
 
セミナー紹介
 近日開催予定の以下のセミナーでは、PostgreSQLとフラッシュストレージを組み合わせた性能特性についてご紹介します。また、弊社で提供するオールインワンソリューション GresCube についてもご紹介いたします。ぜひ、PostgreSQLの導入をご検討の方はご参加ください。セミナー詳細と申し込みは以下のリンクからどうぞ。
http://www.event-reg.jp/dell/sem_131212/
 

OSSNEWSに広告を掲載しませんか?

最新TOPICS

【講演資料を公開】12/11【システム運用の効率化と、Zabbixによるクラウド・コンテナや、IoTの監視 ~そしてZabbix最新バージョン4.4の解説と、Zabbix5.0への道】(01月10日 09:15)

2019/12/11(水)13:30~電気ビル共創館3F カンファレンスCにて 【システム運用の効率化と、Zabbixによるクラウド・コンテナや、IoTの監視 ~そしてZabbix最新バージョン4.4の解説と、Zabbix5.0への道~】 と題したセミナーが開催されました。 当日は、寒空のなか掲題にご興味をお持ちの58名もの方々にご来場頂くことができました。ありがとうございます。 ...

関連オープンソース

  • PostgreSQLサイド(PostgreSQL)@SRAOSS
  • OSSNEWSに広告を掲載しませんか?

facebook

twitter