(19)【発行国】日本国特許庁(JP)
(12)【公報種別】公開特許公報(A)
(11)【公開番号】P2024165412
(43)【公開日】2024-11-28
(54)【発明の名称】ストレージシステム
(51)【国際特許分類】
G06F 3/06 20060101AFI20241121BHJP
G06F 13/10 20060101ALI20241121BHJP
【FI】
G06F3/06 301W
G06F3/06 301X
G06F3/06 301N
G06F13/10 340A
【審査請求】未請求
【請求項の数】14
【出願形態】OL
(21)【出願番号】P 2023081593
(22)【出願日】2023-05-17
(71)【出願人】
【識別番号】524132520
【氏名又は名称】日立ヴァンタラ株式会社
(74)【代理人】
【識別番号】110001678
【氏名又は名称】藤央弁理士法人
(72)【発明者】
【氏名】水島 永雅
(57)【要約】
【課題】ストレージシステムの応答性能の悪化を抑制する。
【解決手段】複数ストレージノードの各ストレージノードは、外部からの命令を処理するプロセッサと、データを格納するドライブと、他のストレージノードにデータを送信、または前記他のストレージノードからデータを受信する通信器とを含む。通信器は、データを送信する前に可逆圧縮する圧縮回路と、圧縮されたデータを受信後に伸張する伸張回路とを含む。指定サイズのデータを外部に読み出すための読み出し命令に応じて、第1ストレージノードの通信器は、所定の条件が満たされる場合、第1ストレージノードのドライブに格納されたデータを圧縮回路で圧縮して、第2ストレージノードの通信器へ送信する。第2ストレージノードの通信器は、受信したデータを伸張回路で伸張する。第2ストレージノードは、伸張したデータを外部に出力する。
【選択図】
図8
【特許請求の範囲】
【請求項1】
複数ストレージノードを含むストレージシステムであって、
前記複数ストレージノードの各ストレージノードは、
外部からの命令を処理するプロセッサと、
データを格納するドライブと、
他のストレージノードにデータを送信、または前記他のストレージノードからデータを受信する通信器と、を含み、
前記通信器は、データを送信する前に可逆圧縮する圧縮回路と、圧縮されたデータを受信後に伸張する伸張回路と、を含み、
指定サイズのデータを外部に読み出すための読み出し命令に応じて、第1ストレージノードの前記通信器は、所定の条件が満たされる場合、前記第1ストレージノードの前記ドライブに格納されたデータを前記圧縮回路で圧縮して、第2ストレージノードの前記通信器へ送信し、
前記第2ストレージノードの前記通信器は、受信した前記データを前記伸張回路で伸張し、
前記第2ストレージノードは、伸張した前記データを外部に出力する、ストレージシステム。
【請求項2】
請求項1に記載のストレージシステムであって、
前記条件は、前記読み出し命令で指定された前記サイズが閾値以上であることを含む、ストレージシステム。
【請求項3】
請求項1に記載のストレージシステムであって、
前記条件は、前記読み出し命令が指示する前記データが、圧縮されていない状態で前記ドライブに格納されていることを含む、ストレージシステム。
【請求項4】
請求項1に記載のストレージシステムであって、
前記条件は、前記第2ストレージノードの前記プロセッサの稼働率が閾値を上回っていることを含む、ストレージシステム。
【請求項5】
請求項1に記載のストレージシステムであって、
前記条件は、前記第1ストレージノードの前記通信器から前記第2ストレージノードの前記通信器へのデータの送信出力速度から、前記読み出し命令の前記第2ストレージノードの前記プロセッサによる処理性能を引いた差分が、閾値を下回っていることを含む、ストレージシステム。
【請求項6】
複数のストレージノードを含むストレージシステムであって、
前記複数のストレージノードの各ストレージノードは、
外部からの命令を処理するプロセッサと、
データを格納するドライブと、
キャッシュメモリと、
他のストレージノードにデータを送信、または前記他のストレージノードからデータを受信する通信器と、を含み、
前記通信器は、データを送信前に可逆圧縮する圧縮回路と、圧縮されたデータを受信後に伸張する伸張回路とを含み、
指定サイズの受領データを外部から書き込むための書き込み命令に応じて、第1ストレージノードの前記通信器は、所定の条件が満たされる場合、前記第1ストレージノードの前記キャッシュメモリのデータを前記圧縮回路で圧縮して、第2ストレージノードの前記通信器へ送信し、
前記第2ストレージノードの前記通信器は、受信した前記データを前記伸張回路で伸張し、前記第2ストレージノードは伸張した前記データを前記第2ストレージノードの前記キャッシュメモリに格納する、ストレージシステム。
【請求項7】
請求項6に記載のストレージシステムであって、
前記条件は、前記書き込み命令で指定した前記サイズが閾値以上であることを含む、ストレージシステム。
【請求項8】
請求項6に記載のストレージシステムであって、
前記条件は、前記キャッシュメモリのデータが、前記受領データから算出したRAIDパリティではないことを含む、ストレージシステム。
【請求項9】
請求項6に記載のストレージシステムであって、
前記条件は、前記第1ストレージノードの前記プロセッサの稼働率が閾値を上回っていることを含む、ストレージシステム。
【請求項10】
請求項6に記載のストレージシステムであって、
前記条件は、前記第1ストレージノードの前記通信器から前記第2ストレージノードへのデータの送信出力速度から、前記書き込み命令の前記第1ストレージノードの前記プロセッサによる処理性能を引いた差分が、閾値を下回っていることを含む、ストレージシステム。
【請求項11】
複数のストレージノードを含むストレージシステムであって、
前記複数のストレージノードの各ストレージノードは、
キャッシュメモリと、
他のストレージノードにデータを送信、または前記他のストレージノードからデータを受信する通信器と、を含み、
前記通信器は、データを送信前に可逆圧縮する圧縮回路と、圧縮されたデータを受信後に伸張する伸張回路とを含み、
第1ストレージノードの前記通信器は、前記通信器から前記キャッシュメモリへのライトパケットの最大ペイロードサイズを分割単位として、データを複数の部分データに分割し、前記部分データを前記圧縮回路により圧縮したものをペイロードとするパケットを、第2ストレージノードの前記通信器に送信し、
前記パケットを受信した前記第2ストレージノードの前記通信器は、前記伸張回路により受信した前記パケットのペイロードを伸張し、伸張した前記ペイロードを含むライトパケットを構成して前記第2ストレージノードの前記キャッシュメモリへ転送する、ストレージシステム。
【請求項12】
請求項11に記載のストレージシステムであって、
前記圧縮回路による圧縮アルゴリズムは辞書圧縮であって、前記辞書圧縮で参照する辞書の範囲は、前記圧縮回路が圧縮した複数の前記部分データを含む、ストレージシステム。
【請求項13】
請求項11に記載のストレージシステムであって、
前記通信器は、複数の圧縮回路及び複数の伸長回路を含み、
前記第1ストレージノードの前記通信器は、前記第2ストレージノードの前記通信器に送信するパケットに使用した圧縮回路の識別子を付加し、
前記第2ストレージノードの前記通信器は、前記識別子を含む複数パケットに対して前記複数の伸長回路における一つの共通伸張回路を選択する、ストレージシステム。
【請求項14】
請求項11に記載のストレージシステムであって、
前記第1ストレージノードの前記通信器は、前記第2ストレージノードの前記通信器に送信するパケットに、前記ペイロードが圧縮状態である旨を示すフラグを付加し、
前記第2ストレージノードの通信器は、前記フラグに応じて前記ペイロードを前記伸張回路で伸張するかを判定する、ストレージシステム。
【発明の詳細な説明】
【技術分野】
【0001】
本発明は、ストレージシステムに関する。
【背景技術】
【0002】
大量のデータを蓄積・管理するための情報機器であるストレージシステムでは、より多くのデータを格納する必要が生じた場合に、データ容量の拡張を容易に実現できることが好ましい。そこで、複数のストレージノードを相互接続できる構成にして、接続するストレージノードの数を後から必要な数だけ増やせるように設計されたストレージシステムがある。これをマルチノード接続構成ストレージシステムと呼ぶ。
【0003】
そのようなストレージシステムでは各ストレージノードに、データの読み書きを指示するホストが接続されている。ここで、ホストからのリードコマンドによってデータの読み出しを行う時に、そのデータがそのホストが接続していないストレージノード内に格納されている場合はストレージノード間でデータ転送を行う必要がある。また、ホストからライトコマンドによってデータの書き込みを行う時に、そのホストが接続しているストレージノードの故障に備えてその他のストレージノードにバックアップするためのデータ転送を行う必要がある。
【0004】
マルチノード接続構成ストレージシステムでは、ストレージノード間の通信帯域が十分大きくなければ、ホストがデータを読み書きする性能はその帯域がボトルネックになる。そこで、ストレージノード間の通信帯域を拡げることが望ましい。その実現手段には2つあり、1つはストレージノード間の通信を行う通信デバイスの搭載数を増やすこと、もう1つはストレージノード間の通信データを圧縮して量を減らすことである。
【0005】
前者の手段のデメリットは、通信デバイスの搭載によってシステムの原価コストが増えるという点である。後者の手段のデメリットは、圧縮・伸張する処理の分だけコマンド処理にかかる時間が増えて応答性能が悪化するという点である。圧縮・伸張する処理にかかる時間を小さくできるならば、後者の手段を選択するほうが低コストで望ましい。
【0006】
ストレージノード間の接続方式の例として、イーサネットやPCIexpressといった接続方式がある。そこでの通信手段としては、データを複数に分割し、それらをIPパケットやTLP(Transaction Layer Packet)のペイロードに埋め込んで送受信する方法がある。
【0007】
従来技術として、非特許文献1は、イーサネット上のIPパケットの伝送量を削減するためにペイロードデータを圧縮する際のプロトコルを規定したものである。この技術は以下の特徴を持つ:辞書圧縮アルゴリズムにより各ペイロードを単独で圧縮する。圧縮を適用する条件は「圧縮によってペイロードサイズが増えない場合」のみを規定する。ペイロードサイズの決め方は規定しない。
【先行技術文献】
【非特許文献】
【0008】
【非特許文献1】RFC-3173(IP Payload Compression Protocol)
【発明の概要】
【発明が解決しようとする課題】
【0009】
非特許文献1をはじめとする通信データ圧縮に関する従来技術では、ストレージシステムにおけるストレージノード間の通信データを圧縮して量を減らす際に、圧縮・伸張処理にかかる時間を小さくしてストレージシステムの応答性能の悪化を抑制する方法は開示されていない。
【課題を解決するための手段】
【0010】
本発明の一態様は、複数ストレージノードを含むストレージシステムであって、前記複数ストレージノードの各ストレージノードは、外部からの命令を処理するプロセッサと、データを格納するドライブと、他のストレージノードにデータを送信、または前記他のストレージノードからデータを受信する通信器と、を含み、前記通信器は、データを送信する前に可逆圧縮する圧縮回路と、圧縮されたデータを受信後に伸張する伸張回路と、を含み、指定サイズのデータを外部に読み出すための読み出し命令に応じて、第1ストレージノードの前記通信器は、所定の条件が満たされる場合、前記第1ストレージノードの前記ドライブに格納されたデータを前記圧縮回路で圧縮して、第2ストレージノードの前記通信器へ送信し、前記第2ストレージノードの前記通信器は、受信した前記データを前記伸張回路で伸張し、前記第2ストレージノードは、伸張した前記データを外部に出力する。
【0011】
本発明の一態様は、複数のストレージノードを含むストレージシステムであって、前記複数のストレージノードの各ストレージノードは、外部からの命令を処理するプロセッサと、データを格納するドライブと、キャッシュメモリと、他のストレージノードにデータを送信、または前記他のストレージノードからデータを受信する通信器と、を含み、前記通信器は、データを送信前に可逆圧縮する圧縮回路と、圧縮されたデータを受信後に伸張する伸張回路とを含み、指定サイズの受領データを外部から書き込むための書き込み命令に応じて、第1ストレージノードの前記通信器は、所定の条件が満たされる場合、前記第1ストレージノードの前記キャッシュメモリのデータを前記圧縮回路で圧縮して、第2ストレージノードの前記通信器へ送信し、前記第2ストレージノードの前記通信器は、受信した前記データを前記伸張回路で伸張し、前記第2ストレージノードは伸張した前記データを前記第2ストレージノードの前記キャッシュメモリに格納する。
【0012】
本発明の一態様は、複数のストレージノードを含むストレージシステムであって、前記複数のストレージノードの各ストレージノードは、キャッシュメモリと、他のストレージノードにデータを送信、または前記他のストレージノードからデータを受信する通信器と、を含み、前記通信器は、データを送信前に可逆圧縮する圧縮回路と、圧縮されたデータを受信後に伸張する伸張回路とを含み、第1ストレージノードの前記通信器は、前記通信器から前記キャッシュメモリへのライトパケットの最大ペイロードサイズを分割単位として、データを複数の部分データに分割し、前記部分データを前記圧縮回路により圧縮したものをペイロードとするパケットを、第2ストレージノードの前記通信器に送信し、前記パケットを受信した前記第2ストレージノードの前記通信器は、前記伸張回路により受信した前記パケットのペイロードを伸張し、伸張した前記ペイロードを含むライトパケットを構成して前記第2ストレージノードの前記キャッシュメモリへ転送する。
【発明の効果】
【0013】
本発明の一態様によれば、ストレージノード間の通信データの圧縮機能を有するストレージシステムにおいて、応答性能の悪化を抑制できる。
【図面の簡単な説明】
【0014】
【
図1】本発明を適用したストレージシステムの構成を示す。
【
図3】非圧縮状態で格納されたデータのリードコマンドのフローチャートを示す。
【
図4】非圧縮状態で格納するデータのライトコマンドのフローチャートの前半を示す。
【
図5】非圧縮状態で格納するデータのライトコマンドのフローチャートの後半を示す。
【
図6】圧縮状態で格納されたデータのリードコマンドのフローチャートを示す。
【
図7B】CPU稼働率に対するリード性能の変化を示す。
【
図8】ノード間転送の圧縮条件を判定するフローチャートを示す。
【
図9A】ノード間通信器による圧縮・伸張のデータフローを示す。
【
図11】ノード間通信器が送受信するパケットの構成を示す。
【
図12】圧縮回路が行う処理のフローチャートを示す。
【
図13】ノード間通信器が受信パケットに行う処理のフローチャートを示す。
【
図14】第2の実施形態におけるノード間通信器からの送信出力速度の変化を示す。
【発明を実施するための形態】
【0015】
以下、図面を用いて実施例を説明する。なお、実施例は本発明を実現するための一例に過ぎず、本発明の技術的範囲を限定するものではなく、また実施例の中で説明されている特徴の組み合わせの全てが発明の解決手段に必須であるとは限らない。
【0016】
以下の説明では、「xxxテーブル」の表現にて各種情報を説明することがあるが、各種情報は、テーブル以外のデータ構造で表現されていてもよい。データ構造に依存しないことを示すために「xxxテーブル」を「xxx情報」と呼ぶことができる。また、以下の説明では、要素の識別情報として番号が使用されるが、他種の識別情報(例えば名前、識別子)が使用されてよい。
【0017】
また、以下の説明では、同種の要素を区別しないで説明する場合には、参照符号における共通符号(又は参照符号)を使用し、同種の要素を区別して説明する場合は、参照符号(又は要素のID)を使用することがある。
【0018】
プログラムは、ストレージコントローラに含まれるプロセッサ(例えばCPU(Central Processing Unit))によって実行されることで、定められた処理を、適宜に記憶資源(例えば主記憶)及び/又は通信インタフェース装置を用いながら行うため、処理の主語がストレージコントローラ或いはプロセッサとされてもよい。また、ストレージコントローラは、処理の一部又は全部を行うハードウェア回路を含んでもよい。コンピュータプログラムは、プログラムソースからインストールされてもよい。プログラムソースは、例えば、プログラム配布サーバ、又は、コンピュータ読取可能な記憶メディアであってもよい。
【0019】
(1)システム構成
本明細書の実施形態として、マルチノード接続構成のストレージシステムを説明する。
図1は、マルチノード接続構成のストレージシステム100の内部構成を示す。本システムは複数のストレージノード101A、101Bがハブ装置110を介して互いにデータ通信可能なように接続されており、ストレージノード101A、101Bには、リード/ライトコマンドによってストレージシステム100に格納するデータの読み書きを要求するホスト108A、108Bがそれぞれ接続されている。
【0020】
なお、ストレージノードの個数は
図1に示した2個に限定されるものではなく、2以上であればより。例えば個数が4の場合、ハブ装置110には4個のストレージノードが接続され、そのうち任意の2個の間でデータ通信が可能となる。ストレージノード間の通信装置は、ハブ装置110に限定されず、ハブ装置110に追加して又は代えて、他の通信装置が使用されてもよい。
【0021】
以下に説明する実施形態において各ストレージノードの内部構成は同じであり、以下ではその構成要素の詳細を番号末尾のAやBを略して説明する。
【0022】
ストレージノード101は、ホストI/F(Interface)102、プロセッサであるCPU103、ノード間通信器104、データ記憶媒体105、キャッシュメモリ106、格納データ圧縮伸張器107を含む。
【0023】
ホストI/F102は、ホスト108と接続するためのインタフェース機構であり、データをホストに送信したり、データをホストから受信したりするために、ホストからのリード/ライトコマンドに応答する。ホストI/F102の機構およびコマンドやデータの送受信のプロトコルは、標準的なインタフェース規格、例えばFibreChannel規格に準拠する。
【0024】
データ記憶媒体105は、例えばHDD(Hard Disk Drive)、不揮発性半導体メモリであるNAND型フラッシュメモリを搭載したSSD(SolidState Drive)であり、大きな容量を持ち、ホストから受信したデータを永続的に格納する。データ記憶媒体105は、記憶ドライブ又は単にドライブとも呼ぶ。
【0025】
キャッシュメモリ106は、例えばDRAM(Dynamic RandomAccessMemory)などの揮発性メモリを媒体とし、ホスト108から受信したデータ又はデータ記憶媒体105から読み出したデータを一時的に保持する。
【0026】
格納データ圧縮伸張器107は、データ記憶媒体105に格納するデータ量を削減するため、ライトコマンドに応じて受信したライトデータを可逆的に圧縮し、圧縮データを生成する。また、リードコマンドに応じて元の平文データをホスト108に送信するため、データ記憶媒体105から読み出した圧縮データを伸張して平文データを生成する。格納データ圧縮伸張器107による圧縮をデータ記憶媒体105への格納データに適用するか否かは、ストレージノード101の初期設定により変更可能である。
【0027】
CPU103は、ホストI/F102、ノード間通信器104、データ記憶媒体105、キャッシュメモリ106、格納データ圧縮伸張器107と接続され、それらを制御する複数のマイクロプロセッサを含む。CPU103は、ノード間通信器104やデータ記憶媒体105と、キャッシュメモリ106との間のデータ転送を実行する。
【0028】
そのデータ転送のプロトコルは、標準的なインタフェース規格、例えばPCIexpress規格に準拠する。この場合、CPU103はRootComplex(親)として機能し、ノード間通信器104やデータ記憶媒体105はEndPoint(子)として機能する。PCIexpress規格では転送するデータを所定サイズに分割し、パケットと呼ばれる転送様式のペイロード部分に埋め込んで転送する。CPU103がサポートする最大のペイロードサイズは、例えば512バイトである。
【0029】
CPU103は、ホスト108からのリード/ライトコマンドの内容を解釈する。また、格納データ圧縮伸張器107によるデータ圧縮・伸張の指示を行う。さらに、ノード間通信器104やデータ記憶媒体105と、キャッシュメモリ106との間のデータ転送の指示を行う。
【0030】
各ストレージノード101において、ホスト108からのライトデータは、まずキャッシュメモリ106に一時的に格納される。そのデータを非圧縮状態でデータ記憶媒体105に格納するように初期設定されている場合、データはそのままデータ記憶媒体105にライトされる。一方、そのデータを圧縮状態でデータ記憶媒体105に格納するように初期設定されている場合、格納データ圧縮伸張器107を通じて圧縮データへと変換され、圧縮データはキャッシュメモリ106に一時的に格納される。そして圧縮データはデータ記憶媒体105にライトされる。
【0031】
各ストレージノードにおいて、ホスト108へのリードデータは、データ記憶媒体105から非圧縮状態または圧縮状態でリードされ、まずキャッシュメモリ106に一時的に格納される。非圧縮状態である場合、データはそのままホスト108に送信される。一方、圧縮状態である場合、格納データ圧縮伸張器107を通じて平文データへと変換され、平文データはキャッシュメモリ106に一時的に格納される。そして平文データはホスト108に送信される。
【0032】
ノード間通信器104は、ホスト108からのリード/ライトコマンドに応じた処理を行う中で、ストレージノード間でデータ転送する必要がある場合に用いられる。例えば、ホスト108Aが、自身の接続されているストレージノード101A以外のストレージノード101B内のデータ記憶媒体105Bに格納されているデータのリードを、ストレージノード101Aに要求する。当該データは、ストレージノード101Bからホスト108Aの接続されているストレージノード101Aに転送される。その他の場合も含め、詳細については後述する。
【0033】
ノード間通信器104によるストレージノード間のデータ転送のプロトコルは、標準的なインタフェース規格、例えばPCIexpress規格に準拠する。この場合、ハブ装置110はRootComplex(親)として機能し、ノード間通信器104はEndPoint(子)として機能する。
(2)ノード間通信器
【0034】
ノード間通信器104の内部構成について説明する。
図2は、ノード間通信器104の内部構成を示す。ノード間通信器104は、CPU103と接続するPCIexpress準拠インタフェース(以下PCIeI/F)201、ハブ装置110と接続するPCIe I/F202を備える。例えば、ストレージノード101Aから101Bへデータ転送を行う場合、ノード間通信器104AはPCIe I/F201を通じてCPU103Aからデータを入力し、PCIe I/F202からハブ装置110を介してノード間通信器104Bにデータを送出する。そして、ノード間通信器104BはPCIeI/F202を通じてデータを受領し、PCIe I/F201からCPU103Bにデータを出力する。
【0035】
ノード間通信器104は、PCIe I/F201とPCIe I/F202との間で転送データを中継するための4種類のバッファ210、213、220、223を備える。送信入力バッファ210はデータをCPU103から受信するためのバッファメモリである。送信出力バッファ213は他のストレージノードへ送信するデータを待機させるためのバッファメモリである。受信入力バッファ220は他のストレージノードから受信したデータを保持するためのバッファメモリである。受信出力バッファ223はCPU103へ送信するデータを待機させるためのバッファメモリである。
【0036】
ノード間通信器104は、送信入力バッファ210から送信出力バッファ213にデータを転送する際に、CPU103の指示によりデータを無加工で転送することも、可逆圧縮して転送することもできる。後者の可逆圧縮のために圧縮回路212が複数備えられている。可逆圧縮して転送する場合には複数の圧縮回路212が並列的に圧縮処理を実行する。圧縮用バッファ211は圧縮回路212毎に備えられたバッファメモリである。
【0037】
転送データは所定サイズに分割されて各圧縮回路212に振り分けられる。圧縮用バッファ211はそれら分割データを一時的に保持する。圧縮回路212から得られた複数の圧縮結果は送信出力バッファ213に転送されて再びまとめられる。一方、無加工で転送する場合には、データは圧縮用バッファ211や圧縮回路212を経由せずに送信出力バッファ213に転送される。
【0038】
ノード間通信器104は、受信入力バッファ220から受信出力バッファ223にデータを転送する際に、データが送信元のノード間通信器104で圧縮された状態か否かに応じてそのデータを無加工で転送することも、伸張して転送することもできる。後者の伸張のために伸張回路222が複数備えられている。伸張して転送する場合には複数の伸張回路222が並列的に伸張処理を実行する。伸張用バッファ221は伸張回路222毎に備えられたバッファメモリである。
【0039】
転送データは分割されて各伸張回路222に振り分けられる。伸張用バッファ221はそれら分割データを一時的に保持する。伸張回路222から得られた複数の伸張結果はいずれも可逆圧縮前に分割した際の所定サイズとなっており、受信出力バッファ223に転送されて再びまとめられて可逆圧縮前のサイズに戻る。一方、無加工で転送する場合には、データは伸張用バッファ221や伸張回路222を経由せずに受信出力バッファ223に転送される。
【0040】
例えばノード間通信器104に圧縮回路212が32個備えられていて、256KBのデータを可逆圧縮して他のストレージノードに転送する場合、データは8KBに分割され、1つの圧縮回路212は8KBの可逆圧縮を実行する。圧縮回路212による可逆圧縮の圧縮率が平均50%の場合、各圧縮結果サイズは平均4KBとなる。送信出力バッファ213にまとめられる圧縮データサイズは128KBとなる。この圧縮データが他のストレージノードのノード間通信器104に送られる。
【0041】
受信側のノード間通信器104は受信データを複数の伸張回路222によって並列的に伸張して元データを復元し、CPU103に転送する。この時、伸張回路222による各伸張結果サイズはいずれも8KBである。そして、受信出力バッファ223に32個がまとめられ、元の256KBデータが得られる。
【0042】
ノード間通信器104は、備えられた圧縮回路212や伸張回路222を用いて、ストレージノード間の転送データのサイズを削減することができる。圧縮回路212による可逆圧縮の圧縮率が50%の場合、これはストレージノード間の転送帯域を見かけ上2倍に拡大することを意味する。ストレージシステム100の性能のボトルネックがストレージノード間の転送帯域である場合、この圧縮の適用はボトルネックの改善となり、システム性能の向上をもたらす。
【0043】
(3)リード/ライトコマンド
ストレージノード101が行うリード/ライトコマンド処理について
図3、
図4、
図5を用いて説明する。
【0044】
図3は、ストレージノード101Aが、ホスト108Aからのリードコマンドに応じて、ストレージノード101B内のデータ記憶媒体105Bに非圧縮状態で格納されているデータを読み出してホスト108Aに返す処理のフローチャートを示している。
【0045】
まず、ストレージノード101Aはホスト108Aからデータリードコマンドを受信する(301)。要求されたデータがストレージノード101Bにあるため、ノード間通信器104Aと104Bを通じてストレージノード101Bにデータ読み出しを要求する(302)。
【0046】
次に、ストレージノード101Bはデータ記憶媒体105Bから要求されたデータをリードし(303)、そのデータをキャッシュメモリ106Bに保持する(304)。そしてCPU103Bは、ノード間通信中にそのデータを圧縮するための条件を満たすか判定する(305)。本条件の詳細については後述する。CPU103Bは、条件を満たさない(NO)場合はノード間通信器104Bにストレージノード101Aへの非圧縮(無加工)でのデータ転送を指示し(307)、ノード間通信器104Bはそのままストレージノード101Aへデータを送信する(309)。
【0047】
CPU103Bは、ステップ305で条件を満たす(YES)場合はノード間通信器104Bにストレージノード101Aへの圧縮でのデータ転送を指示し(306)、ノード間通信器104Bはそのデータを
図2の圧縮回路212により圧縮してから(308)、データを送信する(309)。
【0048】
次に、ストレージノード101Aのノード間通信器104Aはそのデータを受信する(310)。ノード間通信器104Aは、その受信データがノード間通信器104Bで圧縮されているか判定する(311)。転送データは、圧縮の有無を示すデータを含む。圧縮されていない(無加工)場合はそのままキャッシュメモリ106Aに保持する(313)が、圧縮されていた場合は
図2の伸張回路222により伸張してから(312)、キャッシュメモリ106Aに保持する(313)。ストレージノード101Aは最後にそのデータをリードコマンドへの応答としてホスト108Aに返す(314)。
【0049】
図4と
図5は、ストレージノード101Aが、ホスト108Aからのライトコマンドに応じて、ストレージノード101A内のデータ記憶媒体105Aにデータを書き込む処理のフローチャートを示している。
【0050】
まず
図4において、ストレージノード101Aはホスト108Aからデータライトコマンドとライトするデータを受信し(401)、そのデータをキャッシュメモリ106Aに保持する(402)。ストレージノード101A(データ記憶媒体105Aを除く)の故障によるライトデータの喪失を防ぐため、本ライトデータをストレージノード101B内のキャッシュメモリ106Bにもバックアップとして保持する。以下のステップ403~412は、ライトデータをノード間通信器104Aと104Bを通じてストレージノード101Bに転送し、キャッシュメモリ106Bに保持する手順である。
【0051】
CPU103Aは、ノード間通信中にそのデータを圧縮するための条件を満たすか判定する(403)。本条件の詳細については後述する。CPU103Aは、条件を満たさない(NO)場合はノード間通信器104Aにストレージノード101Bへの非圧縮(無加工)でのデータ転送を指示し(405)、ノード間通信器104Aはそのままストレージノード101Bへデータを送信する(407)。
【0052】
CPU103Aは、ステップ403で条件を満たす(YES)場合はノード間通信器104Aにストレージノード101Bへの圧縮でのデータ転送を指示し(404)、ノード間通信器104Aはそのデータを
図2の圧縮回路212により圧縮してから(406)、データを送信する(407)。
【0053】
次に、ストレージノード101Bのノード間通信器104Bはそのデータを受信する(408)。ノード間通信器104Bは、その受信データがノード間通信器104Aで圧縮されているか判定する(409)。転送データは、圧縮の有無を示すデータを含み、それが参照される。圧縮されていない(無加工)場合はそのままキャッシュメモリ106Bに保持する(411)が、圧縮されていた場合は
図2の伸張回路222により伸張してから(410)、キャッシュメモリ106Bに保持する(411)。ストレージノード101Bは、ノード間通信器104Bと104Aを通じてライトデータの保持を完了したことをストレージノード101Aに通知する(412)。
【0054】
次に、ストレージノード101Aはホスト108Aにデータライト完了応答を送信する(413)。実際にはデータ記憶媒体105Aへのデータ格納は完了していないが、ホスト108Aが次のコマンドを早期に準備できるようにこの時点で応答する。
【0055】
引き続き
図5において、ストレージノード101AのCPU103AはライトデータからRAIDパリティを計算する(501)。データ記憶媒体105Aに格納するライトデータは、媒体故障によるデータ損失を防ぐために、RAID(Redundant Arrays of Independent Disks)技術に基づく、冗長化を施してから記録する。
【0056】
具体的には、データ記憶媒体105Aの数がN台であれば、CPU103Aはライトデータを(N-1)台に均等に配分して記録し、このデータの排他的論理和を計算して作ったパリティを残りの1台に記録する。これによりN台のうち1台が故障してもデータ回復が可能となる。
【0057】
例えば、N=4のとき、CPU103Aは3台に同じサイズのデータD1、D2、D3を記録して、残りの1台にP=D1+D2+D3(+は排他的論理和を示す)により計算されるRAIDパリティPを記録する。例えば、D2の記録先媒体が故障した場合は、CPU103AはP+D1+D3=D2の性質を利用してD2を回復する。パリティPは異なるデータの排他的論理和で作られるため、一般にその内容は無意味で乱数的である。ステップ502で、CPU103Aは算出したパリティをキャッシュメモリ106Aに保持する。
【0058】
ストレージノード101A(データ記憶媒体105Aを除く)の故障によるパリティの喪失を防ぐため、本パリティをストレージノード101B内のキャッシュメモリ106Bにもバックアップとして保持する。以下のステップ503~508は、パリティをノード間通信器104Aと104Bを通じてストレージノード101Bに転送し、キャッシュメモリ106Bに保持する手順である。
【0059】
CPU103Aは、ノード間通信器104Aに非圧縮(
図2の圧縮回路212不使用)でのストレージノード101Bへのパリティ転送を指示する(503)。この転送を非圧縮にする判定については後述する。ノード間通信器104Aは、そのままパリティをストレージノード101Bへ送信する(504)。
【0060】
次に、ストレージノード101Bのノード間通信器104Bはそのパリティを受信する(505)。ノード間通信器104Bは、そのパリティがノード間通信器104Aで圧縮されているか判定する(506)。転送データは、圧縮の有無を示すデータを含み、それが参照される。本ケースではノード間通信器104Aでは圧縮されていないため、そのままキャッシュメモリ106Bに保持する(507)。ストレージノード101Bは、ノード間通信器104Bと104Aを通じてパリティの保持を完了したことをストレージノード101Aに通知する(508)。
【0061】
最後に、ストレージノード101Aは、キャッシュメモリ106Aに保持しているライトデータとパリティをデータ記憶媒体105Aに格納する(509)。これ以降、ライトデータが喪失する可能性はないため、キャッシュメモリ106Bに保持しているバックアップは無効化される。
【0062】
図6は、ストレージノード101Aが、ホスト108Aからのリードコマンドに応じて、ストレージノード101B内のデータ記憶媒体105Bに格納データ圧縮伸張器107Bで圧縮された状態で格納されているデータを読み出し、伸張して平文状態に復元してホスト108Aに返す処理のフローチャートを示している。
【0063】
まず、ストレージノード101Aはホスト108Aからデータリードコマンドを受信する(601)。要求されたデータがストレージノード101Bにあるため、ノード間通信器104Aと104Bを通じてストレージノード101Bにデータ読み出しを要求する(602)。
【0064】
次に、ストレージノード101Bはデータ記憶媒体105Bから要求された既圧縮データをリードし(603)、その既圧縮データをキャッシュメモリ106Bに保持する(604)。そして、CPU103Bは、ノード間通信器104Bに非圧縮(
図2の圧縮回路212不使用)でのストレージノード101Aへのデータ転送を指示する(605)。この転送を非圧縮にする判定については後述する。ノード間通信器104Bは、そのまま既圧縮データをストレージノード101Aへ送信する(606)。
【0065】
次に、ストレージノード101Aのノード間通信器104Aはその既圧縮データを受信する(607)。ノード間通信器104Aは、そのデータがノード間通信器104Bで圧縮されているか判定する(608)。転送データは、圧縮の有無を示すデータを含み、それが参照される。本ケースではノード間通信器104Bでは圧縮されていないため、そのままキャッシュメモリ106Aに保持する(609)。ストレージノード101Aは格納データ圧縮伸張器107Aによりその既圧縮データを伸張して平文状態に復元してキャッシュメモリ106Aに保持する(610)。最後にそのデータをリードコマンドへの応答としてホスト108Aに返す(611)。
【0066】
(4)ノード間通信器による圧縮の効果と制御
図7A、
図7B、
図8を参照しながら、ストレージノード間通信を圧縮する効果、その圧縮の有効化・無効化の制御について説明する。
【0067】
図7Aは、ストレージノード101がホスト108から受信したリードコマンドに対してデータを返す際の最大性能(最大リード性能。単位はGB/s)の算出方法を示す表である。最大リード性能は1リードコマンド当たりの要求データサイズd(kB)によって異なる。1リードコマンドをCPU103内の1マイクロプロセッサが処理する時間T(s)は、例えばd=8の時にT=80、d=32の時にT=200、d=256の時にT=800である。
【0068】
CPU103に含まれるマイクロプロセッサのコア数cを40個とすると、CPU103のリードコマンド処理性能は全コアが稼働している時に最大となり、その性能(最大CPU性能。単位はGB/s)はdc/Tで求められる。例えばd=8の時に4.0GB/s、d=32の時に6.4GB/s、d=256の時に12.8GB/sである。CPU103がこのような処理性能を持っていても、リードデータをホスト108に送出する際に通過する経路の転送帯域が最大CPU性能に満たないならば、最大リード性能はその転送帯域がボトルネックになって最大CPU性能よりも低くなる。
【0069】
今、ホスト108からのリードコマンド全てが、自身が接続されていない別のストレージノード101内のデータ記憶媒体105にあるデータを要求するものである場合、そのデータは全てノード間通信器104を通じて転送される。リードデータが通過する経路の中でこの転送帯域(ノード間帯域)が最も低く、例えば5.0GB/sであるとする。その場合の最大リード性能を算出する。d=8の時は最大CPU性能が4.0GB/sであるのでノード間帯域はボトルネックとならず、4.0GB/sとなる。d=32や256の時は最大CPU性能が6.4GB/sや12.8GB/sであるのでノード間帯域がボトルネックとなり、ともに5.0GB/sに抑えられる。
【0070】
これに対して、d=32や256の時にノード間通信器104が転送データを可逆圧縮して見かけの帯域を2倍の10.0GB/sに拡げた場合の最大リード性能を算出する。d=32の時はノード間帯域がボトルネックとならず、最大リード性能は6.4GB/sに向上する。d=256の時はノード間帯域が依然ボトルネックだが、最大リード性能は10.0GB/sに向上する。
【0071】
図7BはCPU103の稼働率(稼働コア数/全コア数)に対するストレージノード101のリード性能の変化を示している。
図7Bを用いてCPU103がノード間通信器104による圧縮を有効化・無効化する制御方法を説明する。参照されるCPU稼働率は、ホスト108からリードコマンド又はライトコマンドを受信したストレージノード101のCPU103の稼働率である。稼働コア数は、消費電力やその他の観点で制御され得る。この点は広く知られた技術であり詳細を省略する。
【0072】
まず、d=8の時、CPU稼働率が上がってもノード間帯域がリード性能のボトルネックとならないため、CPU103はノード間通信器104に非圧縮でデータ転送するように指示する。リード性能は最大CPU性能の4.0GB/sまで向上可能である。
【0073】
d=32の時、CPU稼働率が78%(境界線711)以下ならば、ノード間帯域がリード性能のボトルネックとならないため、CPU103はノード間通信器104に非圧縮でデータ転送するように指示するが、CPU稼働率が78%(境界線711)より大きければ、CPU103はノード間帯域がリード性能のボトルネックになるのを回避するためにノード間通信器104に圧縮してデータ転送するように指示する。ノード間通信の圧縮によりリード性能は最大CPU性能の6.4GB/sまで向上可能になる。
【0074】
d=256の時、CPU稼働率が39%(境界線712)以下ならば、ノード間帯域がリード性能のボトルネックとならないため、CPU103はノード間通信器104に非圧縮でデータ転送するように指示するが、CPU稼働率が39%(境界線712)より大きければ、CPU103はノード間帯域がリード性能のボトルネックになるのを回避するためにノード間通信器104に圧縮してデータ転送するように指示する。ノード間通信の圧縮によりリード性能はノード間帯域(見かけ帯域)の10.0GB/sまで向上可能になる。
【0075】
上述のように、要求データサイズdに応じて、異なるCPU稼働率の閾値を設定することで、より適切な判定が可能となる。なお、異なる要求データサイズdに共通のCPU稼働率の閾値が設定されてもよい。以上の制御方法により、ノード間通信器104による圧縮・伸張処理がリード性能向上に効果がない時は、それらの処理にかかる時間を節約することができ、リードデータをホスト108に返すまでの応答時間の無駄な増加を抑えることができる。
【0076】
図7A及び7Bを参照した説明は、ストレージノード101がホスト108から受信したライトコマンドに対してデータライト完了応答を返す場合に適用され得る。
図4を参照して説明したように、ホスト108から受信したデータは、ノード間通信器104を介して、他のストレージノード101に転送される。ノード間帯域がライト性能のボトルネックとならないように、ノード間通信器104での圧縮の有無が判定される。ホスト108からライトコマンドを受けたストレージノード101のCPU103は、その稼働率と規定の閾値との関係から、ノード間通信器104での圧縮の有無を判定する。上述のように、1又は複数閾値が設定される。
【0077】
図8は、
図3~6に示したリード/ライトコマンド処理において、CPU103がノード間通信の圧縮を有効にする条件(圧縮条件)を判定するステップ(すなわち305、403、503、605)のフローチャートを示している。
【0078】
CPU103は、転送対象がRAIDパリティであるかを調べ(801)、真ならば圧縮条件を満たさない(806)として判定を終える。ステップ801が偽ならば、転送対象が既圧縮データであるかを調べ(802)、真ならば圧縮条件を満たさない(806)として判定を終える。ステップ802が偽ならば、コマンドでリード/ライトが要求されたデータのサイズが閾値以上であるかを調べ(803)る。ここでは例として32kB以上を条件とする。ステップ803が、偽ならば圧縮条件を満たさない(806)として判定を終える。
【0079】
ステップ803が真ならば、ホスト108からリード/ライトコマンドを受けたストレージノード101のCPU稼働率が所定の閾値より大きいかを調べる(804)。偽ならば圧縮条件を満たさない(806)として判定を終える。804が真ならば、圧縮条件を満たす(805)として判定を終える。
【0080】
ステップ801や802の判定は、RAIDパリティや既圧縮データは無意味で乱数的な内容であって圧縮率が小さいため、圧縮・伸張に時間をかけてもノード間帯域の拡張に効果がなく、応答時間の増加にしかならないことを根拠にしている。ステップ803の判定は、データサイズが小さいときはノード間帯域がリード/ライト性能のボトルネックにならず、ノード間帯域の拡張は不要であることを根拠にしている。ステップ804の判定は、CPU稼働率が閾値(
図7Bの711や712)以下である時は、ノード間帯域がリード/ライト性能のボトルネックにならず、ノード間帯域の拡張は不要であることを根拠にしている。なお、
図8に示す条件の一部のみが判定されてよく、全ての条件が判定されなくてもよい。
【0081】
(5)ノード間通信器による圧縮・伸張方法
図9Aは、ノード間通信器104によるデータの圧縮・伸張方法の概要を示す。転送元ストレージノード101内のノード間通信器104で行う圧縮処理では、圧縮前の平文データ901は、最初に辞書圧縮処理902にかけられる。その後、辞書圧縮結果はビット列への符号化処理903にかけられる。これによりノード間通信器104から転送先ストレージノード101に出力される圧縮データ904が生成される。
【0082】
一方、転送先ストレージノード101内のノード間通信器104で行う伸張処理では、圧縮データ904は、最初にビット列の復号処理905にかけられる。その後、復号結果は平文展開処理906にかけられる。これにより元の平文データ901が生成される。
【0083】
図9Bは、辞書圧縮処理902の具体例を示す。平文データ901の文字列ストリームにおいて、同じ文字列が再び出現するかどうかを順番に調べていく。その中で、ある文字列が、その先頭文字を起点にしてJ文字前からL文字連続で一致している場合、この文字列をコピー記号[J,L]に変換する。
【0084】
例えば、「a,b,c,d,e」の5文字の文字列911は、先頭の文字「a」を起点にして6文字前から5文字連続で一致している。この場合、文字列911をコピー記号[6,5]に変換する。同様に、「a,b,a,b」の4文字の文字列912は、先頭の文字「a」を起点にして2文字前から(互いに重なる部分も含めて)4文字連続で一致している。この場合、文字列912をコピー記号[2,4]に変換する。同様に、「c,d,e,f」の4文字の文字列913は、先頭の文字「c」を起点にして15文字前から5文字連続で一致している。この場合、文字列913をコピー記号[15,5]に変換する。
【0085】
これらのコピー記号のデータ量は元の文字列の持つデータ量よりも少ないので、この変換によってデータ量を減らすことができる。一致検索で参照する文字列ストリーム(以下、辞書と呼ぶ)の範囲は、1文字前から所定文字数前までの範囲とする。辞書範囲が検索の度に後方へスライドしていくので、この圧縮技術はスライド辞書型圧縮とも呼ばれる。なお、一致する文字列が辞書範囲内に複数存在する場合は、連続で最も長く一致する文字列をコピー記号に変換する。これは、データ量をより多く減らせる効果がある。
【0086】
後段の符号化処理903では、コピー記号に変換されなかった文字(以下、リテラル文字と呼ぶ)とコピー記号とを規定のビットパタンで符号化し、それらを連結してビットストリームにする。
図9Bのビットストリームは、RFC-2395で規定されているLZS(Lempel-Ziv-Stac)圧縮アルゴリズムの仕様に従って符号化した結果である。コピー記号は1ビットの“1”の後に、コピー元までの距離Jとコピー長Lを表すビットパタンを連結して符号化する。
【0087】
例えば、ビットパタン921は13ビット長でコピー記号[6,5]を表す。ビットパタン922は11ビット長でコピー記号[2,4]を表す。ビットパタン923は13ビット長でコピー記号[15,5]を表す。コピー記号に対応する符号のビット長は固定ではない。一方、リテラル文字は、その文字の8ビット値の先頭に“0”を1ビット付加した9ビット長のビットパタンによって表される。
【0088】
復号処理905は、このようなビットストリームを解釈してコピー記号やリテラル文字を出力する。また、平文展開処理906では、それらコピー記号やリテラル文字から、平文データ901の文字列を先頭から順に復元する。コピー記号を文字列に展開する際には復元済みの文字列を辞書として参照する。コピー記号[J,L]の展開では、辞書の末尾からJ文字戻った場所からL文字を抽出し、そのL文字を辞書の末尾に追記したものを次に参照する辞書とする。リテラル文字の展開では、その1文字を辞書の末尾に追記したものを次に参照する辞書とする。
【0089】
図10を用いて、ノード間通信器104がノード間転送データを圧縮しないで転送する時に比べて圧縮して転送することで増える処理時間(以下、圧縮オーバーヘッド時間と呼ぶ)を、できるだけ小さくするための方法を説明する。
【0090】
図2を用いて説明したように、ノード間通信器104はノード間転送データを所定サイズに分割し、複数の圧縮回路212により並列的に圧縮する。ノード間転送データ1000のサイズを256kBとし、所定サイズを8kBとすると、ノード間転送データ1000は32個の8kB部分1001に分割される。1つの8kB部分1001が1つの圧縮回路212で可逆圧縮される。ノード間通信器104に圧縮回路212が32個搭載されている場合、32並列で圧縮処理が可能であるため、256kB転送データ1000が圧縮されるのにかかる時間は、1つの8kB部分1001が圧縮されるのにかかる時間で済む。すなわち、圧縮回路212を複数備えて並列動作させることで圧縮オーバーヘッド時間を小さくすることができる。
【0091】
また、ノード間通信器104はその8kB部分1001を、16個の512B部分1002に分割し、512B部分1002を個別に可逆圧縮する。例えば、
図10の1003はそれを示している。各512B部分1002の圧縮が完了したらすぐにその圧縮結果をペイロードとするPCIexpressパケットを形成して、送信先のノード間通信器104へ送信する。これにより、8kB部分1001を圧縮したデータが送出されるまでの待ち時間は、1つの512B部分1002が圧縮されるのにかかる時間で済む。すなわち、圧縮処理の途中で部分的な結果を逐次送出することで圧縮オーバーヘッド時間を小さくすることができる。
【0092】
なお、512B部分1002を
図9Bに示した方法で可逆圧縮する時に参照する辞書範囲は、自身が含まれる8kB部分1001の先頭から自身までの範囲(
図10の1004で示した範囲)とする。これは、512B部分1002のみを辞書範囲とするよりも辞書として使用可能な文字列の候補が増えるため、圧縮率が向上してデータ量をより小さく圧縮する(見かけ転送帯域をより拡げる)効果がある。
【0093】
また、512B部分1002を個別に可逆圧縮した結果が512Bより大きくなった場合は、圧縮結果をペイロードとするパケットを送出する代わりに圧縮前の512B部分をペイロードとするパケットを送出する。これは、圧縮することで逆に転送データ量が増えて見かけ転送帯域を小さくしてしまう問題を防止する効果がある。例えば、
図10の1005や1006はそれを示している。
図9Bに示したように、リテラル文字は9ビット長のパタンに符号化されて9/8倍にデータ量が増えるため、コピー記号の頻度が非常に少ない512B部分1002は、圧縮することで512Bを超える可能性が高い。
【0094】
図11は、ノード間転送データを圧縮して転送する条件である時に、ノード間通信器104が送受信するPCIexpressパケットの構成を示す図である。
【0095】
PCIexpressパケットは一般にTLPヘッダとペイロードからなる。TLPヘッダにはペイロードのバイト長を示すLengthフィールドと、送信先アドレスなどを含むAddressフィールドが含まれる。ペイロードは送信対象のデータ本体である。
図10で説明したように512B部分が可逆圧縮で小さくなる場合は圧縮状態で、小さくならない場合は平文状態でデータを転送する。
【0096】
平文状態で512Bのデータを送る時のパケットを平文パケット、圧縮状態で512B未満のデータを送る時のパケットを圧縮パケットと呼ぶ。平文パケットのペイロードには512Bの平文データ1103(
図10の1005や1006に相当)を設定し、TLPヘッダのLengthフィールド1101には“512”を設定する。圧縮パケットのペイロードには508B以下の圧縮データ1106(
図10の1003に相当)を設定し、TLPヘッダのLengthフィールド1104には1106のバイト長を設定する。圧縮データ1106のサイズを508バイト以下としている理由は、PCIexpressパケットのペイロードサイズが原則として4の倍数と規定されているからである。したがって、圧縮結果が509~511バイトの場合は平文パケットで転送する。
【0097】
平文パケットと圧縮パケットにおいて、TLPヘッダのAddressフィールド1102や1105は以下の項目を含む。すなわち、送信先メモリアドレス1114、デバイス番号1111、圧縮回路ID1112、圧縮状態判別フラグ1113を含む。
【0098】
送信先メモリアドレス1114は、送信先のストレージノード101内のキャッシュメモリ106にペイロードのデータを格納する際の宛先アドレスである。圧縮パケットの場合は伸張後の512Bデータを格納するアドレスである。つまり、8kB部分を16個のパケットで送る時、それらに含まれる16個の送信先メモリアドレス1114は512B間隔の値が振られる。
【0099】
デバイス番号1111は、平文・圧縮パケットを転送する先のストレージノード101に搭載されたノード間通信器104を識別するためのユニークな番号である。
図1のハブ装置110は、受信したパケットのTLPヘッダのAddressに含まれるデバイス番号1111を検知してそのパケットの転送先をスイッチする。圧縮回路ID1112は、圧縮回路の識別子である。圧縮回路ID1112は、パケットを送信したノード間通信器104にある複数の圧縮回路212のうちどの圧縮回路でそのパケットのペイロードの圧縮処理を実行したかを識別するためのユニークな番号である。
【0100】
パケットを受信したノード間通信器104は、同じ圧縮回路ID1112をTLPヘッダのAddressに含むパケットに対して、そのペイロードの伸張処理を、共通の伸張回路222を用いて実行する。
図10の1004で示したように、8kB部分1001の圧縮処理で参照する辞書範囲は複数の512B部分1002で共有されるため、これらを圧縮したデータを正しく伸張するには同じ伸張回路222を用いる必要があるからである。
【0101】
圧縮状態判別フラグ1113は、そのパケットが平文パケットか圧縮パケットかを伸張回路222が識別するための情報である。このフラグが“1”の時は圧縮パケットとしてペイロードの伸張処理を実行するが、このフラグが“0”の時は平文パケットとしてペイロードの伸張処理をバイパスする。
【0102】
本実施形態において、平文パケットのペイロードからは512Bのデータが得られ、圧縮パケットのペイロードを伸張回路222で伸張することで512Bのデータが得られる。すなわち、
図2の受信出力バッファ223には必ず512B単位でデータが転送される。
図1の説明で述べたように、CPU103をRootComplex、ノード間通信器104をEndPointとするPCIexpress接続において、キャッシュメモリ106へのライト転送パケットの最大ペイロードサイズは512Bである。
【0103】
受信出力バッファ223に512B単位で保持されているデータのそれぞれにTLPヘッダ(Addressフィールドにキャッシュメモリ106のアドレスを設定したもの)を付けるだけで、そのままキャッシュメモリ106へのライト転送が可能なパケットが形成できるため、PCIexpressの伝送処理が効率化される。512B以外の単位で保持されている場合は、データサイズカウンタやデータ分割・連結回路が必要になるが、本実施形態はそれを省くことができる。
【0104】
図12は、ノード間転送データを圧縮して転送する条件である時に、ノード間通信器104の圧縮回路212が8kB部分の圧縮処理を実行する際のフローチャートである。まず、インデックスNを0に初期化し(1201)、ステップ1202に遷移する。
【0105】
ステップ1202では、圧縮する8kB部分を構成する16個の512Bのうち、N番目(最初を0とする)の512Bを選択する。そして、選択した512Bについて、履歴範囲(512BxN個)を辞書に含めて辞書圧縮を行う(1203)。その圧縮結果のサイズが508B以下か調べる(1204)。これが真ならば、圧縮結果をペイロードとするために送信出力バッファ213に転送する(1205)。ステップ1204が偽ならば、元の平文(512B)をペイロードとするために送信出力バッファ213に転送する(1206)。
【0106】
ステップ1205または1206の後、Nを1加算する(1207)。Nが16かを調べる(1208)。Nが16ならば圧縮処理を完了する。Nが16でないならばステップ1202に戻り、次の512Bについて圧縮処理を継続する。その際、ステップ1203の辞書圧縮で用いる辞書範囲はそれまでに処理した(N-1)個の512Bを含む。
【0107】
図13は、ノード間通信器104が、圧縮回路212で圧縮された8kB部分を伸張回路222により伸張し、キャッシュメモリ106に転送する際のフローチャートである。
【0108】
まず、ノード間通信器104はパケットを受信し(1301)、受信パケットのTLPヘッダ内の圧縮回路IDに伸張回路222の一つが割り当て済みかを調べる(1302)。割り当て済みならばステップ1304に遷移する。未割り当てならば伸張回路222の一つを割り当て(1303)、ステップ1304に遷移する。
【0109】
ステップ1304では、割り当てた伸張回路222に受信パケットのペイロードを入力する。そして、受信パケットのTLPヘッダ内の圧縮状態判別フラグがON(圧縮状態)かを調べる(1305)。OFF(平文状態)ならばステップ1307に遷移する。ONならば伸張回路222でペイロードを伸張(復号と辞書参照による平文展開)して512Bの平文を復元し(1306)、ステップ1307に遷移する。
【0110】
ステップ1307では、512Bの平文(復元結果またはペイロードそのもの)でメモリライトのためのパケットを構成し、キャッシュメモリ106に転送する。そして、この圧縮回路IDが付された受信パケットから得られた平文が通算で8kB転送済みかを調べる(1308)。8kB転送済みならば、伸張回路222の割り当てを解除して処理を完了する。8kB未転送ならば、後続パケットの受信(1301)に戻って処理を継続する。その際、ステップ1306の平文展開において参照する辞書範囲は、その伸張回路の割り当て以降に展開した平文全てを含む。
【0111】
上述のように、本実施形態によれば、ストレージノード間の通信帯域が、ストレージシステムにおけるデータ読み出しまたはデータ書き込みの性能のボトルネックになる時にのみ通信データの圧縮・伸張を実行することで、圧縮・伸張の処理時間が無駄にかかることを回避することができる。また、圧縮可能な通信データ(RAIDパリティや既圧縮データ以外のデータ)のみに圧縮・伸張を実行することで、圧縮・伸張の処理時間が無駄にかかることを回避することができる。
【0112】
本実施形態によれば、通信器からキャッシュメモリへのライトパケットの最大ペイロードサイズでデータを分割して圧縮することで、ライトパケットを容易に構成することができ、データ転送を効率化することができる。また、複数の分割データの辞書圧縮において辞書範囲を共有することで圧縮率を改善(データ量をより削減)してストレージノード間の見かけ上の通信帯域をより拡大し、データ読み出し/書き込み性能を向上させることができる。
【0113】
(6)その他の実施形態
図14を用いて、CPU103がノード間通信器104による圧縮を有効化・無効化する制御方法の別例を説明する。本例は
図8のフローチャートにおいてステップ804を「ノード間通信器による送信出力速度-CPU性能<閾値か?」という条件式に変えることによって実現する。ここで、送信出力元はリードデータを格納しているストレージノードのノード間通信器、送信出力先はリードコマンドを受信したストレージノードのノード間通信器である。なお、上記ステップ804を変えることなく、この条件をさらに追加してもよい。
図14は、本例におけるノード間通信器104による送信出力速度とストレージノード101のリード性能の変化を示している。CPU性能は、CPU稼働率から規定の数式に従って計算できる。
【0114】
ホスト108からのリードコマンドの発行頻度が増えるとCPU稼働率の上昇に伴いCPU性能は上昇するが、ノード間通信器104による転送データの圧縮が無効化されていると送信出力速度の上限は5.0GB/sであるため、CPU性能との差は縮小していく。それが閾値を下回ったならばステップ805に遷移し、圧縮を有効化する転送データの割合が増えることで、送信出力速度は増える。その結果CPU性能との差が拡がれば、閾値以上になってステップ806に遷移し、圧縮を有効化する転送データの割合が減る。つまり、この条件式に変えることによって、ノード間通信器104による送信出力速度はCPU性能から閾値分だけ高い速度を維持するようになる。
【0115】
図14の太線1411や太線1412は本例による送信出力速度の変化である。送信出力速度が、転送データ圧縮が常に有効な時の10GB/sに達するまで、リード性能のボトルネックはCPU性能となる。この制御方法では、ノード間通信器104が転送データの圧縮を必要以上に有効化しないため、圧縮オーバーヘッド時間の発生を前例の制御方法よりも少なくすることができ、リードデータをホスト108に返すまでの応答時間の無駄な増加をさらに抑えることができる。
【0116】
なお、上記説明はライトコマンドの処理に対しても適用され得る。ステップ804において、「ノード間通信器による送信出力速度-CPU性能<閾値か?」という条件式は、ライトコマンドの処理に対しても設定される。ここで、送信出力元はライトコマンドを受信したストレージノードのノード間通信器、送信出力先はそれ以外のストレージノードのノード間通信器である。本例の制御方法で圧縮を有効化する転送データの割合を増やす際には、以下の優先コマンド制御を行ってもよい。例えば、ホスト108からのリード・ライトコマンドの中に応答時間の増加を許可するか否かを意味するパラメータを付加し、そのパラメータが「否」に設定されているコマンドの処理で発生するノード間通信データは、圧縮の有効化対象として極力選択しないようにする。これにより、ホスト108が応答時間を悪化させたくないコマンドについて、応答時間の悪化を最小化することができる。
【0117】
なお、本発明は上記した実施形態に限定されるものではなく、様々な変形例が含まれる。例えば、上記した実施形態は本発明を分かりやすく説明するために詳細に説明したものであり、必ずしも説明したすべての構成を備えるものに限定されるものではない。また、ある実施形態の構成の一部を他の実施形態の構成に置き換えることが可能であり、また、ある実施形態の構成に他の実施形態の構成を加えることも可能である。また、各実施形態の構成の一部について、他の構成の追加・削除・置換をすることが可能である。
【0118】
また、上記の各構成・機能・処理部等は、それらの一部又は全部を、例えば集積回路で設計する等によりハードウェアで実現してもよい。また、上記の各構成、機能等は、プロセッサがそれぞれの機能を実現するプログラムを解釈し、実行することによりソフトウェアで実現してもよい。各機能を実現するプログラム、テーブル、ファイル等の情報は、メモリや、ハードディスク、SSD(Solid State Drive)等の記録装置、または、ICカード、SDカード等の記録媒体に置くことができる。
【0119】
また、制御線や情報線は説明上必要と考えられるものを示しており、製品上必ずしもすべての制御線や情報線を示しているとは限らない。実際には殆どすべての構成が相互に接続されていると考えてもよい。
【符号の説明】
【0120】
100…ストレージシステム、101A、101B…ストレージノード、103A、103B…CPU、104A、104B…ノード間通信器、105A、105B…データ記憶媒体、106A、106B…キャッシュメモリ、108A、108B…ホスト、110…ハブ装置、212…圧縮回路、222…伸張回路。