本願は、ストレージ技術の分野に関し、特に、ストレージコントローラ、および、ストレージコントローラによって実行される入出力(英文全表記:input output、略称:IO)リクエスト処理方法に関する。
図1に示されるように、ストレージアレイは通常、大規模ストレージシナリオにおいて使用され、複数のストレージ媒体およびストレージコントローラを含む。ストレージ媒体は、ハードディスク(英文全表記:hard disk drive、略称:HDD)およびソリッドステートドライブ(英文全表記:solid state drive、略称:SSD)を含み得る。クライアントは、通信ネットワークを使用することによって、IOリクエストをストレージコントローラへ送信する。ストレージコントローラは、受信されたIOリクエストを処理する。例えば、IOリクエストが読出しリクエストであるとき、ストレージコントローラは、読出しリクエストが指す特定のストレージ媒体を決定し、次に、ストレージコントローラは、読出しリクエストが指す当該ストレージ媒体から対応するデータを読出し、データをクライアントへ返す。
ストレージコントローラは、ストレージアレイのストレージ媒体を複数のストレージユニットに仮想化する。ストレージコントローラによって受信されるIOリクエストは通常、ストレージユニットを指す。異なるストレージの種類が使用されるとき、ストレージコントローラは、複数のストレージ媒体を異なる種類のストレージユニット(英語:storage unit)に仮想化する。例えば、ブロックストレージが使用されるとき、ストレージコントローラは、複数のストレージ媒体を1または複数の論理ユニット番号(英文全表記:logical unit number、略称:LUN)に仮想化し、クライアントの各IOリクエストは、あるLUNを指す。ファイルストレージが使用されるとき、クライアントの各IOリクエストは、ファイルシステムを指す。オブジェクト(英語:object)ストレージが使用されるとき、クライアントの各IOリクエストは、バケット(英語:bucket)を指す。
サービス要求上の理由から、ユーザは通常、異なるストレージユニットのために、IO毎秒(英語:input output per second、略称:IOPS)パラメータを設定する必要がある。クライアントによって送信されたIOリクエストの数が比較的大きく、かつ、IOリクエストが異なるストレージユニットを指す場合、ストレージコントローラがIOリクエストを処理する速度は限定されているので、ストレージコントローラは、受信されたIOリクエストをスケジューリングする必要があり、それにより、可能な限り、複数のストレージユニットのQOSパラメータを満たす。
既存のIOリクエストスケジューリング方法におけるIOPSパラメータ充足率は比較的低い。
本願は、ストレージコントローラを提供し、それにより、IOPS充足率を増加させる。
本願の第1の態様はストレージコントローラを提供し、ストレージコントローラは、複数のストレージユニットを有するストレージシステムに適用可能であり、ストレージコントローラは、メモリデバイスおよび複数のプロセッサコアを含み、複数のプロセッサコアは、少なくとも1つの分配コア、複数のソートコア、および、少なくとも1つのリクエスト処理コアを含む。
分配コアは、動作しているとき、メモリデバイスに記憶されるコードを実行し、それにより、メモリデバイスに記憶されたIOリクエストを受信し、受信されたIOリクエストを複数のソートコアへ分配する。
各ソートコアは、動作しているとき、メモリデバイスに記憶されたコードを実行して、以下の動作、すなわち、分配コアによって分配された、処理ソートインデックスが生成される予定のIOリクエストを取得する動作と、処理ソートインデックスが生成される予定のIOリクエストが指す目標ストレージユニットを決定する動作と、目標ストレージユニットの累積インデックス数を取得する動作であって、目標ストレージユニットの累積インデックス数は、以前に分配されたIOリクエストのために各ソートコアが処理ソートインデックスを生成して以来、複数のソートコアが処理ソートインデックスを生成した、目標ストレージユニットを指すIOリクエストの数を示し、以前に分配されたIOリクエストは、目標ストレージユニットを指す、動作と、以前に分配されたIOリクエストの処理ソートインデックス、および、目標ストレージユニットの累積インデックス数と目標ストレージユニットのIO毎秒パラメータとの比に従って、処理ソートインデックスが生成される予定のIOリクエストのために処理ソートインデックスを生成する動作と、処理ソートインデックスが生成される予定のIOリクエストの処理ソートインデックスを、各ソートコアに対応するインデックスキューに記憶する動作であって、各ソートコアに対応するインデックスキューはメモリデバイスに記憶され、複数のストレージユニットを指すIOリクエストのために各ソートコアによって生成された処理ソートインデックスを含む、動作とを実行する。
動作しているとき、各ソートコアに対応するインデックスキューにおける最小処理ソートインデックスに対応するIOリクエストを周期的に処理するために、リクエスト処理は、メモリデバイスに記憶されたコードを実行する。
分配コア、複数のソートコア、および、リクエスト処理コアは同時に動作し得る。
複数のソートコアは、各IOリクエストのために処理ソートインデックスを生成し、各IOリクエストの処理ソートインデックスの値に従って処理順序を決定し、その結果、IOPSパラメータ充足率が効率的に増加される。
本願の任意の態様、または、任意の態様の任意の実装において言及される各ソートコアは、複数のソートコアのうちいずれか1つを示す。
任意で、本願の任意の態様、または、任意の態様の任意の実装において言及される、処理ソートインデックスが生成される予定のIOリクエストは、以前に分配されたIOリクエストの後の各ソートコアに分配される次のIOリクエストである。
第1の態様に関連して、第1の態様の第1の実装において、各ソートコアは、目標ストレージユニットの累積インデックス数を取得するために、複数のソートコアが処理ソートインデックスを生成した、目標ストレージユニットを指すIOリクエストの現在の合計数を、目標ストレージユニットのための共有カウンタから取得するという操作を実行する。メモリデバイスにおいて、各ストレージユニットのために共有カウンタが設定される。
その後、複数のソートコアが以前に分配されたIOリクエストのために処理ソートインデックスを生成するとき、複数のソートコアが処理ソートインデックスを生成した、目標ストレージユニットを指すIOリクエストの以前の合計数が、目標ストレージユニットに対応する、各ソートコアのプライベートカウンタから取得される。各ストレージユニットに対応するプライベートカウンタが、メモリデバイスにおける各ソートコアのために設定される。
その後、IOリクエストの現在の合計数と、IOリクエストの以前の合計数との間の差を目標ストレージユニットの累積インデックス数として使用するために当該差が計算される。その後、目標ストレージユニットの共有カウンタの値が1増加され、次に、目標ストレージユニットに対応する、各ソートコアのプライベートカウンタが、目標ストレージユニットの共有カウンタの値を使用することによって更新される。
本態様において提供されるストレージコントローラにおいて、目標ストレージユニットの累積インデックス数を取得するとき、各ソートコアは、別のソートコアによる、IOリクエストのための処理ソートインデックスの生成の状況を取得するために、別のソートコアにアクセスする必要は無く、その結果、スケジューリング効率が改善される。
第1の態様に関連して、第1の態様の第2の実装において、各ソートコアは、目標ストレージユニットの累積インデックス数を取得するために、目標ストレージユニットに対応する、複数のソートコアの第1のプライベートカウンタから複数のプライベート数を取得する操作を実行し、ここで、各ソートコアのプライベート数は、各ソートコアが処理ソートインデックスを生成した、目標ストレージユニットを指すIOリクエストの数を示す。
本願の任意の態様、または、任意の態様の任意の実装において言及される各ソートコアは、複数のソートコアのいずれか1つを示す。
その後、処理ソートインデックスが生成された、目標ストレージユニットを指すIOリクエストの現在の大域的数を取得するために、複数のプライベート数の和が求められる。
その後、複数のソートコアが以前に分配されたIOリクエストのために処理ソートインデックスを生成するとき、複数のソートコアが処理ソートインデックスを生成した、目標ストレージユニットを指すIOリクエストの以前の大域的数が、目標ストレージユニットに対応する、各ソートコアの第2のプライベートカウンタから取得される。各ストレージユニットに対応する第1のプライベートカウンタおよび第2のプライベートカウンタが、メモリデバイスにおける各ソートコアに設定される。
その後、IOリクエストの現在の大域的数と、IOリクエストの以前の大域的数との間の差を目標ストレージユニットの累積インデックス数として使用するために当該差が計算される。
その後、目標ストレージユニットに対応する、各ソートコアの第1のプライベートカウンタの値が1増加され、複数のソートコアの現在のプライベート数の和を使用することによって、目標ストレージユニットに対応する、各ソートコアの第2のプライベートカウンタが更新される。第2のプライベートカウンタが更新される前に、目標ストレージユニットに対応する、各ソートコアの第1のプライベートカウンタの値は1増加される。したがって、各ソートコアは、複数のソートコアの現在のプライベート数の和を取得するために、IOリクエストの現在の大域的数を1増加させる。本態様において提供されるストレージコントローラにおいて、目標ストレージユニットの累積インデックス数を取得するとき、各ソートコアは、別のソートコアによる、IOリクエストのための処理ソートインデックスの生成の状況を取得するために、別のソートコアにアクセスする必要は無く、その結果、スケジューリング効率が改善される。
第1の態様、第1の態様の第1の実装、または、第1の態様の第2の実装に関連して、第1の態様の第3の実装において、各ソートコアは、以下の操作、すなわち、処理ソートインデックスが生成される予定のIOリクエストのために処理ソートインデックスを生成する操作と、現在のシステム時間を取得する操作と、その後、処理ソートインデックスを生成する予定のIOリクエストの処理ソートインデックスとして、目標ストレージユニットの累積インデックス数と目標ストレージユニットのIO毎秒パラメータとの比と、以前に分配されたIOリクエストの処理ソートインデックスとの和、および、現在のシステム時間のうちのより大きい方を使用する操作とを実行する。
すなわち、処理ソートインデックスが生成される予定のIOリクエストの処理ソートインデックス=Max{以前に分配されたIOリクエストの処理ソートインデックス+K×目標ストレージユニットの累積インデックス数/目標ストレージユニットのIO毎秒パラメータ,現在のシステム時間}である。
システム時間は、処理ソートインデックスの計算において考慮され、その結果、IOリクエストスケジューリング精度が改善される。
第1の態様、第1の態様の第1の実装、第1の態様の第2の実装、または、第1の態様の第3の実装に関連して、第1の態様の第4の実装において、各ソートコアは更に、処理ソートインデックスが生成される予定のIOリクエストのために処理ソートインデックスが生成された後の時点において、各ソートコアに分配される、目標ストレージユニットを指す、インデックスが生成されていないIOリクエストが無いと決定し、このケースでは、処理ソートインデックスが生成される予定のIOリクエストの処理ソートインデックスと、当該時点の目標ストレージユニットの累積インデックス数と目標ストレージユニットのIO毎秒パラメータとの比との和を計算して、当該和を処理ソート待ちインデックスとして使用するよう、および、各ソートコアに対応するインデックスキューに処理ソート待ちインデックスを記憶するよう構成される。
すなわち、処理ソート待ちインデックス=以前分配されたIOリクエストの処理ソートインデックス+K×当該時点の目標ストレージユニットの累積インデックス数/目標ストレージユニットのIO毎秒パラメータである。
当該時点の目標ストレージユニットの累積インデックス数は、当該時点の前に、各ソートコアが、目標ストレージユニットを指す最後の処理ソートインデックスを生成して以来、複数のソートコアが処理ソートインデックスを生成した、目標ストレージユニットを指すIOリクエストの数を示す。
各ソートコアの実行プロセスでは、インデックスが生成されていない、各ソートコアに分配されたIOリクエストにおいて、目標ストレージユニットを指すIOリクエストが無いと決定されると、処理ソート待ちインデックスが生成される。
第1の態様の第4の実装に関連して、第1の態様の第5の実装において、各ソートコアに対応するインデックスキューに処理ソート待ちインデックスが存在する期間の間に、処理ソート待ちインデックスより大きい、各ソートコアに対応するインデックスキューに含まれる処理ソートインデックスに対応するIOリクエストは、リクエスト処理コアによって処理することができず、各ソートコアは更に、当該時点の後に、目標ストレージユニットを指すIOリクエストが各ソートコアに分配されるとき、または、処理ソート待ちインデックスが存在する時間が予め設定された閾値を超えるとき、各ソートコアに対応するインデックスキューから処理ソート待ちインデックスを消去するよう構成される。
処理ソート待ちインデックスを使用することにより、IOリクエストスケジューリング精度を改善できる。
第1の態様または第1の態様の実装のいずれか1つに関連して、第1の態様の第6の実装において、リクエスト処理コアは、各ソートコアに対応するインデックスキューにおける最小処理ソートインデックスに対応するIOリクエストを周期的に処理するために、各ソートコアに対応するインデックスキューに周期的にアクセスする操作と、各アクセスにおいて、各ソートコアに対応するインデックスキューにおける最小処理ソートインデックスに対応するIOリクエストを処理する操作とを実行する。
本願の第2の態様は、IOリクエスト処理方法を提供し、第1の態様において提供されるストレージコントローラは、実行されるときに、当該方法を実行する。当該方法は、分配コアが、IOリクエストを受信し、受信されたIOリクエストを複数のソートコアに分配する段階と、各ソートコアが、分配コアによって分配される、処理ソートインデックスが生成される予定のIOリクエストを取得する段階と、各ソートコアが、処理ソートインデックスが生成される予定のIOリクエストが指す目標ストレージユニットを決定する段階と、各ソートコアが、目標ストレージユニットの累積インデックス数を取得する段階であって、目標ストレージユニットの累積インデックス数は、各ソートコアが、以前に分配されたIOリクエストのために処理ソートインデックスを生成して以来、複数のソートコアが処理ソートインデックスを生成した、目標ストレージユニットを指すIOリクエストの数を示し、以前に分配されたIOリクエストは、目標ストレージユニットを指す、段階と、各ソートコアが、以前に分配されたIOリクエストの処理ソートインデックス、および、目標ストレージユニットの累積インデックス数と目標ストレージユニットのIO毎秒パラメータとの比に従って、処理ソートインデックスが生成される予定のIOリクエストのために処理ソートインデックスを生成する段階と、各ソートコアが、処理ソートインデックスが生成される予定のIOリクエストの処理ソートインデックスを各ソートコアに対応するインデックスキューに記憶する段階であって、各ソートコアに対応するインデックスキューは、メモリデバイスに記憶され、複数のストレージユニットを指すIOリクエストのために、各ソートコアによって生成される処理ソートインデックスを含む、段階と、リクエスト処理コアが、各ソートコアに対応するインデックスキューにおける最小処理ソートインデックスに対応するIOリクエストを周期的に処理する段階とを備える。
第2の態様に関連して、第2の態様の第1の実装において、各ソートコアが、目標ストレージユニットの累積インデックス数を取得する段階は、各ソートコアが、複数のソートコアが処理ソートインデックスを生成した、目標ストレージユニットを指すIOリクエストの現在の合計数を、目標ストレージユニットのための共有カウンタから取得する段階と、各ソートコアが、複数のソートコアが以前に分配されたIOリクエストのために処理ソートインデックスを生成するときの、複数のソートコアが処理ソートインデックスを生成した、目標ストレージユニットを指すIOリクエストの以前の合計数を、目標ストレージユニットに対応する、各ソートコアのプライベートカウンタから取得する段階と、各ソートコアが、IOリクエストの現在の合計数と、IOリクエストの以前の合計数との間の差を目標ストレージユニットの累積インデックス数として使用するために、差を計算する段階と、各ソートコアが、目標ストレージユニットのための共有カウンタの値を1増加させる段階と、各ソートコアが、目標ストレージユニットのための共有カウンタの値を使用することによって、目標ストレージユニットに対応する、各ソートコアのプライベートカウンタを更新する段階とを備える。
第2の態様に関連して、第2の態様の第2の実装において、各ソートコアが、目標ストレージユニットの累積インデックス数を取得する段階は、各ソートコアが、目標ストレージユニットに対応する、複数のソートコアの第1のプライベートカウンタから複数のプライベート数を取得する段階であって、各ソートコアのプライベート数は、各ソートコアが処理ソートインデックスを生成した、目標ストレージユニットを指すIOリクエストの数を示す、段階と、各ソートコアが、処理ソートインデックスが生成された、目標ストレージユニットを指すIOリクエストの現在の大域的数を取得するために、複数のプライベート数の和を求める段階と、各ソートコアが、複数のソートコアが以前に分配されたIOリクエストのために処理ソートインデックスを生成するときの、複数のソートコアが処理ソートインデックスを生成した、目標ストレージユニットを指すIOリクエストの以前の大域的数を、目標ストレージユニットに対応する、各ソートコアの第2のプライベートカウンタから取得する段階と、各ソートコアが、IOリクエストの現在の大域的数と、IOリクエストの以前の大域的数との間の差を目標ストレージユニットの累積インデックス数として使用するために差を計算する段階と、各ソートコアが、目標ストレージユニットに対応する、各ソートコアの第1のプライベートカウンタの値を1増加させる段階と、各ソートコアが、複数のソートコアの現在のプライベート数の和を使用することによって、目標ストレージユニットに対応する、各ソートコアの第2のプライベートカウンタを更新する段階とを含む。
第2の態様、第2の態様の第1の実装、または、第2の態様の第2の実装に関連して、第2の態様の第3の実装において、各ソートコアが、処理ソートインデックスが生成される予定のIOリクエストのために処理ソートインデックスを生成する段階は、各ソートコアが、現在のシステム時間を取得する段階と、各ソートコアが、目標ストレージユニットの累積インデックス数と目標ストレージユニットのIO毎秒パラメータとの比と以前に分配されたIOリクエストの処理ソートインデックスとの和、および、現在のシステム時間のうちのより大きい方を、処理ソートインデックスが生成される予定のIOリクエストの処理ソートインデックスとして使用する段階とを含む。
第2の態様、第2の態様の第1の実装、第2の態様の第2の実装、または、第2の態様の第3の実装に関連して、第2の態様の第4の実装において、方法は更に、処理ソートインデックスが生成される予定のIOリクエストのために処理ソートインデックスが生成された後の時点において、各ソートコアが、各ソートコアに分配された、目標ストレージユニットを指す、インデックスが生成されていないIOリクエストが無いと決定する段階と、各ソートコアが、当該時点における目標ストレージユニットの累積インデックス数を取得する段階であって、当該時点における目標ストレージユニットの累積インデックス数は、当該時点の前に、各ソートコアが目標ストレージユニットを指す最後の処理ソートインデックスを生成して以来、複数のソートコアが処理ソートインデックスを生成した、目標ストレージユニットを指すIOリクエストの数を示す、段階と、その後、各ソートコアが、当該時点における目標ストレージユニットの累積インデックス数と目標ストレージユニットのIO毎秒パラメータとの比と処理ソートインデックスが生成される予定のIOリクエストの処理ソートインデックスとの和を処理ソート待ちインデックスとして使用するために和を計算する段階と、その後、各ソートコアが、処理ソート待ちインデックスを各ソートコアに対応するインデックスキューに記憶する段階とを備える。
第2の態様の第4の実装に関連して、第2の態様の第5の実装において、各ソートコアに対応するインデックスキューに処理ソート待ちインデックスが存在する期間の間に、処理ソート待ちインデックスより大きい、各ソートコアに対応するインデックスキューに含まれる処理ソートインデックスに対応するIOリクエストは、リクエスト処理コアによって処理できず、方法は更に、当該時点の後に、目標ストレージユニットを指すIOリクエストが各ソートコアに分配されるとき、または、処理ソート待ちインデックスが存在する時間が予め設定された閾値を超えるとき、各ソートコアが、各ソートコアに対応するインデックスキューから処理ソート待ちインデックスを消去する段階を備える。
第2の態様または第2の態様の実装のいずれか1つに関連して、第2の態様の第6の実装において、リクエスト処理コアが、各ソートコアに対応するインデックスキューにおける最小処理ソートインデックスに対応するIOリクエストを周期的に処理する段階は、リクエスト処理コアが、各ソートコアに対応するインデックスキューに周期的にアクセスする段階と、各アクセスにおいて、リクエスト処理コアによって、各ソートコアに対応するインデックスキューにおける最小処理ソートインデックスに対応するIOリクエストを処理する段階とを含む。
本願の第3の態様はストレージ媒体を提供し、ストレージ媒体はプログラムを記憶し、プログラムがコンピューティングデバイス上で実行するとき、コンピューティングデバイスは、第2の態様または第2の態様の実装のいずれか1つにおいて提供されるIOリクエスト処理方法を実行する。ストレージ媒体は、これらに限定されないが、リードオンリメモリ、ランダムアクセスメモリ、フラッシュメモリ、HDDまたはSSDを含む。
本願の第4の態様は、コンピュータプログラムプロダクトを提供し、当該コンピュータプログラムプロダクトは、プログラム命令を含み、当該コンピュータプログラムプロダクトがストレージコントローラによって実行されるとき、ストレージコントローラは、第2の態様または第2の態様の実装のいずれか1つにおいて提供されるIOリクエスト処理方法を実行する。コンピュータプログラムプロダクトは、ソフトウェアインストールパッケージであり得て、第2の態様または第2の態様の実装のいずれか1つにおいて提供されるIOリクエスト処理方法を使用する必要があるとき、コンピュータプログラムプロダクトがダウンロードされ得て、コンピュータプログラムプロダクトはストレージコントローラ上で実行され得る。
本願の実施形態に係るストレージシステムの組織構造の概略図である。
ストレージコントローラの組織構造の概略図である。
ストレージコントローラの組織構造の概略図である。
ストレージコントローラのメモリデバイスの組織構造の概略図である。
ストレージコントローラのメモリデバイスの組織構造の概略図である。
処理ソートインデックスを生成するプロセスの概略図である。
処理ソートインデックスを生成するプロセスの概略図である。
処理ソートインデックスを生成するプロセスの概略図である。
処理ソートインデックスを生成するプロセスの概略図である。
処理ソートインデックスを生成するプロセスの概略図である。
処理ソートインデックスを生成するプロセスの概略図である。
処理ソートインデックスを生成するプロセスの概略図である。
処理ソートインデックスを生成するプロセスの概略図である。
処理ソートインデックスを生成するプロセスの概略図である。
処理ソートインデックスを生成するプロセスの概略図である。
処理ソートインデックスを生成するプロセスの概略図である。
処理ソートインデックスを生成するプロセスの概略図である。
処理ソートインデックスを生成するプロセスの概略図である。
以下では、本願の実施形態における添付図面を参照して、本願の実施形態における技術的解決法を説明する。
本願では、「第1」、「第2」および「第n」の間には論理的または時間的な順序の依存関係は無い。
本明細書において、プロセッサは、1または複数の中央処理装置(英文全表記:central processing unit、略称:CPU)を含み、各中央処理装置は、1または複数のコア(英語:core)を含む。
本明細書において、ストレージユニットは、LUN、ファイルシステムまたはバケットであり得る。LUN、ファイルシステムまたはバケットはそれぞれ、ストレージアレイがブロックストレージ、ファイルストレージまたはオブジェクトストレージを使用する場合に対応する。例えば、本明細書におけるストレージアレイは、P個のLUNをクライアントに提示し、Pは1より大きい正の整数である。
本明細書において、IOリクエストは、IOデータおよびメタデータを含む。IOデータは、IOリクエストの操作予定データ、および、操作予定データのアドレスなどの情報を含む。メタデータは、IOリクエストが指すストレージユニットIDを含む。ストレージユニットIDは、LUN ID、ファイルシステムID、または、バケットIDであり得る。
本明細書において、関数Max{x,y}の機能は、xおよびyのうちのより大きい値を返すことである。
本明細書において、IOPSパラメータは、ストレージユニットのIOPS、または、ストレージユニットのIOPS処理の重みであり得る。IOPS処理の重みは、各ストレージユニットを指すIOリクエストを処理するためにストレージアレイによって使用されるリソースの割合を示す。したがって、IOPSパラメータは、サービス要求に従ってユーザによって設定され得る。例えば、ユーザは、サービス要求に従って、サービスに関するストレージユニットの最低IOPSを決定する、または、ユーザは、サービスに関するストレージユニットのIOPSによって占有される必要がある、ストレージアレイのリソースの重みを決定する。代替的に、IOPSパラメータは、ユーザクラスに従って設定され得る。例えば、上級ユーザのエクスペリエンスを保証するために、上級ユーザのIOPSパラメータは比較的高い。ストレージコントローラは、複数の異なるストレージユニットのIOPSパラメータを記憶する。
[本願の実施形態に適用されるストレージコントローラのアーキテクチャ]
図2Aおよび図2Bに示されるように、ストレージコントローラは通常、複数のコア、メモリデバイスおよび通信インタフェースを含む。各コアは、メモリデバイスとの通信接続を確立する。ストレージコントローラは、通信インタフェースを使用することによってクライアントおよびストレージ媒体と通信する。通信インタフェースから取得されたIOリクエストはメモリデバイスのIOストレージ空間に記憶される。
IOリクエストのスケジューリングおよび処理のプロセスにおいて役割を果たす主な3種類のプログラムがあり、それらは、IOリクエスト分配プログラム、IOリクエストソートプログラム、および、IOリクエスト処理プログラムである。IOリクエスト分配プログラム、IOリクエストソートプログラムおよびIOリクエスト処理プログラムは各々、コアがメモリデバイスにおけるコードを実行することによって実装される。IOリクエスト分配プログラムを実行するコアは、分配コアと称される。IOリクエストソートプログラムを実行するコアは、ソートコアと称される。IOリクエスト処理プログラムを実行するコアは、リクエスト処理コアと称される。
3種類のプログラムの各々に割り当てられる予定のコアの数は、3種類のプログラムの実行圧力(running pressure)に従ってスケジューリングされ得る。また、各プログラムが実行される特定のコアについては、プログラムは、各コアの負荷状況に従って移動させられ得る。図2Aおよび図2Bにおいて、例えば、コア1は、IOリクエスト分配プログラムを実行するよう構成され、コア2からコアnは、IOリクエストソートプログラムを実行するよう構成され、コアn+1からコアn+mは、IOリクエスト処理プログラムを実行するよう構成され、コアn+m+1は、ストレージコントローラのオペレーティングシステムを実行するよう構成される。
IOリクエスト分配プログラムは、IOストレージ空間におけるIOリクエストを分配する、すなわち、IOリクエストソートプログラムを実行する各コアのサブ空間にIOリクエストを分配する。図2Aおよび図2Bにおいて、例えば、コア2からコアnのサブ空間は、コア1の空間に位置する。実際には、代替的に、コア2からコアnのサブ空間は、コア1の空間の外側に位置し得る、または、各コアのそれぞれの空間内に位置し得る。
IOリクエスト分配プログラムがIOリクエストを分配するプロセスにおいて、各IOリクエストソートプログラムのその後の負荷分散が主に考慮されるが、LUNを指すすべてのIOリクエストをコアの空間に分配することは考慮されない。例えば、IOリクエスト分配プログラムは、複数の受信されたIOリクエストをIOリクエストソートプログラムへ1つずつ分配し得て、それにより、IOリクエストソートプログラムへ分配されるIOリクエストの数が同一であることを保証する。
その後、各IOリクエストソートプログラムは、IOリクエストソートプログラムに分配されたIOリクエストを読出し、IOリクエストをソートする。ソート結果は、各IOリクエストソートプログラムが位置するコアの空間におけるインデックスキューに記憶される。インデックスキューは、ヒープ(英語:pile)または先入先出キューなどの複数の異なるデータ構造を使用することによって実装され得る。各IOリクエストソートプログラムは、IOリクエストソートプログラムのためのサブ空間における各IOリクエストのために処理ソートインデックスを生成し、次に、IOリクエストソートプログラムのためのインデックスキューにおける、IOリクエストの処理ソートインデックスをソートする。小さい処理ソートインデックスを有するIOリクエストは、アイドル状態のIOリクエスト処理プログラムによって優先的に処理される。
IOリクエスト処理プログラムは具体的には、IOリクエストの種類に従って、IOリクエストに対応する書込み操作または読出し操作を実行し得る。代替的に、IOリクエスト処理プログラムは、IOリクエストに保持されるデータに対して、整理または重複排除などを実行するよう構成され得る。
例えば、ストレージコントローラが位置するストレージアレイは、ブロックストレージを使用し、ストレージアレイのストレージ媒体は100個のLUNに仮想化される。サービス要求のために、いくつかのLUNについてIOPSパラメータが設定される必要がある。ストレージコントローラによって受信される各IOリクエストはLUNを指す。クライアントがIOリクエストを生成する速度は一定ではないので、異なるLUNを指す、毎秒に生成されるIOリクエストの数は著しく異なり得る。IOリクエスト処理プログラムの処理効率は限定されているので、IOリクエストソートプログラムのソート結果は、各LUNのIOPSパラメータを満たすことができるかどうかに影響する。例えば、LUN 1のIOPSパラメータは1000であり、LUN 2のIOPSパラメータは200である。しかしながら、LUN 2を指す、比較的大きい数のIOリクエストがある期間内に生成されるので、ある時点において、LUN 1を指す1000個のIOリクエスト、および、LUN 2を指す2000個のIOリクエストが、メモリデバイスのIOストレージ空間に記憶される。3000個のIOリクエストは、ソートのために、コア2からコアn+1上のIOリクエストソートプログラムに分配される。各IOリクエストソートプログラムが、LUN 1のIOPSパラメータおよびLUN 2のIOPSパラメータのみに従ってIOリクエストをスケジューリングする場合、最終的に、3000個のIOリクエストのためにn個のIOリクエストソートプログラムによって計算された処理ソートインデックスによって、LUN 1のIOPSパラメータ、および、LUN 2のIOPSパラメータを満たすことは通常困難である。処理ソートインデックスを生成するプロセスにおいて、IOリクエストソートプログラムが互いに通信する場合、これは、各LUNのIOPSの下限に到達することに役立つが、IOリクエストソートプログラムの間の通信のオーバーヘッドは非常に高い。
本願はIOリクエスト処理方法を提供する。当該方法は、図2Aおよび図2Bにおいて示されるストレージコントローラに適用可能である。
図3に示されるように、通信インタフェースは、クライアントによって送信された複数のIOリクエストを受信し、複数のIOリクエストをIOストレージ空間に記憶する。
IOリクエスト分配プログラムは、各IOリクエストのためにIO記述情報を生成し、各IOリクエストと、IOリクエストのIO記述情報との間のマッピング関係を確立する。各IOリクエストのIO記述情報は、IOリクエストのメタデータに保持されるLUN IDを含む。
IOリクエストが比較的大きい空間を占有するので、IOリクエストをソートするプロセスにおいて、IO記述情報は、各IOリクエストのために生成され得る。その後、IOリクエストソートプログラムは、IOリクエストのIO記述情報に従って、IOリクエストのために処理ソートインデックスを生成し、それにより、メモリデバイスの読出し/書込み負荷を低減する。
図4に示されるように、IOリクエスト分配プログラムは、複数のIO記述情報を、IOリクエストソートプログラムが位置するコアのサブ空間に分配する。
IOリクエスト分配プログラムは、各IOリクエストソートプログラムが位置するコアのサブ空間における各LUNのためにキューを構築し、IOリクエストソートプログラムが位置するコアのサブ空間に割り当てられたIO記述情報を各LUNのキューに記憶し得て、その結果、IOリクエストソートプログラムは、IO記述情報の各々が指すLUNを後のステップにおいて識別する。
以下では、図5Aおよび図5Bに関連して、コア2上で実行するIOリクエストソートプログラムが、どのように1つのIO記述情報について処理ソートインデックスを生成するかを説明する。実行プロセスにおいて、各IOリクエストソートプログラムは、各々のIO記述情報について処理ソートインデックスを生成するために同一の方法を使用する。
図5において、IO記述情報A−B−Cは、コアA上で実行するIOリクエストソートプログラムに分配される、LUN Bを指すC番目のIO記述情報を示す。それに対応して、処理ソートインデックスA−B−Cは、IO記述情報A−B−Cの処理ソートインデックスを示す。
例えば、コア2上で実行するIOリクエストソートプログラムは現在、IO記述情報2−1−3のために処理ソートインデックスを生成する。したがって、IO記述情報2−1−1の処理ソートインデックス、および、IO記述情報2−1−2の処理ソートインデックスは、IOリクエストソートプログラムによってコア2のインデックスキューに記憶されている。
コア2上で実行するIOリクエストソートプログラムは、コア2のサブ空間からIO記述情報2−1−3を取得して、IO記述情報に対応するLUN IDを取得する。
コア2上で実行するIOリクエストソートプログラムは、LUN IDに従ってLUN 1のIOPSパラメータを取得する。
コア2上で実行するIOリクエストソートプログラムは、LUN 1の累積インデックス数を取得する。LUN 1の累積インデックス数は、コア2上で実行するIOリクエストソートプログラムがIO記述情報2−1−2のために処理ソートインデックスを生成して以来、すべてのIOリクエストソートプログラムが処理ソートインデックスを生成した、LUN 1を指すIO記述情報の数を示す。
各IOリクエストソートプログラムが、IOリクエストソートプログラムに分配されたIO記述情報のために処理ソートインデックスを継続的に生成するので、コア2上で実行するIOリクエストソートプログラムがIO記述情報2−1−2のために処理ソートインデックスを生成する時点から、コア2上で実行するIOリクエストソートプログラムがIO記述情報2−1−3のために処理ソートインデックスを生成する時点までの期間の間に、別のIOリクエストソートプログラムも、LUN 1を指す特定の数のIO記述情報のために処理ソートインデックスを生成する。当該数は、コア2上で実行するIOリクエストソートプログラムがIO記述情報2−1−3のために処理ソートインデックスを生成するときのLUN 1の累積インデックス数である。
同様に、コア2上で実行するIOリクエストソートプログラムがIO記述情報2−1−2のために処理ソートインデックスを生成するときのLUN 1の累積インデックス数は、コア2上で実行するIOリクエストソートプログラムがIO記述情報2−1−1のために処理ソートインデックスを生成する時点から、コア2上で実行するIOリクエストソートプログラムがIO記述情報2−1−2のために処理ソートインデックスを生成する時点までの期間の間に残りのIOリクエストソートプログラムが処理ソートインデックスを生成する、LUN 1を指すIO記述情報の数である。
コア2上で実行するIOリクエストソートプログラムは、オペレーティングシステムのインタフェースを使用することによって現在のシステム時間を取得する。
現在のシステム時間は具体的には、ストレージコントローラが起動する時点から、ストレージコントローラがオペレーティングシステムのインタフェースを呼び出す時点までの期間の間に経過するナノ秒の数を示し得る。
コア2上で実行するIOリクエストソートプログラムは、IO記述情報2−1−3の処理ソートインデックス2−1−3を計算する。
処理ソートインデックス2−1−3=Max{処理ソートインデックス2−1−2+K×LUN 1の累積インデックス数/LUN 1のIOPSパラメータ,システム時間}である。ここで、Kは、正の数であり、Kの一般的な値は1である。
コア2上で実行するIOリクエストソートプログラムが現在、処理ソートインデックス2−1−1のために処理ソートインデックスを生成する場合、処理ソートインデックス2−1−1は、コア2上で実行するIOリクエストソートプログラムに分配される、LUN 1を指す第1IOリクエストの処理ソートインデックスであるので、処理ソートインデックス2−1−1=Max{最初の処理ソートインデックス+K×LUN 1の累積インデックス数/LUN 1のIOPSパラメータ,システム時間}である。最初の処理ソートインデックスは0であり得る。
コア2上で実行するIOリクエストソートプログラムは、処理ソートインデックス2−1−3をインデックスキューに記憶する。
IO記述情報2−1−3と処理ソートインデックス2−1−3との間に対応関係が確立され、または、処理ソートインデックス2−1−3と、IO記述情報2−1−3が生成されたIOリクエストとの間に対応関係が確立され、その結果、処理ソートインデックス2−1−3に対応するIOリクエストを後のステップにおいて決定できる。
上述のステップを実行することによって、各IOリクエストソートプログラムは、IOリクエストソートプログラムに分配されたIO記述情報の各々のために処理ソートインデックスを生成し、生成された処理ソートインデックスをインデックスキューに記憶する。したがって、処理されないIOリクエストの処理ソートインデックスは、コア2からコアnのインデックスキューに記憶される。
任意のコア上で実行するIOリクエスト処理プログラムがIOリクエストの処理を完了した後に、オペレーティングシステムは、IOリクエスト処理プログラムがアイドル状態に入ることを認識する。
オペレーティングシステムに各IOリクエスト処理プログラムの処理順序が記録される。すなわち、IOリクエスト処理プログラムがアイドル状態に入る後にIOリクエスト処理プログラムによって後に処理される予定の、最小処理ソートインデックスに対応するIOリクエストを含む特定のインデックスキュー。IOPSパラメータが満たされることを保証するために、処理順序は、同一または同様の頻度で、IOリクエスト処理プログラムが、インデックスキューにおける処理ソートインデックスを処理することを可能にする必要がある。すなわち、IOリクエスト処理プログラムは、各インデックスキューにおける最小処理ソートインデックスに対応するIOリクエストを周期的に処理する。
処理順序は、コア2からコアnまでのシーケンスにおいて、各IOリクエスト処理プログラムがすべてのインデックスキューをポーリングし、アクセスされるたびにインデックスキューにおける最小処理ソートインデックスに対応するIOリクエストを処理することであり得る。インデックスキューにおける最小処理ソートインデックスに対応するIOリクエストが処理された後に毎回、アイドル状態のIOリクエスト処理プログラムは、次のインデックスキューにおける最小処理ソートインデックスに対応するIOリクエストを処理する。
代替的には、m=n−1、すなわち、IOリクエストソートプログラムの数がIOリクエスト処理プログラムの数と同一である場合、オペレーティングシステムは、IOリクエスト処理プログラムおよびインデックスキューを1つずつバインディングする。このケースでは、IOリクエスト処理プログラムがアイドル状態に入るとき、オペレーティングシステムは、アイドル状態のIOリクエスト処理プログラムが後に、アイドル状態のIOリクエスト処理プログラムに対応するインデックスキューにおける最小処理ソートインデックスに対応するIOリクエストを処理すると決定する。
アイドル状態のIOリクエスト処理プログラムによって後に処理される予定の、最小処理ソートインデックスに対応するIOリクエストを含む特定のインデックスキューをオペレーティングシステムが決定した後に、オペレーティングシステムは、インデックスキューから最小処理ソートインデックスを選択し、最小処理ソートインデックスに対応するIOリクエストを処理するようアイドル状態のIOリクエスト処理プログラムに命令する、または、オペレーティングシステムは、アイドル状態のIOリクエスト処理プログラムに、インデックスキューにアクセスし、インデックスキューにおける最小処理ソートインデックスに対応するIOリクエストを処理するよう命令する。
上述のステップのいくつかを実行する順序は調整され得る。LUN 1のIOPSパラメータを取得するステップ、および、システム時間を取得するステップは各々、処理ソートインデックス2−1−3が生成される前の任意の時点に実行され得る。
システム時間を取得するステップは任意選択のステップである。当該ステップが実行されないとき、生成された処理ソートインデックス2−1−3=処理ソートインデックス2−1−2+K×LUN 1の累積インデックス数/LUN 1のIOPSパラメータである。
アイドル状態のIOリクエスト処理プログラムは、各インデックスキューにおける最小処理ソートインデックスに対応するIOリクエストを優先的に処理する。したがって、コア2上で実行するIOリクエストソートプログラムについては、ある期間内に、LUN 2を指すIOリクエストが分配されないが、別のLUNを指すIOリクエストが当該期間内に継続的に分配される場合、次の期間内において、LUN 2を指すIOリクエストがコア2上で実行するIOリクエストソートプログラムに分配されると、LUN 2を指すIOリクエストのすべての処理ソートインデックスは、別のLUNを指すIOリクエストの処理ソートインデックスより小さいことがあり得る。その結果、LUN 2を指すIOリクエストが、アイドル状態のIOリクエスト処理プログラムによって継続的に、かつ、優先的に処理され、従って、別のLUNを指すIOリクエストは飢餓状態(hungry)である。したがって、システム時間が処理ソートインデックスの計算において考慮され、それにより、アイドル状態のLUNがあるとき、アイドル状態のLUNを指すIOリクエストが後にIOリクエストソートプログラムに分配された後に、別のLUNを指すIOリクエストがブロックされるというケースを回避し、その結果、IOリクエストスケジューリング精度が改善される。
例えば、時点1において、コア2のインデックスキューに記録される処理ソートインデックスは、以下を含む。
処理ソートインデックス2−1−1=3
処理ソートインデックス2−2−1=2.2
処理ソートインデックス2−1−2=3.5
処理ソートインデックス2−2−2=2.8
処理ソートインデックス2−1−3=5.5
処理ソートインデックス2−2−3=3.0
時点2において、時点1においてインデックスキューに記憶された処理ソートインデックスに対応するすべてのIOリクエストが処理済みであり、時点1と時点2との間に生成される新しい処理ソートインデックスは、以下を含む。
処理ソートインデックス2−1−4=6
処理ソートインデックス2−1−5=7.5
処理ソートインデックス2−1−6=9.5
処理ソートインデックス2−1−7=10.5
処理ソートインデックス2−1−8=12
すなわち、時点1から時点2までの期間の間には、LUN 2を指す新しいIO記述情報が、コア2上で実行するIOリクエストソートプログラムに分配されない。したがって、時点2の後に、システム時間が処理ソートインデックスの計算において考慮されず、かつ、LUN 2を指す新しいIO記述情報が、コア2上で実行するIOリクエストソートプログラムに分配される場合、LUN 2を指す新しい分配されたIO記述情報の処理ソートインデックスは、LUN 1を指すIO記述情報の処理ソートインデックスより遥かに小さい。その結果、コア2のインデックスキューにアクセスするとき、アイドル状態のIOリクエスト処理プログラムは、LUN 2を指す新しい分配されたIOリクエストを継続的に処理する。システム時間が処理ソートインデックスの計算において考慮される場合、LUN 2を指す新しい分配されたIO記述情報の処理ソートインデックスは、現在のシステム時間に等しいことがあり得て、LUN 1を指すIO記述情報の処理ソートインデックスより遥かに小さくないことがあり得る。
したがって、処理ソートインデックスの計算においてシステム時間が考慮され、それにより、アイドル状態のLUNが無いとき、アイドル状態のLUNを指すIOリクエストが後に到着した後に、別のLUNを指すIOリクエストがブロックされるというケースを回避し、その結果、IOリクエストスケジューリング精度が改善される。
上述のステップを実行するプロセスにおいて、コア2上で実行するIOリクエストソートプログラムが、ある時点で、コア2のインデックスキューにおいて、LUN 1を指すすべてのIO記述情報が処理されたと決定した場合、図6に示されるように、処理ソートインデックス2−1−5が生成された後に、コア2上で実行するIOリクエストソートプログラムに分配されたIO記述情報において、処理ソートインデックスが生成されていない、かつ、LUN 1を指すIO記述情報が無い場合、コア2上で実行するIOリクエストは、処理ソート待ちインデックスを生成し、処理ソート待ちインデックスをコア2のインデックスキューに記憶する。
処理ソート待ちインデックス=処理ソートインデックス2−1−5+K×当該時点におけるLUN 1の累積インデックス数/LUN 1のIOPSパラメータである。
当該時点におけるLUN 1の累積インデックス数は、コア2上で実行するIOリクエストソートプログラムがIO記述情報2−1−5のために処理ソートインデックスを生成して以来、残りのIOリクエストソートプログラムが処理ソートインデックスを生成した、LUN 1を指すIO記述情報の数を示す。
処理ソート待ちインデックスは、以下の2つのケースのうちの1つにおいて消去される。ケース1において、処理ソート待ちインデックスが生成された後に、LUN 1を指すIO記述情報が、コア2上で実行するIOリクエストソートプログラムに分配される。ケース2において、処理ソート待ちインデックスが存在する時間が、予め設定された閾値を超える。
処理ソート待ちインデックスの生成は任意選択のステップである。各インデックスキューにおける処理ソートインデックスは、処理ソート待ちインデックスと共にソートされる。アイドル状態のIOリクエスト処理プログラムのために、後に処理される予定のIOリクエストを選択するプロセスにおいて、オペレーティングシステムが、現在のインデックスキューにおける最小処理ソートインデックスが処理ソート待ちインデックスであると決定する場合、処理ソート待ちインデックスはいずれのIOリクエストにも対応しないので、アイドル状態のIOリクエスト処理プログラムは、インデックスキューにおける処理ソートインデックスに対応するIOリクエストを処理できない。オペレーティングシステムは、アイドル状態のIOリクエスト処理プログラムのためにインデックスキューを再選択する必要がある。
例えば、アイドル状態のIOリクエスト処理プログラムは、コア2からコアnまでのシーケンスにおいて、コアのインデックスキューをポーリングする。このケースにおいて、アイドル状態のIOリクエスト処理プログラムが現在、コア3のインデックスキューをポーリングするが、コア3のインデックスキューにおける最小処理ソートインデックスが処理ソート待ちインデックスであると発見した場合、アイドル状態のIOリクエスト処理プログラムは、コア3のインデックスキューをスキップし、コア4のインデックスキューにアクセスする。
各IOリクエストソートプログラムに分配される、異なるLUNを指すIO記述情報の数は異なり、IOリクエストソートプログラムがIOリクエストのために処理ソートインデックスを生成する速度は通常、IOリクエスト処理プログラムがIOリクエストを処理する速度より遥かに高い。したがって、処理ソート待ちインデックスが生成されず、かつ、コア2上で実行するIOリクエストソートプログラムに分配される、LUN 2を指すIO記述情報が少ない場合、コア2のインデックスキューにおける最小処理ソートインデックスを有するIO記述情報は、常にLUN 1を指し得る。その結果、アイドル状態のIOリクエスト処理プログラムは、LUN 1を指すIOリクエストを継続的に処理する。最終的に、LUN 2のIOPSパラメータを満たすことが困難になる。
例えば、時点1において、コア2のインデックスキューに記憶された処理ソートインデックスは、以下を含む。
処理ソートインデックス2−1−1=3
処理ソートインデックス2−2−1=2.2
処理ソートインデックス2−1−2=3.5
処理ソートインデックス2−2−2=2.8
処理ソートインデックス2−1−3=5.5
処理ソートインデックス2−2−3=3.0
時点2において、時点1において生成された処理ソートインデックスのいくつかに対応するIOリクエストは既に処理されている。同時に、時点1から時点2までの期間の間に新しい処理ソートインデックスが生成される。このケースでは、コア2のインデックスキューに記録される処理ソートインデックスは、以下を含む。
処理ソートインデックス2−1−4=6
処理ソートインデックス2−2−4=3.4
処理ソートインデックス2−1−5=7.5
処理ソートインデックス2−1−6=9.5
次の期間内に、LUN 2を示すIO記述情報が、コア2上で実行するIOリクエストソートプログラムに分配されないが、LUN 1を指すIO記述情報が、コア2上で実行するIOリクエストソートプログラムに継続的に分配される場合、処理ソートインデックス2−2−4に対応するIOリクエストが処理された後に、処理ソート待ちインデックスが生成されない場合、アイドル状態のIOリクエスト処理プログラムがコア2のインデックスキューにアクセスすると、アイドル状態のIOリクエスト処理プログラムは、LUN 1を指すIOリクエストを継続的に処理する。その結果、LUN 2のIOPSパラメータを満たすことができない。
対照的に、処理ソート待ちインデックス2−2−6が、上述の方法を使用することによって生成される場合、処理ソート待ちインデックス2−2−6が消去される前に、アイドル状態のIOリクエスト処理プログラムによって、処理ソート待ちインデックス2−2−6より大きい処理ソートインデックスに対応するIOリクエストを処理できない。その結果、アイドル状態のIOリクエスト処理プログラムは、別のインデックスキューにアクセスする必要がある。したがって、処理ソート待ちインデックスを使用することによって、IOリクエストスケジューリング精度を改善でき、IOPSパラメータ充足率を増加させることができる。
上述のステップにおいて、処理ソートインデックス2−1−3のために処理ソートインデックスが生成されるとき、LUN 1の累積インデックス数は具体的には、以下の2つの方式のいずれか1つで取得され得る。
[方式1]
共有カウンタが、メモリデバイスにおける各LUNのために維持される。各IOリクエストソートプログラムは、P個の共有カウンタの読出し/書込みができる。共有カウンタの初期値は同一である。LUN 1を指すIO記述情報の処理ソートインデックスを生成した後に、各IOリクエストソートプログラムは、LUN 1の共有カウンタの値を1増加させる。したがって、すべての共有カウンタの初期値が0である場合、P個の共有カウンタはそれぞれ、処理ソートインデックスが生成された、P個のLUNを指すIO記述情報の数を記録する。
IOリクエストソートプログラムを実行する各コアについては、各LUNのためにプライベートカウンタが維持される。コアのP個のプライベートカウンタは、コア上で実行するIOリクエストソートプログラムのみによって読み出す/書き込むことができる。コアのすべてのプライベートカウンタの初期値は同一である。LUN 1を指すIO記述情報の処理ソートインデックスを生成した後に、コア2上で実行するIOリクエストソートプログラムは、LUN 1の共有カウンタの値を使用することによって、LUN 1に対応する、コア2のプライベートカウンタの値を更新する、すなわち、LUN 1の共有カウンタの値を、LUN 1に対応する、コア2のプライベートカウンタにコピーする。したがって、コア2上で実行するIOリクエストソートプログラムが、LUN aを指すIO記述情報の処理ソートインデックスを計算するたびに、プライベートカウンタb−aの値は、コア2上で実行するIOリクエストソートプログラムが、LUN aを指す、以前のIO記述情報の処理ソートインデックスを計算した後の共有カウンタaの値に等しい。
共有カウンタaは、LUN aを指す共有カウンタを示す。プライベートカウンタb−cは、LUN cに対応する、コアb上で実行するIOリクエストソートプログラムのプライベートカウンタを示す。実際には、共有カウンタおよびプライベートカウンタは、複数の方式で実装され得る。例えば、各プライベートカウンタは、プライベートカウンタが属するIOリクエストソートプログラムが位置するコアの空間において設定され得る、または、コアの空間におけるプライベートカウンタは、テーブルに組み合わされ得て、テーブルは、メモリデバイスのストレージ空間において設定される。IOリクエストソートプログラムは、IOリクエストソートプログラムのプライベートカウンタに対応する、テーブルにおける領域のみにアクセスできる。別の例については、すべての共有カウンタはまた、テーブルに組み合わされ得て、テーブルは、メモリデバイスのストレージ空間において設定される。各IOリクエストソートプログラムはテーブルにアクセスできる。すべての共有カウンタおよびプライベートカウンタは、ストレージコントローラがIO記述情報の分配を開始する前に、オペレーティングシステムによって確立される。
したがって、方式1が使用されるとき、LUN 1の累積インデックス数を取得することは、以下のステップを含む。
1.1.共有カウンタ1の値、および、プライベートカウンタ2−1の値を取得し、2つの値の間の差を計算する。ここで、当該差は、LUN 1の累積インデックス数である。
1.2.共有カウンタ1の値を1増加させる。
1.3.共有カウンタ1の値を使用することによって、プライベートカウンタ2−1を更新する。
例えば、プロセッサは、3つのソートコアを含む。図7−1は、初期状態を示し、共有カウンタ1、共有カウンタ2および各プライベートカウンタの初期値は、すべて0である。図7−1において、IO記述情報a‐b‐cは、コアaに分配される、LUN bを指すc番目のIO記述情報を示す。LUN 1を指すIO記述情報の最初の処理ソートインデックス、および、LUN 2を指すIO記述情報の最初の処理ソートインデックスは、両方とも0である。LUN 1のIOPSパラメータは1000であり、LUN 2のIOPSパラメータは500である。
時点T1において、コア2上で実行するIOリクエストソートプログラムは、IO記述情報2−1−1のために処理ソートインデックスを計算する。その後、図7−2に示されるように、共有カウンタ1の値は1増加され、プライベートカウンタ2−1の値は、共有カウンタ1の値を使用することによって更新される。
時点T2において、コア3上で実行するIOリクエストソートプログラムは、IO記述情報3−1−1のために処理ソートインデックスを計算する。その後、図7−3に示されるように、共有カウンタ1の値は1増加され、プライベートカウンタ3−1の値は、共有カウンタ1の値を使用することによって更新される。
時点T3において、コア4上で実行するIOリクエストソートプログラムは、IO記述情報4−1−1のために処理ソートインデックスを計算する。その後、共有カウンタ1の値は1増加され、プライベートカウンタ4−1の値は、共有カウンタ1の値を使用することによって更新される。
時点T4において、コア4上で実行するIOリクエストソートプログラムが、IO記述情報4−2−1のために処理ソートインデックスを計算する。その後、図7−4に示されるように、共有カウンタ2の値は1増加され、プライベートカウンタ4−2の値は、共有カウンタ2の値を使用することによって更新される。
時点T5において、コア2上で実行するIOリクエストソートプログラムは、IO記述情報2−1−2のために処理ソートインデックスを計算する。その後、共有カウンタ1の値は1増加され、プライベートカウンタ2−1の値は、共有カウンタ1の値を使用することによって更新される。
時点T6において、コア2上で実行するIOリクエストソートプログラムは、IO記述情報2−2−1のために処理ソートインデックスを計算する。その後、図7−5に示されるように、共有カウンタ2の値は1増加され、プライベートカウンタ2−2の値は、共有カウンタ2の値を使用することによって更新される。
その後、残りのIO記述情報のために処理ソートインデックスを生成するプロセスは、類推によって推定される。
図7−1から図7−5に対応する例において、処理ソートインデックスの生成のプロセスに対するシステム時間の影響は考慮されない。
[方式2]
IOリクエストソートプログラムを実行するコアは、各LUNのために2つのプライベートカウンタを維持する。プライベートカウンタA‐B‐1は、LUN Bに対応する、コアAの第1のプライベートカウンタを示し、プライベートカウンタA‐B‐2は、LUN Bに対応する、コアAの第2のプライベートカウンタを示す。コアの2×P個のプライベートカウンタは、コア上で実行するIOリクエストソートプログラムのみによって書き込むことができ、コアのP個の第1のプライベートカウンタは、任意のIOリクエストソートプログラムによって読み出すことができる。コアのすべてのプライベートカウンタの初期値は同一である。LUN Bを指すIO記述情報の処理ソートインデックスを生成した後に、コアA上で実行するIOリクエストソートプログラムは、プライベートカウンタA‐B‐1の値を1増加させ、次に、IOリクエストソートプログラムのLUN Bについての第1のプライベートカウンタの和を使用することによってプライベートカウンタA‐B‐2を更新する。
プライベートカウンタは複数の方式で実装され得る。例えば、各プライベートカウンタは、プライベートカウンタが属するIOリクエストソートプログラムが位置するコアの空間において設定され得る、または、コアの空間におけるプライベートカウンタは、テーブルに組み合わされ、テーブルは、メモリデバイスのストレージ空間において設定される。すべてのプライベートカウンタは、ストレージコントローラがIO記述情報の分配を開始する前に、オペレーティングシステムによって確立される。
したがって、方式2が使用されるとき、LUN 1の累積インデックス数を取得することは、以下のステップを含む。
2.1.コア上で実行するIOリクエストソートプログラムのLUN 1についての第1のプライベートカウンタの値を取得し、コア上で実行するIOリクエストソートプログラムのLUN 1についての第1のプライベートカウンタの値の和を求める。
2.2.和の結果と、コア2上で実行するIOリクエストソートプログラムのLUN 1についての第2のプライベートカウンタとの間の差を計算する。ここで、当該差は、LUN 1の累積インデックス数である。
2.3.プライベートカウンタ2−1−1の値を1増加させる。
2.4.LUN 1に対応する、コアの第1のプライベートカウンタの値の和を使用することによって、プライベートカウンタ2−1−2を更新する。
2.4において、代替的に、2.1において取得された和の結果に1を加算することによって取得される値が、プライベートカウンタ2−1−2を更新するために使用され得る。
例えば、プロセッサは3つのソートコアを含む。例えば、図8−1は、初期状態を示し、すべてのプライベートカウンタの初期値は0である。LUN 1を指すIO記述情報の最初の処理ソートインデックス、および、LUN 2を指すIO記述情報の最初の処理ソートインデックスは、両方とも0である。LUN 1のIOPSパラメータは1000であり、LUN 2のIOPSパラメータは500である。
時点T1において、コア2上で実行するIOリクエストソートプログラムは、IO記述情報2−1−1のために処理ソートインデックスを計算する。その後、図8−2に示されるように、プライベートカウンタ2−1−1の値は1増加され、プライベートカウンタ2−1−2の値は更新される。
時点T2において、コア3上で実行するIOリクエストソートプログラムは、IO記述情報3−1−1のために処理ソートインデックスを計算する。その後、図8−3に示されるように、プライベートカウンタ3−1−1の値は1増加され、プライベートカウンタ3−1−2の値は更新される。
時点T3において、コア4上で実行するIOリクエストソートプログラムは、IO記述情報4−1−1のために処理ソートインデックスを計算する。その後、プライベートカウンタ4−1−1の値は1増加され、プライベートカウンタ4−1−2の値は更新される。
時点T4において、コア4上で実行するIOリクエストソートプログラムは、IO記述情報4−2−1のために処理ソートインデックスを計算する。その後、図8−4に示されるように、プライベートカウンタ4−2−1の値は1増加され、プライベートカウンタ4−2−2の値は更新される。
時点T5において、コア2上で実行するIOリクエストソートプログラムは、IO記述情報2−1−2のために処理ソートインデックスを計算する。その後、プライベートカウンタ2−1−1の値は1増加され、プライベートカウンタ2−1−2の値は更新される。
時点T6において、コア2上で実行するIOリクエストソートプログラムは、IO記述情報2−2−1のために処理ソートインデックスを計算する。その後、図8−5に示されるように、プライベートカウンタ2−2−1の値は1増加され、プライベートカウンタ2−2−2の値は更新される。
その後、残りのIO記述情報のために処理ソートインデックスを生成するプロセスは、類推によって推定される。
図8−1から図8−5に対応する例において、処理ソートインデックスの生成のプロセスに対するシステム時間の影響は考慮されない。
図2Aおよび図2Bに示されるように、本願に適用されるストレージコントローラは、バス、プロセッサ、メモリデバイスおよび通信インタフェースを含む。プロセッサ、メモリデバイスおよび通信インタフェースは、バスを使用して通信する。
メモリデバイスは、揮発性メモリ(英語:volatile memory)、例えば、ランダムアクセスメモリ(英語:random access memory、略称:RAM)を含み得る。
通信インタフェースは、クライアントによって送信されるIOリクエストおよびアクセスストレージ媒体を取得するようそれぞれ構成される、ネットワークインタフェースおよびストレージ媒体アクセスインタフェースを含む。
メモリデバイスは、IOリクエスト分配プログラム、IOリクエストソートプログラム、IOリクエスト処理プログラム、および、オペレーティングシステムを実行するために必要なコードを記憶する。ストレージコントローラが実行するとき、プロセッサにおける各コアは、上で提供されるIOリクエスト処理方法を実行するために、メモリデバイスに記憶されたコードを呼び出す。
上述の実施形態では、各実施形態の説明はそれぞれの焦点を有する。実施形態において詳細に説明されない部分については、他の実施形態における関連する説明を参照されたい。
本願における開示された内容と併せて説明される方法は、プロセッサによってソフトウェア命令を実行する方式で実装され得る。ソフトウェア命令は、対応するソフトウェアモジュールを含み得る。ソフトウェアモジュールは、RAM、フラッシュメモリ、ROM、消去可能プログラム可能リードオンリメモリ(英語:erasable programmable read only memory、略称:EPROM)、電気的消去可能プログラム可能リードオンリメモリ(英語:electrically erasable programmable read only memory、略称:EEPROM)、HDD、SSD、光学ディスク、または、当該技術分野において既知の任意の他の形態のうちのストレージ媒体に記憶され得る。
当業者であれば、上述の1または複数の例において、本願において説明される機能が、ハードウェアまたはソフトウェアによって実装され得ることを認識するはずである。本発明がソフトウェアによって実装されるとき、上述の機能は、コンピュータ可読媒体に記憶されるか、または、コンピュータ可読媒体における1または複数の命令もしくはコードとして伝送されてよい。当該ストレージ媒体は、汎用コンピュータまたは専用コンピュータがアクセス可能な任意の利用可能な媒体であってよい。
本願の目的、技術的解決法、および利点は更に、上述の具体的な実施形態において詳細に説明される。上述の説明は、本願の具体的な実施形態に過ぎず、本願の保護範囲を限定することを意図するものではないことを理解すべきである。本発明の思想および原理の範囲において行われる任意の修正または改善は、本願の保護範囲内に属するものとする。
本願は、ストレージ技術の分野に関し、特に、ストレージコントローラ、および、ストレージコントローラによって実行される入出力(英文全表記:input output、略称:IO)リクエスト処理方法に関する。
図1に示されるように、ストレージアレイは通常、大規模ストレージシナリオにおいて使用され、複数のストレージ媒体およびストレージコントローラを含む。ストレージ媒体は、ハードディスクドライブ(英文全表記:hard disk drive、略称:HDD)およびソリッドステートドライブ(英文全表記:solid state drive、略称:SSD)を含み得る。クライアントは、通信ネットワークを使用することによって、IOリクエストをストレージコントローラへ送信する。ストレージコントローラは、受信されたIOリクエストを処理する。例えば、IOリクエストが読出しリクエストであるとき、ストレージコントローラは、読出しリクエストが指す特定のストレージ媒体を決定し、次に、ストレージコントローラは、読出しリクエストが指す当該ストレージ媒体から対応するデータを読出し、データをクライアントへ返す。
ストレージコントローラは、ストレージアレイのストレージ媒体を複数のストレージユニットに仮想化する。ストレージコントローラによって受信されるIOリクエストは通常、ストレージユニットを指す。異なるストレージの種類が使用されるとき、ストレージコントローラは、複数のストレージ媒体を異なる種類のストレージユニット(英語:storage unit)に仮想化する。例えば、ブロックストレージが使用されるとき、ストレージコントローラは、複数のストレージ媒体を1または複数の論理ユニット番号(英文全表記:logical unit number、略称:LUN)に仮想化し、クライアントの各IOリクエストは、あるLUNを指す。ファイルストレージが使用されるとき、クライアントの各IOリクエストは、ファイルシステムを指す。オブジェクト(英語:object)ストレージが使用されるとき、クライアントの各IOリクエストは、バケット(英語:bucket)を指す。
サービス要求上の理由から、ユーザは通常、異なるストレージユニットのために、IO毎秒(英語:input output per second、略称:IOPS)パラメータを設定する必要がある。クライアントによって送信されたIOリクエストの数が比較的大きく、かつ、IOリクエストが異なるストレージユニットを指す場合、ストレージコントローラがIOリクエストを処理する速度は限定されているので、ストレージコントローラは、受信されたIOリクエストをスケジューリングする必要があり、それにより、可能な限り、複数のストレージユニットのQOSパラメータを満たす。
既存のIOリクエストスケジューリング方法におけるIOPSパラメータ充足率は比較的低い。
本願は、ストレージコントローラを提供し、それにより、IOPSパラメータ充足率を増加させる。
本願の第1の態様はストレージコントローラを提供し、ストレージコントローラは、複数のストレージユニットを有するストレージシステムに適用可能であり、ストレージコントローラは、メモリデバイスおよび複数のプロセッサコアを含み、複数のプロセッサコアは、少なくとも1つの分配コア、複数のソートコア、および、少なくとも1つのリクエスト処理コアを含む。
分配コアは、動作しているとき、メモリデバイスに記憶されるコードを実行し、それにより、メモリデバイスに記憶されたIOリクエストを受信し、受信されたIOリクエストを複数のソートコアへ分配する。
各ソートコアは、動作しているとき、メモリデバイスに記憶されたコードを実行して、以下の動作、すなわち、分配コアによって分配された、処理ソートインデックスが生成される予定のIOリクエストを取得する動作と、処理ソートインデックスが生成される予定のIOリクエストが指す目標ストレージユニットを決定する動作と、目標ストレージユニットの累積インデックス数を取得する動作であって、目標ストレージユニットの累積インデックス数は、以前に分配されたIOリクエストのために各ソートコアが処理ソートインデックスを生成して以来、複数のソートコアが処理ソートインデックスを生成した、目標ストレージユニットを指すIOリクエストの数を示し、以前に分配されたIOリクエストは、目標ストレージユニットを指す、動作と、以前に分配されたIOリクエストの処理ソートインデックス、および、目標ストレージユニットの累積インデックス数と目標ストレージユニットのIO毎秒パラメータとの比に従って、処理ソートインデックスが生成される予定のIOリクエストのために処理ソートインデックスを生成する動作と、処理ソートインデックスが生成される予定のIOリクエストの処理ソートインデックスを、各ソートコアに対応するインデックスキューに記憶する動作であって、各ソートコアに対応するインデックスキューはメモリデバイスに記憶され、複数のストレージユニットを指すIOリクエストのために各ソートコアによって生成された処理ソートインデックスを含む、動作とを実行する。
動作しているとき、各ソートコアに対応するインデックスキューにおける最小処理ソートインデックスに対応するIOリクエストを周期的に処理するために、リクエスト処理コアは、メモリデバイスに記憶されたコードを実行する。
分配コア、複数のソートコア、および、リクエスト処理コアは同時に動作し得る。
複数のソートコアは、各IOリクエストのために処理ソートインデックスを生成し、各IOリクエストの処理ソートインデックスの値に従って処理順序を決定し、その結果、IOPSパラメータ充足率が効率的に増加される。
本願の任意の態様、または、任意の態様の任意の実装において言及される各ソートコアは、複数のソートコアのうちいずれか1つを表す。
任意で、本願の任意の態様、または、任意の態様の任意の実装において言及される、処理ソートインデックスが生成される予定のIOリクエストは、以前に分配されたIOリクエストの後の各ソートコアに分配される次のIOリクエストである。
第1の態様に関連して、第1の態様の第1の実装において、各ソートコアは、目標ストレージユニットの累積インデックス数を取得するために、複数のソートコアが処理ソートインデックスを生成した、目標ストレージユニットを指すIOリクエストの現在の合計数を、目標ストレージユニットのための共有カウンタから取得するという操作を実行する。メモリデバイスにおいて、各ストレージユニットのために共有カウンタが設定される。
その後、複数のソートコアが以前に分配されたIOリクエストのために処理ソートインデックスを生成するとき、複数のソートコアが処理ソートインデックスを生成した、目標ストレージユニットを指すIOリクエストの以前の合計数が、目標ストレージユニットに対応する、各ソートコアのプライベートカウンタから取得される。各ストレージユニットに対応するプライベートカウンタが、メモリデバイスにおける各ソートコアのために設定される。
その後、IOリクエストの現在の合計数と、IOリクエストの以前の合計数との間の差を目標ストレージユニットの累積インデックス数として使用するために当該差が計算される。その後、目標ストレージユニットの共有カウンタの値が1増加され、次に、目標ストレージユニットに対応する、各ソートコアのプライベートカウンタが、目標ストレージユニットの共有カウンタの値を使用することによって更新される。
本態様において提供されるストレージコントローラにおいて、目標ストレージユニットの累積インデックス数を取得するとき、各ソートコアは、別のソートコアによる、IOリクエストのための処理ソートインデックスの生成の状況を取得するために、別のソートコアにアクセスする必要は無く、その結果、スケジューリング効率が改善される。
第1の態様に関連して、第1の態様の第2の実装において、各ソートコアは、目標ストレージユニットの累積インデックス数を取得するために、目標ストレージユニットに対応する、複数のソートコアの第1のプライベートカウンタから複数のプライベート数を取得する操作を実行し、ここで、各ソートコアのプライベート数は、各ソートコアが処理ソートインデックスを生成した、目標ストレージユニットを指すIOリクエストの数を示す。
本願の任意の態様、または、任意の態様の任意の実装において言及される各ソートコアは、複数のソートコアのいずれか1つを表す。
その後、処理ソートインデックスが生成された、目標ストレージユニットを指すIOリクエストの現在の大域的数を取得するために、複数のプライベート数の和が求められる。
その後、複数のソートコアが以前に分配されたIOリクエストのために処理ソートインデックスを生成するとき、複数のソートコアが処理ソートインデックスを生成した、目標ストレージユニットを指すIOリクエストの以前の大域的数が、目標ストレージユニットに対応する、各ソートコアの第2のプライベートカウンタから取得される。各ストレージユニットに対応する第1のプライベートカウンタおよび第2のプライベートカウンタが、メモリデバイスにおける各ソートコアに設定される。
その後、IOリクエストの現在の大域的数と、IOリクエストの以前の大域的数との間の差を目標ストレージユニットの累積インデックス数として使用するために当該差が計算される。
その後、目標ストレージユニットに対応する、各ソートコアの第1のプライベートカウンタの値が1増加され、複数のソートコアの現在のプライベート数の和を使用することによって、目標ストレージユニットに対応する、各ソートコアの第2のプライベートカウンタが更新される。第2のプライベートカウンタが更新される前に、目標ストレージユニットに対応する、各ソートコアの第1のプライベートカウンタの値は1増加される。したがって、各ソートコアは、複数のソートコアの現在のプライベート数の和を取得するために、IOリクエストの現在の大域的数を1増加させる。本態様において提供されるストレージコントローラにおいて、目標ストレージユニットの累積インデックス数を取得するとき、各ソートコアは、別のソートコアによる、IOリクエストのための処理ソートインデックスの生成の状況を取得するために、別のソートコアにアクセスする必要は無く、その結果、スケジューリング効率が改善される。
第1の態様、第1の態様の第1の実装、または、第1の態様の第2の実装に関連して、第1の態様の第3の実装において、各ソートコアは、以下の操作、すなわち、処理ソートインデックスが生成される予定のIOリクエストのために処理ソートインデックスを生成する操作と、現在のシステム時間を取得する操作と、その後、処理ソートインデックスを生成する予定のIOリクエストの処理ソートインデックスとして、目標ストレージユニットの累積インデックス数と目標ストレージユニットのIO毎秒パラメータとの比と、以前に分配されたIOリクエストの処理ソートインデックスとの和、および、現在のシステム時間のうちのより大きい方を使用する操作とを実行する。
すなわち、処理ソートインデックスが生成される予定のIOリクエストの処理ソートインデックス=Max{以前に分配されたIOリクエストの処理ソートインデックス+K×目標ストレージユニットの累積インデックス数/目標ストレージユニットのIO毎秒パラメータ,現在のシステム時間}である。
システム時間は、処理ソートインデックスの計算において考慮され、その結果、IOリクエストスケジューリング精度が改善される。
第1の態様、第1の態様の第1の実装、第1の態様の第2の実装、または、第1の態様の第3の実装に関連して、第1の態様の第4の実装において、各ソートコアは更に、処理ソートインデックスが生成される予定のIOリクエストのために処理ソートインデックスが生成された後の時点において、各ソートコアに分配される、目標ストレージユニットを指す、インデックスが生成されていないIOリクエストが無いと決定し、このケースでは、処理ソートインデックスが生成される予定のIOリクエストの処理ソートインデックスと、当該時点の目標ストレージユニットの累積インデックス数と目標ストレージユニットのIO毎秒パラメータとの比との和を計算して、当該和を処理ソート待ちインデックスとして使用するよう、および、各ソートコアに対応するインデックスキューに処理ソート待ちインデックスを記憶するよう構成される。
すなわち、処理ソート待ちインデックス=以前分配されたIOリクエストの処理ソートインデックス+K×当該時点の目標ストレージユニットの累積インデックス数/目標ストレージユニットのIO毎秒パラメータである。
当該時点の目標ストレージユニットの累積インデックス数は、当該時点の前に、各ソートコアが、目標ストレージユニットを指す最後の処理ソートインデックスを生成して以来、複数のソートコアが処理ソートインデックスを生成した、目標ストレージユニットを指すIOリクエストの数を示す。
各ソートコアの実行プロセスでは、インデックスが生成されていない、各ソートコアに分配されたIOリクエストにおいて、目標ストレージユニットを指すIOリクエストが無いと、処理ソート待ちインデックスが生成される。
第1の態様の第4の実装に関連して、第1の態様の第5の実装において、各ソートコアに対応するインデックスキューに処理ソート待ちインデックスが存在する期間の間に、処理ソート待ちインデックスより大きい、各ソートコアに対応するインデックスキューに含まれる処理ソートインデックスに対応するIOリクエストは、リクエスト処理コアによって処理することができず、各ソートコアは更に、当該時点の後に、目標ストレージユニットを指すIOリクエストが各ソートコアに分配されるとき、または、処理ソート待ちインデックスが存在する時間が予め設定された閾値を超えるとき、各ソートコアに対応するインデックスキューから処理ソート待ちインデックスを消去するよう構成される。
処理ソート待ちインデックスを使用することにより、IOリクエストスケジューリング精度を改善できる。
第1の態様または第1の態様の実装のいずれか1つに関連して、第1の態様の第6の実装において、リクエスト処理コアは、各ソートコアに対応するインデックスキューにおける最小処理ソートインデックスに対応するIOリクエストを周期的に処理するために、各ソートコアに対応するインデックスキューに周期的にアクセスする操作と、各アクセスにおいて、各ソートコアに対応するインデックスキューにおける最小処理ソートインデックスに対応するIOリクエストを処理する操作とを実行する。
本願の第2の態様は、IOリクエスト処理方法を提供し、第1の態様において提供されるストレージコントローラは、実行されるときに、当該方法を実行する。当該方法は、分配コアが、IOリクエストを受信し、受信されたIOリクエストを複数のソートコアに分配する段階と、各ソートコアが、分配コアによって分配される、処理ソートインデックスが生成される予定のIOリクエストを取得する段階と、各ソートコアが、処理ソートインデックスが生成される予定のIOリクエストが指す目標ストレージユニットを決定する段階と、各ソートコアが、目標ストレージユニットの累積インデックス数を取得する段階であって、目標ストレージユニットの累積インデックス数は、各ソートコアが、以前に分配されたIOリクエストのために処理ソートインデックスを生成して以来、複数のソートコアが処理ソートインデックスを生成した、目標ストレージユニットを指すIOリクエストの数を示し、以前に分配されたIOリクエストは、目標ストレージユニットを指す、段階と、各ソートコアが、以前に分配されたIOリクエストの処理ソートインデックス、および、目標ストレージユニットの累積インデックス数と目標ストレージユニットのIO毎秒パラメータとの比に従って、処理ソートインデックスが生成される予定のIOリクエストのために処理ソートインデックスを生成する段階と、各ソートコアが、処理ソートインデックスが生成される予定のIOリクエストの処理ソートインデックスを各ソートコアに対応するインデックスキューに記憶する段階であって、各ソートコアに対応するインデックスキューは、メモリデバイスに記憶され、複数のストレージユニットを指すIOリクエストのために、各ソートコアによって生成される処理ソートインデックスを含む、段階と、リクエスト処理コアが、各ソートコアに対応するインデックスキューにおける最小処理ソートインデックスに対応するIOリクエストを周期的に処理する段階とを備える。
第2の態様に関連して、第2の態様の第1の実装において、各ソートコアが、目標ストレージユニットの累積インデックス数を取得する段階は、各ソートコアが、複数のソートコアが処理ソートインデックスを生成した、目標ストレージユニットを指すIOリクエストの現在の合計数を、目標ストレージユニットのための共有カウンタから取得する段階と、各ソートコアが、複数のソートコアが以前に分配されたIOリクエストのために処理ソートインデックスを生成するときの、複数のソートコアが処理ソートインデックスを生成した、目標ストレージユニットを指すIOリクエストの以前の合計数を、目標ストレージユニットに対応する、各ソートコアのプライベートカウンタから取得する段階と、各ソートコアが、IOリクエストの現在の合計数と、IOリクエストの以前の合計数との間の差を目標ストレージユニットの累積インデックス数として使用するために、差を計算する段階と、各ソートコアが、目標ストレージユニットのための共有カウンタの値を1増加させる段階と、各ソートコアが、目標ストレージユニットのための共有カウンタの値を使用することによって、目標ストレージユニットに対応する、各ソートコアのプライベートカウンタを更新する段階とを備える。
第2の態様に関連して、第2の態様の第2の実装において、各ソートコアが、目標ストレージユニットの累積インデックス数を取得する段階は、各ソートコアが、目標ストレージユニットに対応する、複数のソートコアの第1のプライベートカウンタから複数のプライベート数を取得する段階であって、各ソートコアのプライベート数は、各ソートコアが処理ソートインデックスを生成した、目標ストレージユニットを指すIOリクエストの数を示す、段階と、各ソートコアが、処理ソートインデックスが生成された、目標ストレージユニットを指すIOリクエストの現在の大域的数を取得するために、複数のプライベート数の和を求める段階と、各ソートコアが、複数のソートコアが以前に分配されたIOリクエストのために処理ソートインデックスを生成するときの、複数のソートコアが処理ソートインデックスを生成した、目標ストレージユニットを指すIOリクエストの以前の大域的数を、目標ストレージユニットに対応する、各ソートコアの第2のプライベートカウンタから取得する段階と、各ソートコアが、IOリクエストの現在の大域的数と、IOリクエストの以前の大域的数との間の差を目標ストレージユニットの累積インデックス数として使用するために差を計算する段階と、各ソートコアが、目標ストレージユニットに対応する、各ソートコアの第1のプライベートカウンタの値を1増加させる段階と、各ソートコアが、複数のソートコアの現在のプライベート数の和を使用することによって、目標ストレージユニットに対応する、各ソートコアの第2のプライベートカウンタを更新する段階とを含む。
第2の態様、第2の態様の第1の実装、または、第2の態様の第2の実装に関連して、第2の態様の第3の実装において、各ソートコアが、処理ソートインデックスが生成される予定のIOリクエストのために処理ソートインデックスを生成する段階は、各ソートコアが、現在のシステム時間を取得する段階と、各ソートコアが、目標ストレージユニットの累積インデックス数と目標ストレージユニットのIO毎秒パラメータとの比と以前に分配されたIOリクエストの処理ソートインデックスとの和、および、現在のシステム時間のうちのより大きい方を、処理ソートインデックスが生成される予定のIOリクエストの処理ソートインデックスとして使用する段階とを含む。
第2の態様、第2の態様の第1の実装、第2の態様の第2の実装、または、第2の態様の第3の実装に関連して、第2の態様の第4の実装において、方法は更に、処理ソートインデックスが生成される予定のIOリクエストのために処理ソートインデックスが生成された後の時点において、各ソートコアが、各ソートコアに分配された、目標ストレージユニットを指す、インデックスが生成されていないIOリクエストが無いと決定する段階と、各ソートコアが、当該時点における目標ストレージユニットの累積インデックス数を取得する段階であって、当該時点における目標ストレージユニットの累積インデックス数は、当該時点の前に、各ソートコアが目標ストレージユニットを指す最後の処理ソートインデックスを生成して以来、複数のソートコアが処理ソートインデックスを生成した、目標ストレージユニットを指すIOリクエストの数を示す、段階と、その後、各ソートコアが、当該時点における目標ストレージユニットの累積インデックス数と目標ストレージユニットのIO毎秒パラメータとの比と処理ソートインデックスが生成される予定のIOリクエストの処理ソートインデックスとの和を処理ソート待ちインデックスとして使用するために和を計算する段階と、その後、各ソートコアが、処理ソート待ちインデックスを各ソートコアに対応するインデックスキューに記憶する段階とを備える。
第2の態様の第4の実装に関連して、第2の態様の第5の実装において、各ソートコアに対応するインデックスキューに処理ソート待ちインデックスが存在する期間の間に、処理ソート待ちインデックスより大きい、各ソートコアに対応するインデックスキューに含まれる処理ソートインデックスに対応するIOリクエストは、リクエスト処理コアによって処理できず、方法は更に、当該時点の後に、目標ストレージユニットを指すIOリクエストが各ソートコアに分配されるとき、または、処理ソート待ちインデックスが存在する時間が予め設定された閾値を超えるとき、各ソートコアが、各ソートコアに対応するインデックスキューから処理ソート待ちインデックスを消去する段階を備える。
第2の態様または第2の態様の実装のいずれか1つに関連して、第2の態様の第6の実装において、リクエスト処理コアが、各ソートコアに対応するインデックスキューにおける最小処理ソートインデックスに対応するIOリクエストを周期的に処理する段階は、リクエスト処理コアが、各ソートコアに対応するインデックスキューに周期的にアクセスする段階と、各アクセスにおいて、リクエスト処理コアによって、各ソートコアに対応するインデックスキューにおける最小処理ソートインデックスに対応するIOリクエストを処理する段階とを含む。
本願の第3の態様はストレージ媒体を提供し、ストレージ媒体はプログラムを記憶し、プログラムがコンピューティングデバイス上で実行するとき、コンピューティングデバイスは、第2の態様または第2の態様の実装のいずれか1つにおいて提供されるIOリクエスト処理方法を実行する。ストレージ媒体は、これらに限定されないが、リードオンリメモリ、ランダムアクセスメモリ、フラッシュメモリ、HDDまたはSSDを含む。
本願の第4の態様は、コンピュータプログラムプロダクトを提供し、当該コンピュータプログラムプロダクトは、プログラム命令を含み、当該コンピュータプログラムプロダクトがストレージコントローラによって実行されるとき、ストレージコントローラは、第2の態様または第2の態様の実装のいずれか1つにおいて提供されるIOリクエスト処理方法を実行する。コンピュータプログラムプロダクトは、ソフトウェアインストールパッケージであり得て、第2の態様または第2の態様の実装のいずれか1つにおいて提供されるIOリクエスト処理方法を使用する必要があるとき、コンピュータプログラムプロダクトがダウンロードされ得て、コンピュータプログラムプロダクトはストレージコントローラ上で実行され得る。
本願の実施形態に係るストレージシステムの組織構造の概略図である。
ストレージコントローラの組織構造の概略図である。
ストレージコントローラの組織構造の概略図である。
ストレージコントローラのメモリデバイスの組織構造の概略図である。
ストレージコントローラのメモリデバイスの組織構造の概略図である。
処理ソートインデックスを生成するプロセスの概略図である。
処理ソートインデックスを生成するプロセスの概略図である。
処理ソートインデックスを生成するプロセスの概略図である。
処理ソートインデックスを生成するプロセスの概略図である。
処理ソートインデックスを生成するプロセスの概略図である。
処理ソートインデックスを生成するプロセスの概略図である。
処理ソートインデックスを生成するプロセスの概略図である。
処理ソートインデックスを生成するプロセスの概略図である。
処理ソートインデックスを生成するプロセスの概略図である。
処理ソートインデックスを生成するプロセスの概略図である。
処理ソートインデックスを生成するプロセスの概略図である。
処理ソートインデックスを生成するプロセスの概略図である。
処理ソートインデックスを生成するプロセスの概略図である。
以下では、本願の実施形態における添付図面を参照して、本願の実施形態における技術的解決法を説明する。
本願では、「第1」、「第2」および「第n」の間には論理的または時間的な順序の依存関係は無い。
本明細書において、プロセッサは、1または複数の中央処理装置(英文全表記:central processing unit、略称:CPU)を含み、各中央処理装置は、1または複数のコア(英語:core)を含む。
本明細書において、ストレージユニットは、LUN、ファイルシステムまたはバケットであり得る。LUN、ファイルシステムまたはバケットはそれぞれ、ストレージアレイがブロックストレージ、ファイルストレージまたはオブジェクトストレージを使用する場合に対応する。例えば、本明細書におけるストレージアレイは、P個のLUNをクライアントに提示し、Pは1より大きい正の整数である。
本明細書において、IOリクエストは、IOデータおよびメタデータを含む。IOデータは、IOリクエストの操作予定データ、および、操作予定データのアドレスなどの情報を含む。メタデータは、IOリクエストが指すストレージユニットIDを含む。ストレージユニットIDは、LUN ID、ファイルシステムID、または、バケットIDであり得る。
本明細書において、関数Max{x,y}の機能は、xおよびyのうちのより大きい値を返すことである。
本明細書において、IOPSパラメータは、ストレージユニットのIOPS、または、ストレージユニットのIOPS処理の重みであり得る。IOPS処理の重みは、各ストレージユニットを指すIOリクエストを処理するためにストレージアレイによって使用されるリソースの割合を表す。したがって、IOPSパラメータは、サービス要求に従ってユーザによって設定され得る。例えば、ユーザは、サービス要求に従って、サービスに関するストレージユニットの最低IOPSを決定する、または、ユーザは、サービスに関するストレージユニットのIOPSによって占有される必要がある、ストレージアレイのリソースの重みを決定する。代替的に、IOPSパラメータは、ユーザクラスに従って設定され得る。例えば、上級ユーザのエクスペリエンスを保証するために、上級ユーザのIOPSパラメータは比較的高い。ストレージコントローラは、複数の異なるストレージユニットのIOPSパラメータを記憶する。
[本願の実施形態に適用されるストレージコントローラのアーキテクチャ]
図2Aおよび図2Bに示されるように、ストレージコントローラは通常、複数のコア、メモリデバイスおよび通信インタフェースを含む。各コアは、メモリデバイスとの通信接続を確立する。ストレージコントローラは、通信インタフェースを使用することによってクライアントおよびストレージ媒体と通信する。通信インタフェースから取得されたIOリクエストはメモリデバイスのIOストレージ空間に記憶される。
IOリクエストのスケジューリングおよび処理のプロセスにおいて役割を果たす主な3種類のプログラムがあり、それらは、IOリクエスト分配プログラム、IOリクエストソートプログラム、および、IOリクエスト処理プログラムである。IOリクエスト分配プログラム、IOリクエストソートプログラムおよびIOリクエスト処理プログラムは各々、コアがメモリデバイスにおけるコードを実行することによって実装される。IOリクエスト分配プログラムを実行するコアは、分配コアと称される。IOリクエストソートプログラムを実行するコアは、ソートコアと称される。IOリクエスト処理プログラムを実行するコアは、リクエスト処理コアと称される。
3種類のプログラムの各々に割り当てられる予定のコアの数は、3種類のプログラムの実行圧力(running pressure)に従って決定され得る。また、各プログラムが実行される特定のコアについては、プログラムは、各コアの負荷状況に従って移動させられ得る。図2Aおよび図2Bにおいて、例えば、コア1は、IOリクエスト分配プログラムを実行するよう構成され、コア2からコアnは、IOリクエストソートプログラムを実行するよう構成され、コアn+1からコアn+mは、IOリクエスト処理プログラムを実行するよう構成され、コアn+m+1は、ストレージコントローラのオペレーティングシステムを実行するよう構成される。
IOリクエスト分配プログラムは、IOストレージ空間におけるIOリクエストを分配する、すなわち、IOリクエストソートプログラムを実行する各コアのサブ空間にIOリクエストを分配する。図2Aおよび図2Bにおいて、例えば、コア2からコアnのサブ空間は、コア1の空間に位置する。実際には、代替的に、コア2からコアnのサブ空間は、コア1の空間の外側に位置し得る、または、各コアのそれぞれの空間内に位置し得る。
IOリクエスト分配プログラムがIOリクエストを分配するプロセスにおいて、各IOリクエストソートプログラムのその後の負荷分散が主に考慮されるが、LUNを指すすべてのIOリクエストをコアの空間に分配することは考慮されない。例えば、IOリクエスト分配プログラムは、複数の受信されたIOリクエストをIOリクエストソートプログラムへ1つずつ分配し得て、それにより、IOリクエストソートプログラムへ分配されるIOリクエストの数が同一であることを保証する。
その後、各IOリクエストソートプログラムは、IOリクエストソートプログラムに分配されたIOリクエストを読出し、IOリクエストをソートする。ソート結果は、各IOリクエストソートプログラムが位置するコアの空間におけるインデックスキューに記憶される。インデックスキューは、パイル(英語:pile)または先入先出キューなどの複数の異なるデータ構造を使用することによって実装され得る。各IOリクエストソートプログラムは、IOリクエストソートプログラムのためのサブ空間における各IOリクエストのために処理ソートインデックスを生成し、次に、IOリクエストソートプログラムのためのインデックスキューにおける、IOリクエストの処理ソートインデックスをソートする。小さい処理ソートインデックスを有するIOリクエストは、アイドル状態のIOリクエスト処理プログラムによって優先的に処理される。
IOリクエスト処理プログラムは具体的には、IOリクエストの種類に従って、IOリクエストに対応する書込み操作または読出し操作を実行し得る。代替的に、IOリクエスト処理プログラムは、IOリクエストに保持されるデータに対して、整理または重複排除などを実行するよう構成され得る。
例えば、ストレージコントローラが位置するストレージアレイは、ブロックストレージを使用し、ストレージアレイのストレージ媒体は100個のLUNに仮想化される。サービス要求のために、いくつかのLUNについてIOPSパラメータが設定される必要がある。ストレージコントローラによって受信される各IOリクエストはLUNを指す。クライアントがIOリクエストを生成する速度は一定ではないので、異なるLUNを指す、毎秒に生成されるIOリクエストの数は著しく異なり得る。IOリクエスト処理プログラムの処理効率は限定されているので、IOリクエストソートプログラムのソート結果は、各LUNのIOPSパラメータを満たすことができるかどうかに影響する。例えば、LUN 1のIOPSパラメータは1000であり、LUN 2のIOPSパラメータは200である。しかしながら、LUN 2を指す、比較的大きい数のIOリクエストがある期間内に生成されるので、ある時点において、LUN 1を指す1000個のIOリクエスト、および、LUN 2を指す2000個のIOリクエストが、メモリデバイスのIOストレージ空間に記憶される。3000個のIOリクエストは、ソートのために、コア2からコアn+1上のIOリクエストソートプログラムに分配される。各IOリクエストソートプログラムが、LUN 1のIOPSパラメータおよびLUN 2のIOPSパラメータのみに従ってIOリクエストをスケジューリングする場合、最終的に、3000個のIOリクエストのためにn個のIOリクエストソートプログラムによって計算された処理ソートインデックスによって、LUN 1のIOPSパラメータ、および、LUN 2のIOPSパラメータを満たすことは通常困難である。処理ソートインデックスを生成するプロセスにおいて、IOリクエストソートプログラムが互いに通信する場合、これは、各LUNのIOPSパラメータの下限に到達することに役立つが、IOリクエストソートプログラムの間の通信のオーバーヘッドは非常に高い。
本願はIOリクエスト処理方法を提供する。当該方法は、図2Aおよび図2Bにおいて示されるストレージコントローラに適用可能である。
図3に示されるように、通信インタフェースは、クライアントによって送信された複数のIOリクエストを受信し、複数のIOリクエストをIOストレージ空間に記憶する。
IOリクエスト分配プログラムは、各IOリクエストのためにIO記述情報を生成し、各IOリクエストと、IOリクエストのIO記述情報との間のマッピング関係を確立する。各IOリクエストのIO記述情報は、IOリクエストのメタデータに保持されるLUN IDを含む。
IOリクエストが比較的大きい空間を占有するので、IOリクエストをソートするプロセスにおいて、IO記述情報は、各IOリクエストのために生成され得る。その後、IOリクエストソートプログラムは、IOリクエストのIO記述情報に従って、IOリクエストのために処理ソートインデックスを生成し、それにより、メモリデバイスの読出し/書込み負荷を低減する。
図4に示されるように、IOリクエスト分配プログラムは、複数のIO記述情報を、IOリクエストソートプログラムが位置するコアのサブ空間に分配する。
IOリクエスト分配プログラムは、各IOリクエストソートプログラムが位置するコアのサブ空間における各LUNのためにキューを構築し、IOリクエストソートプログラムが位置するコアのサブ空間に割り当てられたIO記述情報を各LUNのキューに記憶し得て、その結果、IOリクエストソートプログラムは、IO記述情報の各々が指すLUNを後のステップにおいて識別する。
以下では、図5Aおよび図5Bに関連して、コア2上で実行するIOリクエストソートプログラムが、どのように1つのIO記述情報について処理ソートインデックスを生成するかを説明する。実行プロセスにおいて、各IOリクエストソートプログラムは、各々のIO記述情報について処理ソートインデックスを生成するために同一の方法を使用する。
図5Aおよび図5Bにおいて、IO記述情報A−B−Cは、コアA上で実行するIOリクエストソートプログラムに分配される、LUN Bを指すC番目のIO記述情報を示す。それに対応して、処理ソートインデックスA−B−Cは、IO記述情報A−B−Cの処理ソートインデックスを示す。
例えば、コア2上で実行するIOリクエストソートプログラムは現在、IO記述情報2−1−3のために処理ソートインデックスを生成する。したがって、IO記述情報2−1−1の処理ソートインデックス、および、IO記述情報2−1−2の処理ソートインデックスは、IOリクエストソートプログラムによってコア2のインデックスキューに記憶されている。
コア2上で実行するIOリクエストソートプログラムは、コア2のサブ空間からIO記述情報2−1−3を取得して、IO記述情報に対応するLUN IDを取得する。
コア2上で実行するIOリクエストソートプログラムは、LUN IDに従ってLUN 1のIOPSパラメータを取得する。
コア2上で実行するIOリクエストソートプログラムは、LUN 1の累積インデックス数を取得する。LUN 1の累積インデックス数は、コア2上で実行するIOリクエストソートプログラムがIO記述情報2−1−2のために処理ソートインデックスを生成して以来、すべてのIOリクエストソートプログラムが処理ソートインデックスを生成した、LUN 1を指すIO記述情報の数を示す。
各IOリクエストソートプログラムが、IOリクエストソートプログラムに分配されたIO記述情報のために処理ソートインデックスを継続的に生成するので、コア2上で実行するIOリクエストソートプログラムがIO記述情報2−1−2のために処理ソートインデックスを生成する時点から、コア2上で実行するIOリクエストソートプログラムがIO記述情報2−1−3のために処理ソートインデックスを生成する時点までの期間の間に、別のIOリクエストソートプログラムも、LUN 1を指す特定の数のIO記述情報のために処理ソートインデックスを生成する。当該数は、コア2上で実行するIOリクエストソートプログラムがIO記述情報2−1−3のために処理ソートインデックスを生成するときのLUN 1の累積インデックス数である。
同様に、コア2上で実行するIOリクエストソートプログラムがIO記述情報2−1−2のために処理ソートインデックスを生成するときのLUN 1の累積インデックス数は、コア2上で実行するIOリクエストソートプログラムがIO記述情報2−1−1のために処理ソートインデックスを生成する時点から、コア2上で実行するIOリクエストソートプログラムがIO記述情報2−1−2のために処理ソートインデックスを生成する時点までの期間の間に残りのIOリクエストソートプログラムが処理ソートインデックスを生成する、LUN 1を指すIO記述情報の数である。
コア2上で実行するIOリクエストソートプログラムは、オペレーティングシステムのインタフェースを使用することによって現在のシステム時間を取得する。
現在のシステム時間は具体的には、ストレージコントローラが起動する時点から、ストレージコントローラがオペレーティングシステムのインタフェースを呼び出す時点までの期間の間に経過するナノ秒の数を表し得る。
コア2上で実行するIOリクエストソートプログラムは、IO記述情報2−1−3の処理ソートインデックス2−1−3を計算する。
処理ソートインデックス2−1−3=Max{処理ソートインデックス2−1−2+K×LUN 1の累積インデックス数/LUN 1のIOPSパラメータ,システム時間}である。ここで、Kは、正の数であり、Kの一般的な値は1である。
コア2上で実行するIOリクエストソートプログラムが現在、処理ソートインデックス2−1−1のために処理ソートインデックスを生成する場合、処理ソートインデックス2−1−1は、コア2上で実行するIOリクエストソートプログラムに分配される、LUN 1を指す第1IOリクエストの処理ソートインデックスであるので、処理ソートインデックス2−1−1=Max{最初の処理ソートインデックス+K×LUN 1の累積インデックス数/LUN 1のIOPSパラメータ,システム時間}である。最初の処理ソートインデックスは0であり得る。
コア2上で実行するIOリクエストソートプログラムは、処理ソートインデックス2−1−3をインデックスキューに記憶する。
IO記述情報2−1−3と処理ソートインデックス2−1−3との間に対応関係が確立され、または、処理ソートインデックス2−1−3と、IO記述情報2−1−3が生成されたIOリクエストとの間に対応関係が確立され、その結果、処理ソートインデックス2−1−3に対応するIOリクエストを後のステップにおいて決定できる。
上述のステップを実行することによって、各IOリクエストソートプログラムは、IOリクエストソートプログラムに分配されたIO記述情報の各々のために処理ソートインデックスを生成し、生成された処理ソートインデックスをインデックスキューに記憶する。したがって、処理されないIOリクエストの処理ソートインデックスは、コア2からコアnのインデックスキューに記憶される。
任意のコア上で実行するIOリクエスト処理プログラムがIOリクエストの処理を完了した後に、オペレーティングシステムは、IOリクエスト処理プログラムがアイドル状態に入ることを認識する。
オペレーティングシステムに各IOリクエスト処理プログラムの処理順序が記録される。すなわち、IOリクエスト処理プログラムがアイドル状態に入る後にIOリクエスト処理プログラムによって後に処理される予定の、最小処理ソートインデックスに対応するIOリクエストを含む特定のインデックスキューが記録される。IOPSパラメータが満たされることを保証するために、処理順序は、同一または同様の頻度で、IOリクエスト処理プログラムが、インデックスキューにおける処理ソートインデックスを処理することを可能にする必要がある。すなわち、IOリクエスト処理プログラムは、各インデックスキューにおける最小処理ソートインデックスに対応するIOリクエストを周期的に処理する。
処理順序は、コア2からコアnまでのシーケンスにおいて、各IOリクエスト処理プログラムがすべてのインデックスキューをポーリングし、アクセスされるたびにインデックスキューにおける最小処理ソートインデックスに対応するIOリクエストを処理することであり得る。インデックスキューにおける最小処理ソートインデックスに対応するIOリクエストが処理された後に毎回、アイドル状態のIOリクエスト処理プログラムは、次のインデックスキューにおける最小処理ソートインデックスに対応するIOリクエストを処理する。
代替的には、m=n−1、すなわち、IOリクエストソートプログラムの数がIOリクエスト処理プログラムの数と同一である場合、オペレーティングシステムは、IOリクエスト処理プログラムおよびインデックスキューを1つずつバインディングする。このケースでは、IOリクエスト処理プログラムがアイドル状態に入るとき、オペレーティングシステムは、アイドル状態のIOリクエスト処理プログラムが後に、アイドル状態のIOリクエスト処理プログラムに対応するインデックスキューにおける最小処理ソートインデックスに対応するIOリクエストを処理すると決定する。
アイドル状態のIOリクエスト処理プログラムによって後に処理される予定の、最小処理ソートインデックスに対応するIOリクエストを含む特定のインデックスキューをオペレーティングシステムが決定した後に、オペレーティングシステムは、インデックスキューから最小処理ソートインデックスを選択し、最小処理ソートインデックスに対応するIOリクエストを処理するようアイドル状態のIOリクエスト処理プログラムに命令する、または、オペレーティングシステムは、アイドル状態のIOリクエスト処理プログラムに、インデックスキューにアクセスし、インデックスキューにおける最小処理ソートインデックスに対応するIOリクエストを処理するよう命令する。
上述のステップのいくつかを実行する順序は調整され得る。LUN 1のIOPSパラメータを取得するステップ、および、システム時間を取得するステップは各々、処理ソートインデックス2−1−3が生成される前の任意の時点に実行され得る。
システム時間を取得するステップは任意選択のステップである。当該ステップが実行されないとき、生成された処理ソートインデックス2−1−3=処理ソートインデックス2−1−2+K×LUN 1の累積インデックス数/LUN 1のIOPSパラメータである。
アイドル状態のIOリクエスト処理プログラムは、各インデックスキューにおける最小処理ソートインデックスに対応するIOリクエストを優先的に処理する。したがって、コア2上で実行するIOリクエストソートプログラムについては、ある期間内に、LUN 2を指すIOリクエストが分配されないが、別のLUNを指すIOリクエストが当該期間内に継続的に分配される場合、次の期間内において、LUN 2を指すIOリクエストがコア2上で実行するIOリクエストソートプログラムに分配されると、LUN 2を指すIOリクエストのすべての処理ソートインデックスは、別のLUNを指すIOリクエストの処理ソートインデックスより小さいことがあり得る。その結果、LUN 2を指すIOリクエストが、アイドル状態のIOリクエスト処理プログラムによって継続的に、かつ、優先的に処理され、従って、別のLUNを指すIOリクエストは飢餓状態(hungry)である。したがって、システム時間が処理ソートインデックスの計算において考慮され、それにより、アイドル状態のLUNがあるとき、アイドル状態のLUNを指すIOリクエストが後にIOリクエストソートプログラムに分配された後に、別のLUNを指すIOリクエストがブロックされるというケースを回避し、その結果、IOリクエストスケジューリング精度が改善される。
例えば、時点1において、コア2のインデックスキューに記録される処理ソートインデックスは、以下を含む。
処理ソートインデックス2−1−1=3
処理ソートインデックス2−2−1=2.2
処理ソートインデックス2−1−2=3.5
処理ソートインデックス2−2−2=2.8
処理ソートインデックス2−1−3=5.5
処理ソートインデックス2−2−3=3.0
時点2において、時点1においてインデックスキューに記憶された処理ソートインデックスに対応するすべてのIOリクエストが処理済みであり、時点1と時点2との間に生成される新しい処理ソートインデックスは、以下を含む。
処理ソートインデックス2−1−4=6
処理ソートインデックス2−1−5=7.5
処理ソートインデックス2−1−6=9.5
処理ソートインデックス2−1−7=10.5
処理ソートインデックス2−1−8=12
すなわち、時点1から時点2までの期間の間には、LUN 2を指す新しいIO記述情報が、コア2上で実行するIOリクエストソートプログラムに分配されない。したがって、時点2の後に、システム時間が処理ソートインデックスの計算において考慮されず、かつ、LUN 2を指す新しいIO記述情報が、コア2上で実行するIOリクエストソートプログラムに分配される場合、LUN 2を指す新しい分配されたIO記述情報の処理ソートインデックスは、LUN 1を指すIO記述情報の処理ソートインデックスより遥かに小さい。その結果、コア2のインデックスキューにアクセスするとき、アイドル状態のIOリクエスト処理プログラムは、LUN 2を指す新しい分配されたIOリクエストを継続的に処理する。システム時間が処理ソートインデックスの計算において考慮される場合、LUN 2を指す新しい分配されたIO記述情報の処理ソートインデックスは、現在のシステム時間に等しいことがあり得て、LUN 1を指すIO記述情報の処理ソートインデックスより遥かに小さくないことがあり得る。
したがって、処理ソートインデックスの計算においてシステム時間が考慮され、それにより、アイドル状態のLUNが無いとき、アイドル状態のLUNを指すIOリクエストが後に到着した後に、別のLUNを指すIOリクエストがブロックされるというケースを回避し、その結果、IOリクエストスケジューリング精度が改善される。
上述のステップを実行するプロセスにおいて、コア2上で実行するIOリクエストソートプログラムが、ある時点で、コア2のインデックスキューにおいて、LUN 1を指すすべてのIO記述情報が処理されたと決定した場合、図6に示されるように、処理ソートインデックス2−1−5が生成された後に、コア2上で実行するIOリクエストソートプログラムに分配されたIO記述情報において、処理ソートインデックスが生成されていない、かつ、LUN 1を指すIO記述情報が無い場合、コア2上で実行するIOリクエストソートプログラムは、処理ソート待ちインデックスを生成し、処理ソート待ちインデックスをコア2のインデックスキューに記憶する。
処理ソート待ちインデックス=処理ソートインデックス2−1−5+K×当該時点におけるLUN 1の累積インデックス数/LUN 1のIOPSパラメータである。
当該時点におけるLUN 1の累積インデックス数は、コア2上で実行するIOリクエストソートプログラムがIO記述情報2−1−5のために処理ソートインデックスを生成して以来、残りのIOリクエストソートプログラムが処理ソートインデックスを生成した、LUN 1を指すIO記述情報の数を示す。
処理ソート待ちインデックスは、以下の2つのケースのうちの1つにおいて消去される。ケース1において、処理ソート待ちインデックスが生成された後に、LUN 1を指すIO記述情報が、コア2上で実行するIOリクエストソートプログラムに分配される。ケース2において、処理ソート待ちインデックスが存在する時間が、予め設定された閾値を超える。
処理ソート待ちインデックスの生成は任意選択のステップである。各インデックスキューにおける処理ソートインデックスは、処理ソート待ちインデックスと共にソートされる。アイドル状態のIOリクエスト処理プログラムのために、後に処理される予定のIOリクエストを選択するプロセスにおいて、オペレーティングシステムが、現在のインデックスキューにおける最小処理ソートインデックスが処理ソート待ちインデックスであると決定する場合、処理ソート待ちインデックスはいずれのIOリクエストにも対応しないので、アイドル状態のIOリクエスト処理プログラムは、インデックスキューにおける処理ソートインデックスに対応するIOリクエストを処理できない。オペレーティングシステムは、アイドル状態のIOリクエスト処理プログラムのためにインデックスキューを再選択する必要がある。
例えば、アイドル状態のIOリクエスト処理プログラムは、コア2からコアnまでのシーケンスにおいて、コアのインデックスキューをポーリングする。このケースにおいて、アイドル状態のIOリクエスト処理プログラムが現在、コア3のインデックスキューをポーリングするが、コア3のインデックスキューにおける最小処理ソートインデックスが処理ソート待ちインデックスであると発見した場合、アイドル状態のIOリクエスト処理プログラムは、コア3のインデックスキューをスキップし、コア4のインデックスキューにアクセスする。
各IOリクエストソートプログラムに分配される、異なるLUNを指すIO記述情報の数は異なり、IOリクエストソートプログラムがIOリクエストのために処理ソートインデックスを生成する速度は通常、IOリクエスト処理プログラムがIOリクエストを処理する速度より遥かに高い。したがって、処理ソート待ちインデックスが生成されず、かつ、コア2上で実行するIOリクエストソートプログラムに分配される、LUN 2を指すIO記述情報が少ない場合、コア2のインデックスキューにおける最小処理ソートインデックスを有するIO記述情報は、常にLUN 1を指し得る。その結果、アイドル状態のIOリクエスト処理プログラムは、LUN 1を指すIOリクエストを継続的に処理する。最終的に、LUN 2のIOPSパラメータを満たすことが困難になる。
例えば、時点1において、コア2のインデックスキューに記憶された処理ソートインデックスは、以下を含む。
処理ソートインデックス2−1−1=3
処理ソートインデックス2−2−1=2.2
処理ソートインデックス2−1−2=3.5
処理ソートインデックス2−2−2=2.8
処理ソートインデックス2−1−3=5.5
処理ソートインデックス2−2−3=3.0
時点2において、時点1において生成された処理ソートインデックスのいくつかに対応するIOリクエストは既に処理されている。加えて、時点1から時点2までの期間の間に新しい処理ソートインデックスが生成される。このケースでは、コア2のインデックスキューに記録される処理ソートインデックスは、以下を含む。
処理ソートインデックス2−1−4=6
処理ソートインデックス2−2−4=3.4
処理ソートインデックス2−1−5=7.5
処理ソートインデックス2−1−6=9.5
次の期間内に、LUN 2を指すIO記述情報が、コア2上で実行するIOリクエストソートプログラムに分配されないが、LUN 1を指すIO記述情報が、コア2上で実行するIOリクエストソートプログラムに継続的に分配される場合、処理ソートインデックス2−2−4に対応するIOリクエストが処理された後に、処理ソート待ちインデックスが生成されない場合、アイドル状態のIOリクエスト処理プログラムがコア2のインデックスキューにアクセスすると、アイドル状態のIOリクエスト処理プログラムは、LUN 1を指すIOリクエストを継続的に処理する。その結果、LUN 2のIOPSパラメータを満たすことができない。
対照的に、処理ソート待ちインデックス2−2−6が、上述の方法を使用することによって生成される場合、処理ソート待ちインデックス2−2−6が消去される前に、アイドル状態のIOリクエスト処理プログラムによって、処理ソート待ちインデックス2−2−6より大きい処理ソートインデックスに対応するIOリクエストを処理できない。その結果、アイドル状態のIOリクエスト処理プログラムは、別のインデックスキューにアクセスする必要がある。したがって、処理ソート待ちインデックスを使用することによって、IOリクエストスケジューリング精度を改善でき、IOPSパラメータ充足率を増加させることができる。
上述のステップにおいて、処理ソートインデックス2−1−3のために処理ソートインデックスが生成されるとき、LUN 1の累積インデックス数は具体的には、以下の2つの方式のいずれか1つで取得され得る。
[方式1]
共有カウンタが、メモリデバイスにおける各LUNのために維持される。各IOリクエストソートプログラムは、P個の共有カウンタの読出し/書込みができる。共有カウンタの初期値は同一である。LUN 1を指すIO記述情報の処理ソートインデックスを生成した後に、各IOリクエストソートプログラムは、LUN 1の共有カウンタの値を1増加させる。したがって、すべての共有カウンタの初期値が0である場合、P個の共有カウンタはそれぞれ、処理ソートインデックスが生成された、P個のLUNを指すIO記述情報の数を記録する。
IOリクエストソートプログラムを実行する各コアについては、各LUNのためにプライベートカウンタが維持される。コアのP個のプライベートカウンタは、コア上で実行するIOリクエストソートプログラムのみによって読み出す/書き込むことができる。コアのすべてのプライベートカウンタの初期値は同一である。LUN 1を指すIO記述情報の処理ソートインデックスを生成した後に、コア2上で実行するIOリクエストソートプログラムは、LUN 1の共有カウンタの値を使用することによって、LUN 1に対応する、コア2のプライベートカウンタの値を更新する、すなわち、LUN 1の共有カウンタの値を、LUN 1に対応する、コア2のプライベートカウンタにコピーする。したがって、コア2上で実行するIOリクエストソートプログラムが、LUN aを指すIO記述情報の処理ソートインデックスを計算するたびに、プライベートカウンタb−aの値は、コア2上で実行するIOリクエストソートプログラムが、LUN aを指す、以前のIO記述情報の処理ソートインデックスを計算した後の共有カウンタaの値に等しい。
共有カウンタaは、LUN aを指す共有カウンタを表す。プライベートカウンタb−cは、LUN cに対応する、コアb上で実行するIOリクエストソートプログラムのプライベートカウンタを表す。実際には、共有カウンタおよびプライベートカウンタは、複数の方式で実装され得る。例えば、各プライベートカウンタは、プライベートカウンタが属するIOリクエストソートプログラムが位置するコアの空間において設定され得る、または、コアの空間におけるプライベートカウンタは、テーブルに組み合わされ得て、テーブルは、メモリデバイスのストレージ空間において設定される。IOリクエストソートプログラムは、IOリクエストソートプログラムのプライベートカウンタに対応する、テーブルにおける領域のみにアクセスできる。別の例については、すべての共有カウンタはまた、テーブルに組み合わされ得て、テーブルは、メモリデバイスのストレージ空間において設定される。各IOリクエストソートプログラムはテーブルにアクセスできる。すべての共有カウンタおよびプライベートカウンタは、ストレージコントローラがIO記述情報の分配を開始する前に、オペレーティングシステムによって確立される。
したがって、方式1が使用されるとき、LUN 1の累積インデックス数を取得することは、以下のステップを含む。
1.1.共有カウンタ1の値、および、プライベートカウンタ2−1の値を取得し、2つの値の間の差を計算する。ここで、当該差は、LUN 1の累積インデックス数である。
1.2.共有カウンタ1の値を1増加させる。
1.3.共有カウンタ1の値を使用することによって、プライベートカウンタ2−1を更新する。
例えば、プロセッサは、3つのソートコアを含む。図7−1は、初期状態を示し、共有カウンタ1、共有カウンタ2および各プライベートカウンタの初期値は、すべて0である。図7−1において、IO記述情報a‐b‐cは、コアaに分配される、LUN bを指すc番目のIO記述情報を示す。LUN 1を指すIO記述情報の最初の処理ソートインデックス、および、LUN 2を指すIO記述情報の最初の処理ソートインデックスは、両方とも0である。LUN 1のIOPSパラメータは1000であり、LUN 2のIOPSパラメータは500である。
時点T1において、コア2上で実行するIOリクエストソートプログラムは、IO記述情報2−1−1のために処理ソートインデックスを計算する。その後、図7−2に示されるように、共有カウンタ1の値は1増加され、プライベートカウンタ2−1の値は、共有カウンタ1の値を使用することによって更新される。
時点T2において、コア3上で実行するIOリクエストソートプログラムは、IO記述情報3−1−1のために処理ソートインデックスを計算する。その後、図7−3に示されるように、共有カウンタ1の値は1増加され、プライベートカウンタ3−1の値は、共有カウンタ1の値を使用することによって更新される。
時点T3において、コア4上で実行するIOリクエストソートプログラムは、IO記述情報4−1−1のために処理ソートインデックスを計算する。その後、共有カウンタ1の値は1増加され、プライベートカウンタ4−1の値は、共有カウンタ1の値を使用することによって更新される。
時点T4において、コア4上で実行するIOリクエストソートプログラムが、IO記述情報4−2−1のために処理ソートインデックスを計算する。その後、図7−4に示されるように、共有カウンタ2の値は1増加され、プライベートカウンタ4−2の値は、共有カウンタ2の値を使用することによって更新される。
時点T5において、コア2上で実行するIOリクエストソートプログラムは、IO記述情報2−1−2のために処理ソートインデックスを計算する。その後、共有カウンタ1の値は1増加され、プライベートカウンタ2−1の値は、共有カウンタ1の値を使用することによって更新される。
時点T6において、コア2上で実行するIOリクエストソートプログラムは、IO記述情報2−2−1のために処理ソートインデックスを計算する。その後、図7−5に示されるように、共有カウンタ2の値は1増加され、プライベートカウンタ2−2の値は、共有カウンタ2の値を使用することによって更新される。
その後、残りのIO記述情報のために処理ソートインデックスを生成するプロセスは、類推によって推定される。
図7−1から図7−5に対応する例において、処理ソートインデックスの生成のプロセスに対するシステム時間の影響は考慮されない。
[方式2]
IOリクエストソートプログラムを実行するコアは、各LUNのために2つのプライベートカウンタを維持する。プライベートカウンタA‐B‐1は、LUN Bに対応する、コアAの第1のプライベートカウンタを表し、プライベートカウンタA‐B‐2は、LUN Bに対応する、コアAの第2のプライベートカウンタを表す。コアの2×P個のプライベートカウンタは、コア上で実行するIOリクエストソートプログラムのみによって書き込むことができ、コアのP個の第1のプライベートカウンタは、任意のIOリクエストソートプログラムによって読み出すことができる。コアのすべてのプライベートカウンタの初期値は同一である。LUN Bを指すIO記述情報の処理ソートインデックスを生成した後に、コアA上で実行するIOリクエストソートプログラムは、プライベートカウンタA‐B‐1の値を1増加させ、次に、IOリクエストソートプログラムのLUN Bについての第1のプライベートカウンタの和を使用することによってプライベートカウンタA‐B‐2を更新する。
プライベートカウンタは複数の方式で実装され得る。例えば、各プライベートカウンタは、プライベートカウンタが属するIOリクエストソートプログラムが位置するコアの空間において設定され得る、または、コアの空間におけるプライベートカウンタは、テーブルに組み合わされ、テーブルは、メモリデバイスのストレージ空間において設定される。すべてのプライベートカウンタは、ストレージコントローラがIO記述情報の分配を開始する前に、オペレーティングシステムによって確立される。
したがって、方式2が使用されるとき、LUN 1の累積インデックス数を取得することは、以下のステップを含む。
2.1.コア上で実行するIOリクエストソートプログラムのLUN 1についての第1のプライベートカウンタの値を取得し、コア上で実行するIOリクエストソートプログラムのLUN 1についての第1のプライベートカウンタの値の和を求める。
2.2.和の結果と、コア2上で実行するIOリクエストソートプログラムのLUN 1についての第2のプライベートカウンタとの間の差を計算する。ここで、当該差は、LUN 1の累積インデックス数である。
2.3.プライベートカウンタ2−1−1の値を1増加させる。
2.4.LUN 1に対応する、コアの第1のプライベートカウンタの値の和を使用することによって、プライベートカウンタ2−1−2を更新する。
2.4において、代替的に、2.1において取得された和の結果に1を加算することによって取得される値が、プライベートカウンタ2−1−2を更新するために使用され得る。
例えば、プロセッサは3つのソートコアを含む。例えば、図8−1は、初期状態を示し、すべてのプライベートカウンタの初期値は0である。LUN 1を指すIO記述情報の最初の処理ソートインデックス、および、LUN 2を指すIO記述情報の最初の処理ソートインデックスは、両方とも0である。LUN 1のIOPSパラメータは1000であり、LUN 2のIOPSパラメータは500である。
時点T1において、コア2上で実行するIOリクエストソートプログラムは、IO記述情報2−1−1のために処理ソートインデックスを計算する。その後、図8−2に示されるように、プライベートカウンタ2−1−1の値は1増加され、プライベートカウンタ2−1−2の値は更新される。
時点T2において、コア3上で実行するIOリクエストソートプログラムは、IO記述情報3−1−1のために処理ソートインデックスを計算する。その後、図8−3に示されるように、プライベートカウンタ3−1−1の値は1増加され、プライベートカウンタ3−1−2の値は更新される。
時点T3において、コア4上で実行するIOリクエストソートプログラムは、IO記述情報4−1−1のために処理ソートインデックスを計算する。その後、プライベートカウンタ4−1−1の値は1増加され、プライベートカウンタ4−1−2の値は更新される。
時点T4において、コア4上で実行するIOリクエストソートプログラムは、IO記述情報4−2−1のために処理ソートインデックスを計算する。その後、図8−4に示されるように、プライベートカウンタ4−2−1の値は1増加され、プライベートカウンタ4−2−2の値は更新される。
時点T5において、コア2上で実行するIOリクエストソートプログラムは、IO記述情報2−1−2のために処理ソートインデックスを計算する。その後、プライベートカウンタ2−1−1の値は1増加され、プライベートカウンタ2−1−2の値は更新される。
時点T6において、コア2上で実行するIOリクエストソートプログラムは、IO記述情報2−2−1のために処理ソートインデックスを計算する。その後、図8−5に示されるように、プライベートカウンタ2−2−1の値は1増加され、プライベートカウンタ2−2−2の値は更新される。
その後、残りのIO記述情報のために処理ソートインデックスを生成するプロセスは、類推によって推定される。
図8−1から図8−5に対応する例において、処理ソートインデックスの生成のプロセスに対するシステム時間の影響は考慮されない。
図2Aおよび図2Bに示されるように、本願に適用されるストレージコントローラは、バス、プロセッサ、メモリデバイスおよび通信インタフェースを含む。プロセッサ、メモリデバイスおよび通信インタフェースは、バスを使用して通信する。
メモリデバイスは、揮発性メモリ(英語:volatile memory)、例えば、ランダムアクセスメモリ(英語:random access memory、略称:RAM)を含み得る。
通信インタフェースは、クライアントによって送信されるIOリクエストおよびアクセスストレージ媒体を取得するようそれぞれ構成される、ネットワークインタフェースおよびストレージ媒体アクセスインタフェースを含む。
メモリデバイスは、IOリクエスト分配プログラム、IOリクエストソートプログラム、IOリクエスト処理プログラム、および、オペレーティングシステムを実行するために必要なコードを記憶する。ストレージコントローラが実行するとき、プロセッサにおける各コアは、上で提供されるIOリクエスト処理方法を実行するために、メモリデバイスに記憶されたコードを呼び出す。
上述の実施形態では、各実施形態の説明はそれぞれの焦点を有する。実施形態において詳細に説明されない部分については、他の実施形態における関連する説明を参照されたい。
本願における開示された内容と併せて説明される方法は、プロセッサによってソフトウェア命令を実行する方式で実装され得る。ソフトウェア命令は、対応するソフトウェアモジュールを含み得る。ソフトウェアモジュールは、RAM、フラッシュメモリ、ROM、消去可能プログラム可能リードオンリメモリ(英語:erasable programmable read only memory、略称:EPROM)、電気的消去可能プログラム可能リードオンリメモリ(英語:electrically erasable programmable read only memory、略称:EEPROM)、HDD、SSD、光学ディスク、または、当該技術分野において既知の任意の他の形態のうちのストレージ媒体に記憶され得る。
当業者であれば、上述の1または複数の例において、本願において説明される機能が、ハードウェアまたはソフトウェアによって実装され得ることを認識するはずである。本発明がソフトウェアによって実装されるとき、上述の機能は、コンピュータ可読媒体に記憶されるか、または、コンピュータ可読媒体における1または複数の命令もしくはコードとして伝送されてよい。当該ストレージ媒体は、汎用コンピュータまたは専用コンピュータがアクセス可能な任意の利用可能な媒体であってよい。
本願の目的、技術的解決法、および利点は更に、上述の具体的な実施形態において詳細に説明される。上述の説明は、本願の具体的な実施形態に過ぎず、本願の保護範囲を限定することを意図するものではないことを理解すべきである。本発明の思想および原理の範囲において行われる任意の修正または改善は、本願の保護範囲内に属するものとする。