(57)【特許請求の範囲】
【請求項１】
ストレージコントローラであって、
前記ストレージコントローラは、複数のストレージユニットを有するストレージシステムに適用可能であり、
メモリデバイスと、
分配コア、複数のソートコア、および、リクエスト処理コアを含む複数のプロセッサコアと
を備え、
前記分配コアは、ＩＯリクエストを受信し、各ＩＯリクエストのために処理ソートインデックスを生成するべく、受信された前記ＩＯリクエストを前記複数のソートコアへ分配するよう構成され、
各ソートコアは、
前記分配コアによって分配された、処理ソートインデックスが生成される予定のＩＯリクエストを取得すること、
前記処理ソートインデックスが生成される予定の前記ＩＯリクエストが指す目標ストレージユニットを決定すること、
前記目標ストレージユニットの累積インデックス数を取得することであって、前記目標ストレージユニットの前記累積インデックス数は、以前に分配されたＩＯリクエストのために各ソートコアが処理ソートインデックスを生成して以来、前記複数のソートコアが処理ソートインデックスを生成した、前記目標ストレージユニットを指すＩＯリクエストの数を示し、前記以前に分配されたＩＯリクエストは、前記目標ストレージユニットを指す、こと、
前記以前に分配されたＩＯリクエストの前記処理ソートインデックス、および、前記目標ストレージユニットの前記累積インデックス数と、前記目標ストレージユニットのＩＯ毎秒パラメータとの比に従って、前記処理ソートインデックスが生成される予定の前記ＩＯリクエストのために前記処理ソートインデックスを生成すること、および、
各ソートコアに対応するインデックスキューに、前記処理ソートインデックスが生成される予定の前記ＩＯリクエストの前記処理ソートインデックスを記憶することであって、各ソートコアに対応する前記インデックスキューは、前記メモリデバイスに記憶され、前記複数のストレージユニットを指すＩＯリクエストのために各ソートコアによって生成された処理ソートインデックスを含む、こと
を行うよう構成され、
前記リクエスト処理コアは、各ソートコアに対応する前記インデックスキューにおける最小処理ソートインデックスに対応するＩＯリクエストを周期的に処理するよう構成される、
ストレージコントローラ。
【請求項２】
各ソートコアは、前記目標ストレージユニットの前記累積インデックス数を取得するために、
前記目標ストレージユニットについての共有カウンタから、前記複数のソートコアが処理ソートインデックスを生成した、前記目標ストレージユニットを指すＩＯリクエストの現在の合計数を取得する操作と、
前記複数のソートコアが、前記以前に分配されたＩＯリクエストのために処理ソートインデックスを生成するとき、各ソートコアの、前記目標ストレージユニットに対応するプライベートカウンタから、前記複数のソートコアが処理ソートインデックスを生成した、前記目標ストレージユニットを指すＩＯリクエストの以前の合計数を取得する操作と、
ＩＯリクエストの前記現在の合計数と、ＩＯリクエストの前記以前の合計数との間の差を前記目標ストレージユニットの前記累積インデックス数として使用するために前記差を計算する操作と、
前記目標ストレージユニットについての前記共有カウンタの値を１増加させる操作と、
前記目標ストレージユニットについての前記共有カウンタの前記値を使用することによって、各ソートコアの、前記目標ストレージユニットに対応する前記プライベートカウンタを更新する操作と
を実行する、請求項１に記載のストレージコントローラ。
【請求項３】
各ソートコアは、前記目標ストレージユニットの前記累積インデックス数を取得するために、
前記複数のソートコアの、前記目標ストレージユニットに対応する第１のプライベートカウンタから、複数のプライベート数を取得する操作であって、各ソートコアのプライベート数は、各ソートコアが処理ソートインデックスを生成した、前記目標ストレージユニットを指すＩＯリクエストの数を示す、操作と、
処理ソートインデックスが生成された、前記目標ストレージユニットを指すＩＯリクエストの現在の大域的数を取得するために、前記複数のプライベート数の和を求める操作と、
前記複数のソートコアが前記以前に分配されたＩＯリクエストのために処理ソートインデックスを生成するとき、前記目標ストレージユニットに対応する、各ソートコアの第２のプライベートカウンタから、前記複数のソートコアが処理ソートインデックスを生成した、前記目標ストレージユニットを指すＩＯリクエストの以前の大域的数を取得する操作と、
ＩＯリクエストの前記現在の大域的数と、ＩＯリクエストの前記以前の大域的数との間の差を前記目標ストレージユニットの前記累積インデックス数として使用するために、前記差を計算する操作と、
前記目標ストレージユニットに対応する、各ソートコアの前記第１のプライベートカウンタの値を１増加させる操作と、
前記複数のソートコアの現在のプライベート数の和を使用することによって、前記目標ストレージユニットに対応する、各ソートコアの前記第２のプライベートカウンタを更新する操作と
を実行する、請求項１に記載のストレージコントローラ。
【請求項４】
各ソートコアは、前記処理ソートインデックスが生成される予定の前記ＩＯリクエストのために前記処理ソートインデックスを生成するために、
現在のシステム時間を取得する操作と、
前記処理ソートインデックスが生成される予定の前記ＩＯリクエストの前記処理ソートインデックスとして、前記目標ストレージユニットの前記累積インデックス数と前記目標ストレージユニットの前記ＩＯ毎秒パラメータとの前記比と前記以前に分配されたＩＯリクエストの前記処理ソートインデックスとの和、および、前記現在のシステム時間のうちのより大きい方を使用する操作と
を実行する、請求項１から３のいずれか一項に記載のストレージコントローラ。
【請求項５】
各ソートコアは更に、
前記処理ソートインデックスが生成される予定の前記ＩＯリクエストのために前記処理ソートインデックスが生成された後の時点において、各ソートコアに分配された、前記目標ストレージユニットを指す、インデックスが生成されていないＩＯリクエストが無いと決定すること、
前記時点における前記目標ストレージユニットの累積インデックス数を取得することであって、前記時点における前記目標ストレージユニットの前記累積インデックス数は、前記時点の前に、各ソートコアが、前記目標ストレージユニットを指す最後の処理ソートインデックスを生成して以来、前記複数のソートコアが処理ソートインデックスを生成した、前記目標ストレージユニットを指すＩＯリクエストの数を示す、こと、
前記時点における前記目標ストレージユニットの前記累積インデックス数と前記目標ストレージユニットの前記ＩＯ毎秒パラメータとの比と前記処理ソートインデックスが生成される予定の前記ＩＯリクエストの前記処理ソートインデックスとの和を処理ソート待ちインデックスとして使用するために、前記和を計算すること、および、
各ソートコアに対応する前記インデックスキューに前記処理ソート待ちインデックスを記憶すること
を行うよう構成される、請求項１から４のいずれか一項に記載のストレージコントローラ。
【請求項６】
各ソートコアに対応する前記インデックスキューに前記処理ソート待ちインデックスが存在する期間の間に、前記処理ソート待ちインデックスより大きい、各ソートコアに対応するインデックスキューに含まれる処理ソートインデックスに対応するＩＯリクエストは、前記リクエスト処理コアによって処理することができず、
各ソートコアは更に、前記時点の後に、前記目標ストレージユニットを指すＩＯリクエストが各ソートコアに分配されるとき、または、前記処理ソート待ちインデックスが存在する時間が予め設定された閾値を超えるとき、各ソートコアに対応する前記インデックスキューから前記処理ソート待ちインデックスを消去するよう構成される、請求項５に記載のストレージコントローラ。
【請求項７】
前記リクエスト処理コアは、各ソートコアに対応する前記インデックスキューにおける前記最小処理ソートインデックスに対応する前記ＩＯリクエストを周期的に処理するために、
各ソートコアに対応する前記インデックスキューに周期的にアクセスする操作と、
各アクセスにおいて、各ソートコアに対応する前記インデックスキューにおける前記最小処理ソートインデックスに対応する前記ＩＯリクエストを処理する操作と
を実行する、請求項１から６のいずれか一項に記載のストレージコントローラ。
【請求項８】
ＩＯリクエスト処理の方法であって、
前記方法は、複数のストレージユニットを含むストレージシステムのストレージコントローラによって実行され、前記ストレージコントローラは、メモリデバイス、分配コア、複数のソートコアおよびリクエスト処理コアを含み、前記方法は、
前記分配コアが、ＩＯリクエストを受信し、前記受信されたＩＯリクエストを前記複数のソートコアに分配する段階と、
各ソートコアが、前記分配コアによって分配される、処理ソートインデックスが生成される予定のＩＯリクエストを取得する段階と、
各ソートコアが、前記処理ソートインデックスが生成される予定の前記ＩＯリクエストが指す目標ストレージユニットを決定する段階と、
各ソートコアが、前記目標ストレージユニットの累積インデックス数を取得する段階であって、前記目標ストレージユニットの前記累積インデックス数は、各ソートコアが、以前に分配されたＩＯリクエストのために処理ソートインデックスを生成して以来、前記複数のソートコアが処理ソートインデックスを生成した、前記目標ストレージユニットを指すＩＯリクエストの数を示し、前記以前に分配されたＩＯリクエストは、前記目標ストレージユニットを指す、段階と、
各ソートコアが、前記以前に分配されたＩＯリクエストの前記処理ソートインデックス、および、前記目標ストレージユニットの前記累積インデックス数と前記目標ストレージユニットのＩＯ毎秒パラメータとの比に従って、前記処理ソートインデックスが生成される予定の前記ＩＯリクエストのために前記処理ソートインデックスを生成する段階と、
各ソートコアが、前記処理ソートインデックスが生成される予定の前記ＩＯリクエストの前記処理ソートインデックスを各ソートコアに対応するインデックスキューに記憶する段階であって、各ソートコアに対応する前記インデックスキューは、前記メモリデバイスに記憶され、前記複数のストレージユニットを指すＩＯリクエストのために、各ソートコアによって生成される処理ソートインデックスを含む、段階と、
前記リクエスト処理コアが、各ソートコアに対応する前記インデックスキューにおける最小処理ソートインデックスに対応するＩＯリクエストを周期的に処理する段階と
を備える方法。
【請求項９】
各ソートコアが、前記目標ストレージユニットの累積インデックス数を取得する前記段階は、
各ソートコアが、前記複数のソートコアが処理ソートインデックスを生成した、前記目標ストレージユニットを指すＩＯリクエストの現在の合計数を、前記目標ストレージユニットのための共有カウンタから取得する段階と、
各ソートコアが、前記複数のソートコアが前記以前に分配されたＩＯリクエストのために処理ソートインデックスを生成するときの、前記複数のソートコアが処理ソートインデックスを生成した、前記目標ストレージユニットを指すＩＯリクエストの以前の合計数を、前記目標ストレージユニットに対応する、各ソートコアのプライベートカウンタから取得する段階と、
各ソートコアが、ＩＯリクエストの前記現在の合計数と、ＩＯリクエストの前記以前の合計数との間の差を前記目標ストレージユニットの前記累積インデックス数として使用するために、前記差を計算する段階と、
各ソートコアが、前記目標ストレージユニットのための前記共有カウンタの値を１増加させる段階と、
各ソートコアが、前記目標ストレージユニットのための前記共有カウンタの前記値を使用することによって、前記目標ストレージユニットに対応する、各ソートコアの前記プライベートカウンタを更新する段階と
を含む、請求項８に記載の方法。
【請求項１０】
各ソートコアが、前記目標ストレージユニットの累積インデックス数を取得する前記段階は、
各ソートコアが、前記目標ストレージユニットに対応する、前記複数のソートコアの第１のプライベートカウンタから複数のプライベート数を取得する段階であって、各ソートコアのプライベート数は、各ソートコアが処理ソートインデックスを生成した、前記目標ストレージユニットを指すＩＯリクエストの数を示す、段階と、
各ソートコアが、処理ソートインデックスが生成された、前記目標ストレージユニットを指すＩＯリクエストの現在の大域的数を取得するために、前記複数のプライベート数の和を求める段階と、
各ソートコアが、前記複数のソートコアが前記以前に分配されたＩＯリクエストのために処理ソートインデックスを生成するときの、前記複数のソートコアが処理ソートインデックスを生成した、前記目標ストレージユニットを指すＩＯリクエストの以前の大域的数を、前記目標ストレージユニットに対応する、各ソートコアの第２のプライベートカウンタから取得する段階と、
各ソートコアが、ＩＯリクエストの前記現在の大域的数と、ＩＯリクエストの前記以前の大域的数との間の差を前記目標ストレージユニットの前記累積インデックス数として使用するために前記差を計算する段階と、
各ソートコアが、前記目標ストレージユニットに対応する、各ソートコアの前記第１のプライベートカウンタの値を１増加させる段階と、
各ソートコアが、前記複数のソートコアの現在のプライベート数の和を使用することによって、前記目標ストレージユニットに対応する、各ソートコアの前記第２のプライベートカウンタを更新する段階と
を含む、請求項８に記載の方法。
【請求項１１】
各ソートコアが、前記処理ソートインデックスが生成される予定の前記ＩＯリクエストのために前記処理ソートインデックスを生成する前記段階は、
各ソートコアが現在のシステム時間を取得する段階と、
各ソートコアが、前記目標ストレージユニットの前記累積インデックス数と前記目標ストレージユニットの前記ＩＯ毎秒パラメータとの比と前記以前に分配されたＩＯリクエストの前記処理ソートインデックスとの和、および、前記現在のシステム時間のうちのより大きい方を、前記処理ソートインデックスが生成される予定の前記ＩＯリクエストの前記処理ソートインデックスとして使用する段階と
を含む、請求項８から１０のいずれか一項に記載の方法。
【請求項１２】
前記方法は更に、
前記処理ソートインデックスが生成される予定の前記ＩＯリクエストのために前記処理ソートインデックスが生成された後の時点において、各ソートコアが、各ソートコアに分配された、前記目標ストレージユニットを指す、インデックスが生成されていないＩＯリクエストが無いと決定する段階と、
各ソートコアが、前記時点における前記目標ストレージユニットの累積インデックス数を取得する段階であって、前記時点における前記目標ストレージユニットの前記累積インデックス数は、前記時点の前に、各ソートコアが前記目標ストレージユニットを指す最後の処理ソートインデックスを生成して以来、前記複数のソートコアが処理ソートインデックスを生成した、前記目標ストレージユニットを指すＩＯリクエストの数を示す、段階と、
各ソートコアが、前記時点における前記目標ストレージユニットの前記累積インデックス数と前記目標ストレージユニットの前記ＩＯ毎秒パラメータとの比と前記処理ソートインデックスが生成される予定の前記ＩＯリクエストの前記処理ソートインデックスとの和を処理ソート待ちインデックスとして使用するために前記和を計算する段階と、
各ソートコアが、各ソートコアに対応する前記インデックスキューに前記処理ソート待ちインデックスを記憶する段階と
を備える、請求項８から１１のいずれか一項に記載の方法。
【請求項１３】
各ソートコアに対応する前記インデックスキューに前記処理ソート待ちインデックスが存在する期間の間に、前記処理ソート待ちインデックスより大きい、各ソートコアに対応する前記インデックスキューに含まれる処理ソートインデックスに対応するＩＯリクエストは、前記リクエスト処理コアによって処理できず、
前記方法は更に、
前記時点の後に、前記目標ストレージユニットを指すＩＯリクエストが各ソートコアに分配されるとき、または、前記処理ソート待ちインデックスが存在する時間が予め設定された閾値を超えるとき、各ソートコアが、前記各ソートコアに対応する前記インデックスキューから前記処理ソート待ちインデックスを消去する段階
を備える、請求項１２に記載の方法。
【請求項１４】
前記リクエスト処理コアが、各ソートコアに対応する前記インデックスキューにおける最小処理ソートインデックスに対応するＩＯリクエストを周期的に処理する前記段階は、
前記リクエスト処理コアが、各ソートコアに対応する前記インデックスキューに周期的にアクセスする段階と、
各アクセスにおいて、前記リクエスト処理コアが、各ソートコアに対応する前記インデックスキューにおける前記最小処理ソートインデックスに対応する前記ＩＯリクエストを処理する段階と
を含む、請求項８から１３のいずれか一項に記載の方法。
【請求項１５】
命令を含むプログラムであって、前記プログラムは、
分配コア、複数のソートコア、および、リクエスト処理コアを含むストレージコントローラのメモリデバイスに記憶されて前記ストレージコントローラの複数のプロセッサコアによって呼び出されるとき、前記ストレージコントローラに、
各ソートにおいて、処理ソートインデックスが生成される予定の、前記分配コアによって分配されるＩＯリクエストを取得する操作と、
前記処理ソートインデックスが生成される予定の前記ＩＯリクエストが指す目標ストレージユニットを決定する操作と、
前記目標ストレージユニットの累積インデックス数を取得する操作であって、前記目標ストレージユニットの前記累積インデックス数は、各ソートコアが、以前に分配されたＩＯリクエストのために処理ソートインデックスを生成して以来、前記複数のソートコアが処理ソートインデックスを生成した、前記目標ストレージユニットを指すＩＯリクエストの数を示し、前記以前に分配されたＩＯリクエストは前記目標ストレージユニットを指す、操作と、
前記以前に分配されたＩＯリクエストの前記処理ソートインデックス、および、前記目標ストレージユニットの前記累積インデックス数と前記目標ストレージユニットのＩＯ毎秒パラメータとの比に従って、前記処理ソートインデックスが生成される予定の前記ＩＯリクエストの前記処理ソートインデックスを生成する操作と、
前記処理ソートインデックスが生成される予定の前記ＩＯリクエストの前記処理ソートインデックスを、各ソートコアに対応するインデックスキューに記憶する操作であって、各ソートコアに対応する前記インデックスキューは、前記メモリデバイスに記憶され、複数のストレージユニットを指すＩＯリクエストのために各ソートコアによって生成される処理ソートインデックスを含む、操作と
を実行させ、
前記リクエスト処理コアは、各ソートコアに対応する前記インデックスキューにおける最小処理ソートインデックスに対応するＩＯリクエストを周期的に処理する、
プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本願は、ストレージ技術の分野に関し、特に、ストレージコントローラ、および、ストレージコントローラによって実行される入出力（英文全表記：ｉｎｐｕｔ  ｏｕｔｐｕｔ、略称：ＩＯ）リクエスト処理方法に関する。
【背景技術】
【０００２】
図１に示されるように、ストレージアレイは通常、大規模ストレージシナリオにおいて使用され、複数のストレージ媒体およびストレージコントローラを含む。ストレージ媒体は、ハードディスクドライブ（英文全表記：ｈａｒｄ  ｄｉｓｋ  ｄｒｉｖｅ、略称：ＨＤＤ）およびソリッドステートドライブ（英文全表記：ｓｏｌｉｄ  ｓｔａｔｅ  ｄｒｉｖｅ、略称：ＳＳＤ）を含み得る。クライアントは、通信ネットワークを使用することによって、ＩＯリクエストをストレージコントローラへ送信する。ストレージコントローラは、受信されたＩＯリクエストを処理する。例えば、ＩＯリクエストが読出しリクエストであるとき、ストレージコントローラは、読出しリクエストが指す特定のストレージ媒体を決定し、次に、ストレージコントローラは、読出しリクエストが指す当該ストレージ媒体から対応するデータを読出し、データをクライアントへ返す。
【０００３】
ストレージコントローラは、ストレージアレイのストレージ媒体を複数のストレージユニットに仮想化する。ストレージコントローラによって受信されるＩＯリクエストは通常、ストレージユニットを指す。異なるストレージの種類が使用されるとき、ストレージコントローラは、複数のストレージ媒体を異なる種類のストレージユニット（英語：ｓｔｏｒａｇｅ  ｕｎｉｔ）に仮想化する。例えば、ブロックストレージが使用されるとき、ストレージコントローラは、複数のストレージ媒体を１または複数の論理ユニット番号（英文全表記：ｌｏｇｉｃａｌ  ｕｎｉｔ  ｎｕｍｂｅｒ、略称：ＬＵＮ）に仮想化し、クライアントの各ＩＯリクエストは、あるＬＵＮを指す。ファイルストレージが使用されるとき、クライアントの各ＩＯリクエストは、ファイルシステムを指す。オブジェクト（英語：ｏｂｊｅｃｔ）ストレージが使用されるとき、クライアントの各ＩＯリクエストは、バケット（英語：ｂｕｃｋｅｔ）を指す。
【０００４】
サービス要求上の理由から、ユーザは通常、異なるストレージユニットのために、ＩＯ毎秒（英語：ｉｎｐｕｔ  ｏｕｔｐｕｔ  ｐｅｒ  ｓｅｃｏｎｄ、略称：ＩＯＰＳ）パラメータを設定する必要がある。クライアントによって送信されたＩＯリクエストの数が比較的大きく、かつ、ＩＯリクエストが異なるストレージユニットを指す場合、ストレージコントローラがＩＯリクエストを処理する速度は限定されているので、ストレージコントローラは、受信されたＩＯリクエストをスケジューリングする必要があり、それにより、可能な限り、複数のストレージユニットのＱＯＳパラメータを満たす。
【０００５】
既存のＩＯリクエストスケジューリング方法におけるＩＯＰＳパラメータ充足率は比較的低い。
【発明の概要】
【０００６】
本願は、ストレージコントローラを提供し、それにより、ＩＯＰＳパラメータ充足率を増加させる。
【０００７】
本願の第１の態様はストレージコントローラを提供し、ストレージコントローラは、複数のストレージユニットを有するストレージシステムに適用可能であり、ストレージコントローラは、メモリデバイスおよび複数のプロセッサコアを含み、複数のプロセッサコアは、少なくとも１つの分配コア、複数のソートコア、および、少なくとも１つのリクエスト処理コアを含む。
【０００８】
分配コアは、動作しているとき、メモリデバイスに記憶されるコードを実行し、それにより、メモリデバイスに記憶されたＩＯリクエストを受信し、受信されたＩＯリクエストを複数のソートコアへ分配する。
【０００９】
各ソートコアは、動作しているとき、メモリデバイスに記憶されたコードを実行して、以下の動作、すなわち、分配コアによって分配された、処理ソートインデックスが生成される予定のＩＯリクエストを取得する動作と、処理ソートインデックスが生成される予定のＩＯリクエストが指す目標ストレージユニットを決定する動作と、目標ストレージユニットの累積インデックス数を取得する動作であって、目標ストレージユニットの累積インデックス数は、以前に分配されたＩＯリクエストのために各ソートコアが処理ソートインデックスを生成して以来、複数のソートコアが処理ソートインデックスを生成した、目標ストレージユニットを指すＩＯリクエストの数を示し、以前に分配されたＩＯリクエストは、目標ストレージユニットを指す、動作と、以前に分配されたＩＯリクエストの処理ソートインデックス、および、目標ストレージユニットの累積インデックス数と目標ストレージユニットのＩＯ毎秒パラメータとの比に従って、処理ソートインデックスが生成される予定のＩＯリクエストのために処理ソートインデックスを生成する動作と、処理ソートインデックスが生成される予定のＩＯリクエストの処理ソートインデックスを、各ソートコアに対応するインデックスキューに記憶する動作であって、各ソートコアに対応するインデックスキューはメモリデバイスに記憶され、複数のストレージユニットを指すＩＯリクエストのために各ソートコアによって生成された処理ソートインデックスを含む、動作とを実行する。
【００１０】
動作しているとき、各ソートコアに対応するインデックスキューにおける最小処理ソートインデックスに対応するＩＯリクエストを周期的に処理するために、リクエスト処理コアは、メモリデバイスに記憶されたコードを実行する。
【００１１】
分配コア、複数のソートコア、および、リクエスト処理コアは同時に動作し得る。
【００１２】
複数のソートコアは、各ＩＯリクエストのために処理ソートインデックスを生成し、各ＩＯリクエストの処理ソートインデックスの値に従って処理順序を決定し、その結果、ＩＯＰＳパラメータ充足率が効率的に増加される。
【００１３】
本願の任意の態様、または、任意の態様の任意の実装において言及される各ソートコアは、複数のソートコアのうちいずれか１つを表す。
【００１４】
任意で、本願の任意の態様、または、任意の態様の任意の実装において言及される、処理ソートインデックスが生成される予定のＩＯリクエストは、以前に分配されたＩＯリクエストの後の各ソートコアに分配される次のＩＯリクエストである。
【００１５】
第１の態様に関連して、第１の態様の第１の実装において、各ソートコアは、目標ストレージユニットの累積インデックス数を取得するために、複数のソートコアが処理ソートインデックスを生成した、目標ストレージユニットを指すＩＯリクエストの現在の合計数を、目標ストレージユニットのための共有カウンタから取得するという操作を実行する。メモリデバイスにおいて、各ストレージユニットのために共有カウンタが設定される。
【００１６】
その後、複数のソートコアが以前に分配されたＩＯリクエストのために処理ソートインデックスを生成するとき、複数のソートコアが処理ソートインデックスを生成した、目標ストレージユニットを指すＩＯリクエストの以前の合計数が、目標ストレージユニットに対応する、各ソートコアのプライベートカウンタから取得される。各ストレージユニットに対応するプライベートカウンタが、メモリデバイスにおける各ソートコアのために設定される。
【００１７】
その後、ＩＯリクエストの現在の合計数と、ＩＯリクエストの以前の合計数との間の差を目標ストレージユニットの累積インデックス数として使用するために当該差が計算される。その後、目標ストレージユニットの共有カウンタの値が１増加され、次に、目標ストレージユニットに対応する、各ソートコアのプライベートカウンタが、目標ストレージユニットの共有カウンタの値を使用することによって更新される。
【００１８】
本態様において提供されるストレージコントローラにおいて、目標ストレージユニットの累積インデックス数を取得するとき、各ソートコアは、別のソートコアによる、ＩＯリクエストのための処理ソートインデックスの生成の状況を取得するために、別のソートコアにアクセスする必要は無く、その結果、スケジューリング効率が改善される。
【００１９】
第１の態様に関連して、第１の態様の第２の実装において、各ソートコアは、目標ストレージユニットの累積インデックス数を取得するために、目標ストレージユニットに対応する、複数のソートコアの第１のプライベートカウンタから複数のプライベート数を取得する操作を実行し、ここで、各ソートコアのプライベート数は、各ソートコアが処理ソートインデックスを生成した、目標ストレージユニットを指すＩＯリクエストの数を示す。
【００２０】
本願の任意の態様、または、任意の態様の任意の実装において言及される各ソートコアは、複数のソートコアのいずれか１つを表す。
【００２１】
その後、処理ソートインデックスが生成された、目標ストレージユニットを指すＩＯリクエストの現在の大域的数を取得するために、複数のプライベート数の和が求められる。
【００２２】
その後、複数のソートコアが以前に分配されたＩＯリクエストのために処理ソートインデックスを生成するとき、複数のソートコアが処理ソートインデックスを生成した、目標ストレージユニットを指すＩＯリクエストの以前の大域的数が、目標ストレージユニットに対応する、各ソートコアの第２のプライベートカウンタから取得される。各ストレージユニットに対応する第１のプライベートカウンタおよび第２のプライベートカウンタが、メモリデバイスにおける各ソートコアに設定される。
【００２３】
その後、ＩＯリクエストの現在の大域的数と、ＩＯリクエストの以前の大域的数との間の差を目標ストレージユニットの累積インデックス数として使用するために当該差が計算される。
【００２４】
その後、目標ストレージユニットに対応する、各ソートコアの第１のプライベートカウンタの値が１増加され、複数のソートコアの現在のプライベート数の和を使用することによって、目標ストレージユニットに対応する、各ソートコアの第２のプライベートカウンタが更新される。第２のプライベートカウンタが更新される前に、目標ストレージユニットに対応する、各ソートコアの第１のプライベートカウンタの値は１増加される。したがって、各ソートコアは、複数のソートコアの現在のプライベート数の和を取得するために、ＩＯリクエストの現在の大域的数を１増加させる。本態様において提供されるストレージコントローラにおいて、目標ストレージユニットの累積インデックス数を取得するとき、各ソートコアは、別のソートコアによる、ＩＯリクエストのための処理ソートインデックスの生成の状況を取得するために、別のソートコアにアクセスする必要は無く、その結果、スケジューリング効率が改善される。
【００２５】
第１の態様、第１の態様の第１の実装、または、第１の態様の第２の実装に関連して、第１の態様の第３の実装において、各ソートコアは、以下の操作、すなわち、処理ソートインデックスが生成される予定のＩＯリクエストのために処理ソートインデックスを生成する操作と、現在のシステム時間を取得する操作と、その後、処理ソートインデックスを生成する予定のＩＯリクエストの処理ソートインデックスとして、目標ストレージユニットの累積インデックス数と目標ストレージユニットのＩＯ毎秒パラメータとの比と、以前に分配されたＩＯリクエストの処理ソートインデックスとの和、および、現在のシステム時間のうちのより大きい方を使用する操作とを実行する。
【００２６】
すなわち、処理ソートインデックスが生成される予定のＩＯリクエストの処理ソートインデックス＝Ｍａｘ｛以前に分配されたＩＯリクエストの処理ソートインデックス＋Ｋ×目標ストレージユニットの累積インデックス数／目標ストレージユニットのＩＯ毎秒パラメータ，現在のシステム時間｝である。
【００２７】
システム時間は、処理ソートインデックスの計算において考慮され、その結果、ＩＯリクエストスケジューリング精度が改善される。
【００２８】
第１の態様、第１の態様の第１の実装、第１の態様の第２の実装、または、第１の態様の第３の実装に関連して、第１の態様の第４の実装において、各ソートコアは更に、処理ソートインデックスが生成される予定のＩＯリクエストのために処理ソートインデックスが生成された後の時点において、各ソートコアに分配される、目標ストレージユニットを指す、インデックスが生成されていないＩＯリクエストが無いと決定し、このケースでは、処理ソートインデックスが生成される予定のＩＯリクエストの処理ソートインデックスと、当該時点の目標ストレージユニットの累積インデックス数と目標ストレージユニットのＩＯ毎秒パラメータとの比との和を計算して、当該和を処理ソート待ちインデックスとして使用するよう、および、各ソートコアに対応するインデックスキューに処理ソート待ちインデックスを記憶するよう構成される。
【００２９】
すなわち、処理ソート待ちインデックス＝以前分配されたＩＯリクエストの処理ソートインデックス＋Ｋ×当該時点の目標ストレージユニットの累積インデックス数／目標ストレージユニットのＩＯ毎秒パラメータである。
【００３０】
当該時点の目標ストレージユニットの累積インデックス数は、当該時点の前に、各ソートコアが、目標ストレージユニットを指す最後の処理ソートインデックスを生成して以来、複数のソートコアが処理ソートインデックスを生成した、目標ストレージユニットを指すＩＯリクエストの数を示す。
【００３１】
各ソートコアの実行プロセスでは、インデックスが生成されていない、各ソートコアに分配されたＩＯリクエストにおいて、目標ストレージユニットを指すＩＯリクエストが無いと、処理ソート待ちインデックスが生成される。
【００３２】
第１の態様の第４の実装に関連して、第１の態様の第５の実装において、各ソートコアに対応するインデックスキューに処理ソート待ちインデックスが存在する期間の間に、処理ソート待ちインデックスより大きい、各ソートコアに対応するインデックスキューに含まれる処理ソートインデックスに対応するＩＯリクエストは、リクエスト処理コアによって処理することができず、各ソートコアは更に、当該時点の後に、目標ストレージユニットを指すＩＯリクエストが各ソートコアに分配されるとき、または、処理ソート待ちインデックスが存在する時間が予め設定された閾値を超えるとき、各ソートコアに対応するインデックスキューから処理ソート待ちインデックスを消去するよう構成される。
【００３３】
処理ソート待ちインデックスを使用することにより、ＩＯリクエストスケジューリング精度を改善できる。
【００３４】
第１の態様または第１の態様の実装のいずれか１つに関連して、第１の態様の第６の実装において、リクエスト処理コアは、各ソートコアに対応するインデックスキューにおける最小処理ソートインデックスに対応するＩＯリクエストを周期的に処理するために、各ソートコアに対応するインデックスキューに周期的にアクセスする操作と、各アクセスにおいて、各ソートコアに対応するインデックスキューにおける最小処理ソートインデックスに対応するＩＯリクエストを処理する操作とを実行する。
【００３５】
本願の第２の態様は、ＩＯリクエスト処理方法を提供し、第１の態様において提供されるストレージコントローラは、実行されるときに、当該方法を実行する。当該方法は、分配コアが、ＩＯリクエストを受信し、受信されたＩＯリクエストを複数のソートコアに分配する段階と、各ソートコアが、分配コアによって分配される、処理ソートインデックスが生成される予定のＩＯリクエストを取得する段階と、各ソートコアが、処理ソートインデックスが生成される予定のＩＯリクエストが指す目標ストレージユニットを決定する段階と、各ソートコアが、目標ストレージユニットの累積インデックス数を取得する段階であって、目標ストレージユニットの累積インデックス数は、各ソートコアが、以前に分配されたＩＯリクエストのために処理ソートインデックスを生成して以来、複数のソートコアが処理ソートインデックスを生成した、目標ストレージユニットを指すＩＯリクエストの数を示し、以前に分配されたＩＯリクエストは、目標ストレージユニットを指す、段階と、各ソートコアが、以前に分配されたＩＯリクエストの処理ソートインデックス、および、目標ストレージユニットの累積インデックス数と目標ストレージユニットのＩＯ毎秒パラメータとの比に従って、処理ソートインデックスが生成される予定のＩＯリクエストのために処理ソートインデックスを生成する段階と、各ソートコアが、処理ソートインデックスが生成される予定のＩＯリクエストの処理ソートインデックスを各ソートコアに対応するインデックスキューに記憶する段階であって、各ソートコアに対応するインデックスキューは、メモリデバイスに記憶され、複数のストレージユニットを指すＩＯリクエストのために、各ソートコアによって生成される処理ソートインデックスを含む、段階と、リクエスト処理コアが、各ソートコアに対応するインデックスキューにおける最小処理ソートインデックスに対応するＩＯリクエストを周期的に処理する段階とを備える。
【００３６】
第２の態様に関連して、第２の態様の第１の実装において、各ソートコアが、目標ストレージユニットの累積インデックス数を取得する段階は、各ソートコアが、複数のソートコアが処理ソートインデックスを生成した、目標ストレージユニットを指すＩＯリクエストの現在の合計数を、目標ストレージユニットのための共有カウンタから取得する段階と、各ソートコアが、複数のソートコアが以前に分配されたＩＯリクエストのために処理ソートインデックスを生成するときの、複数のソートコアが処理ソートインデックスを生成した、目標ストレージユニットを指すＩＯリクエストの以前の合計数を、目標ストレージユニットに対応する、各ソートコアのプライベートカウンタから取得する段階と、各ソートコアが、ＩＯリクエストの現在の合計数と、ＩＯリクエストの以前の合計数との間の差を目標ストレージユニットの累積インデックス数として使用するために、差を計算する段階と、各ソートコアが、目標ストレージユニットのための共有カウンタの値を１増加させる段階と、各ソートコアが、目標ストレージユニットのための共有カウンタの値を使用することによって、目標ストレージユニットに対応する、各ソートコアのプライベートカウンタを更新する段階とを備える。
【００３７】
第２の態様に関連して、第２の態様の第２の実装において、各ソートコアが、目標ストレージユニットの累積インデックス数を取得する段階は、各ソートコアが、目標ストレージユニットに対応する、複数のソートコアの第１のプライベートカウンタから複数のプライベート数を取得する段階であって、各ソートコアのプライベート数は、各ソートコアが処理ソートインデックスを生成した、目標ストレージユニットを指すＩＯリクエストの数を示す、段階と、各ソートコアが、処理ソートインデックスが生成された、目標ストレージユニットを指すＩＯリクエストの現在の大域的数を取得するために、複数のプライベート数の和を求める段階と、各ソートコアが、複数のソートコアが以前に分配されたＩＯリクエストのために処理ソートインデックスを生成するときの、複数のソートコアが処理ソートインデックスを生成した、目標ストレージユニットを指すＩＯリクエストの以前の大域的数を、目標ストレージユニットに対応する、各ソートコアの第２のプライベートカウンタから取得する段階と、各ソートコアが、ＩＯリクエストの現在の大域的数と、ＩＯリクエストの以前の大域的数との間の差を目標ストレージユニットの累積インデックス数として使用するために差を計算する段階と、各ソートコアが、目標ストレージユニットに対応する、各ソートコアの第１のプライベートカウンタの値を１増加させる段階と、各ソートコアが、複数のソートコアの現在のプライベート数の和を使用することによって、目標ストレージユニットに対応する、各ソートコアの第２のプライベートカウンタを更新する段階とを含む。
【００３８】
第２の態様、第２の態様の第１の実装、または、第２の態様の第２の実装に関連して、第２の態様の第３の実装において、各ソートコアが、処理ソートインデックスが生成される予定のＩＯリクエストのために処理ソートインデックスを生成する段階は、各ソートコアが、現在のシステム時間を取得する段階と、各ソートコアが、目標ストレージユニットの累積インデックス数と目標ストレージユニットのＩＯ毎秒パラメータとの比と以前に分配されたＩＯリクエストの処理ソートインデックスとの和、および、現在のシステム時間のうちのより大きい方を、処理ソートインデックスが生成される予定のＩＯリクエストの処理ソートインデックスとして使用する段階とを含む。
【００３９】
第２の態様、第２の態様の第１の実装、第２の態様の第２の実装、または、第２の態様の第３の実装に関連して、第２の態様の第４の実装において、方法は更に、処理ソートインデックスが生成される予定のＩＯリクエストのために処理ソートインデックスが生成された後の時点において、各ソートコアが、各ソートコアに分配された、目標ストレージユニットを指す、インデックスが生成されていないＩＯリクエストが無いと決定する段階と、各ソートコアが、当該時点における目標ストレージユニットの累積インデックス数を取得する段階であって、当該時点における目標ストレージユニットの累積インデックス数は、当該時点の前に、各ソートコアが目標ストレージユニットを指す最後の処理ソートインデックスを生成して以来、複数のソートコアが処理ソートインデックスを生成した、目標ストレージユニットを指すＩＯリクエストの数を示す、段階と、その後、各ソートコアが、当該時点における目標ストレージユニットの累積インデックス数と目標ストレージユニットのＩＯ毎秒パラメータとの比と処理ソートインデックスが生成される予定のＩＯリクエストの処理ソートインデックスとの和を処理ソート待ちインデックスとして使用するために和を計算する段階と、その後、各ソートコアが、処理ソート待ちインデックスを各ソートコアに対応するインデックスキューに記憶する段階とを備える。
【００４０】
第２の態様の第４の実装に関連して、第２の態様の第５の実装において、各ソートコアに対応するインデックスキューに処理ソート待ちインデックスが存在する期間の間に、処理ソート待ちインデックスより大きい、各ソートコアに対応するインデックスキューに含まれる処理ソートインデックスに対応するＩＯリクエストは、リクエスト処理コアによって処理できず、方法は更に、当該時点の後に、目標ストレージユニットを指すＩＯリクエストが各ソートコアに分配されるとき、または、処理ソート待ちインデックスが存在する時間が予め設定された閾値を超えるとき、各ソートコアが、各ソートコアに対応するインデックスキューから処理ソート待ちインデックスを消去する段階を備える。
【００４１】
第２の態様または第２の態様の実装のいずれか１つに関連して、第２の態様の第６の実装において、リクエスト処理コアが、各ソートコアに対応するインデックスキューにおける最小処理ソートインデックスに対応するＩＯリクエストを周期的に処理する段階は、リクエスト処理コアが、各ソートコアに対応するインデックスキューに周期的にアクセスする段階と、各アクセスにおいて、リクエスト処理コアによって、各ソートコアに対応するインデックスキューにおける最小処理ソートインデックスに対応するＩＯリクエストを処理する段階とを含む。
【００４２】
本願の第３の態様はストレージ媒体を提供し、ストレージ媒体はプログラムを記憶し、プログラムがコンピューティングデバイス上で実行するとき、コンピューティングデバイスは、第２の態様または第２の態様の実装のいずれか１つにおいて提供されるＩＯリクエスト処理方法を実行する。ストレージ媒体は、これらに限定されないが、リードオンリメモリ、ランダムアクセスメモリ、フラッシュメモリ、ＨＤＤまたはＳＳＤを含む。
【００４３】
本願の第４の態様は、コンピュータプログラムプロダクトを提供し、当該コンピュータプログラムプロダクトは、プログラム命令を含み、当該コンピュータプログラムプロダクトがストレージコントローラによって実行されるとき、ストレージコントローラは、第２の態様または第２の態様の実装のいずれか１つにおいて提供されるＩＯリクエスト処理方法を実行する。コンピュータプログラムプロダクトは、ソフトウェアインストールパッケージであり得て、第２の態様または第２の態様の実装のいずれか１つにおいて提供されるＩＯリクエスト処理方法を使用する必要があるとき、コンピュータプログラムプロダクトがダウンロードされ得て、コンピュータプログラムプロダクトはストレージコントローラ上で実行され得る。
【図面の簡単な説明】
【００４４】
【図１】本願の実施形態に係るストレージシステムの組織構造の概略図である。
【００４５】
【図２Ａ】ストレージコントローラの組織構造の概略図である。
【図２Ｂ】ストレージコントローラの組織構造の概略図である。
【００４６】
【図３】ストレージコントローラのメモリデバイスの組織構造の概略図である。
【００４７】
【図４】ストレージコントローラのメモリデバイスの組織構造の概略図である。
【００４８】
【図５Ａ】処理ソートインデックスを生成するプロセスの概略図である。
【図５Ｂ】処理ソートインデックスを生成するプロセスの概略図である。
【００４９】
【図６】処理ソートインデックスを生成するプロセスの概略図である。
【００５０】
【図７−１】処理ソートインデックスを生成するプロセスの概略図である。
【図７−２】処理ソートインデックスを生成するプロセスの概略図である。
【図７−３】処理ソートインデックスを生成するプロセスの概略図である。
【図７−４】処理ソートインデックスを生成するプロセスの概略図である。
【図７−５】処理ソートインデックスを生成するプロセスの概略図である。
【００５１】
【図８−１】処理ソートインデックスを生成するプロセスの概略図である。
【図８−２】処理ソートインデックスを生成するプロセスの概略図である。
【図８−３】処理ソートインデックスを生成するプロセスの概略図である。
【図８−４】処理ソートインデックスを生成するプロセスの概略図である。
【図８−５】処理ソートインデックスを生成するプロセスの概略図である。
【発明を実施するための形態】
【００５２】
以下では、本願の実施形態における添付図面を参照して、本願の実施形態における技術的解決法を説明する。
【００５３】
本願では、「第１」、「第２」および「第ｎ」の間には論理的または時間的な順序の依存関係は無い。
【００５４】
本明細書において、プロセッサは、１または複数の中央処理装置（英文全表記：ｃｅｎｔｒａｌ  ｐｒｏｃｅｓｓｉｎｇ  ｕｎｉｔ、略称：ＣＰＵ）を含み、各中央処理装置は、１または複数のコア（英語：ｃｏｒｅ）を含む。
【００５５】
本明細書において、ストレージユニットは、ＬＵＮ、ファイルシステムまたはバケットであり得る。ＬＵＮ、ファイルシステムまたはバケットはそれぞれ、ストレージアレイがブロックストレージ、ファイルストレージまたはオブジェクトストレージを使用する場合に対応する。例えば、本明細書におけるストレージアレイは、Ｐ個のＬＵＮをクライアントに提示し、Ｐは１より大きい正の整数である。
【００５６】
本明細書において、ＩＯリクエストは、ＩＯデータおよびメタデータを含む。ＩＯデータは、ＩＯリクエストの操作予定データ、および、操作予定データのアドレスなどの情報を含む。メタデータは、ＩＯリクエストが指すストレージユニットＩＤを含む。ストレージユニットＩＤは、ＬＵＮ  ＩＤ、ファイルシステムＩＤ、または、バケットＩＤであり得る。
【００５７】
本明細書において、関数Ｍａｘ｛ｘ，ｙ｝の機能は、ｘおよびｙのうちのより大きい値を返すことである。
【００５８】
本明細書において、ＩＯＰＳパラメータは、ストレージユニットのＩＯＰＳ、または、ストレージユニットのＩＯＰＳ処理の重みであり得る。ＩＯＰＳ処理の重みは、各ストレージユニットを指すＩＯリクエストを処理するためにストレージアレイによって使用されるリソースの割合を表す。したがって、ＩＯＰＳパラメータは、サービス要求に従ってユーザによって設定され得る。例えば、ユーザは、サービス要求に従って、サービスに関するストレージユニットの最低ＩＯＰＳを決定する、または、ユーザは、サービスに関するストレージユニットのＩＯＰＳによって占有される必要がある、ストレージアレイのリソースの重みを決定する。代替的に、ＩＯＰＳパラメータは、ユーザクラスに従って設定され得る。例えば、上級ユーザのエクスペリエンスを保証するために、上級ユーザのＩＯＰＳパラメータは比較的高い。ストレージコントローラは、複数の異なるストレージユニットのＩＯＰＳパラメータを記憶する。
【００５９】
［本願の実施形態に適用されるストレージコントローラのアーキテクチャ］
【００６０】
図２Ａおよび図２Ｂに示されるように、ストレージコントローラは通常、複数のコア、メモリデバイスおよび通信インタフェースを含む。各コアは、メモリデバイスとの通信接続を確立する。ストレージコントローラは、通信インタフェースを使用することによってクライアントおよびストレージ媒体と通信する。通信インタフェースから取得されたＩＯリクエストはメモリデバイスのＩＯストレージ空間に記憶される。
【００６１】
ＩＯリクエストのスケジューリングおよび処理のプロセスにおいて役割を果たす主な３種類のプログラムがあり、それらは、ＩＯリクエスト分配プログラム、ＩＯリクエストソートプログラム、および、ＩＯリクエスト処理プログラムである。ＩＯリクエスト分配プログラム、ＩＯリクエストソートプログラムおよびＩＯリクエスト処理プログラムは各々、コアがメモリデバイスにおけるコードを実行することによって実装される。ＩＯリクエスト分配プログラムを実行するコアは、分配コアと称される。ＩＯリクエストソートプログラムを実行するコアは、ソートコアと称される。ＩＯリクエスト処理プログラムを実行するコアは、リクエスト処理コアと称される。
【００６２】
３種類のプログラムの各々に割り当てられる予定のコアの数は、３種類のプログラムの実行圧力（ｒｕｎｎｉｎｇ  ｐｒｅｓｓｕｒｅ）に従って決定され得る。また、各プログラムが実行される特定のコアについては、プログラムは、各コアの負荷状況に従って移動させられ得る。図２Ａおよび図２Ｂにおいて、例えば、コア１は、ＩＯリクエスト分配プログラムを実行するよう構成され、コア２からコアｎは、ＩＯリクエストソートプログラムを実行するよう構成され、コアｎ＋１からコアｎ＋ｍは、ＩＯリクエスト処理プログラムを実行するよう構成され、コアｎ＋ｍ＋１は、ストレージコントローラのオペレーティングシステムを実行するよう構成される。
【００６３】
ＩＯリクエスト分配プログラムは、ＩＯストレージ空間におけるＩＯリクエストを分配する、すなわち、ＩＯリクエストソートプログラムを実行する各コアのサブ空間にＩＯリクエストを分配する。図２Ａおよび図２Ｂにおいて、例えば、コア２からコアｎのサブ空間は、コア１の空間に位置する。実際には、代替的に、コア２からコアｎのサブ空間は、コア１の空間の外側に位置し得る、または、各コアのそれぞれの空間内に位置し得る。
【００６４】
ＩＯリクエスト分配プログラムがＩＯリクエストを分配するプロセスにおいて、各ＩＯリクエストソートプログラムのその後の負荷分散が主に考慮されるが、ＬＵＮを指すすべてのＩＯリクエストをコアの空間に分配することは考慮されない。例えば、ＩＯリクエスト分配プログラムは、複数の受信されたＩＯリクエストをＩＯリクエストソートプログラムへ１つずつ分配し得て、それにより、ＩＯリクエストソートプログラムへ分配されるＩＯリクエストの数が同一であることを保証する。
【００６５】
その後、各ＩＯリクエストソートプログラムは、ＩＯリクエストソートプログラムに分配されたＩＯリクエストを読出し、ＩＯリクエストをソートする。ソート結果は、各ＩＯリクエストソートプログラムが位置するコアの空間におけるインデックスキューに記憶される。インデックスキューは、パイル（英語：ｐｉｌｅ）または先入先出キューなどの複数の異なるデータ構造を使用することによって実装され得る。各ＩＯリクエストソートプログラムは、ＩＯリクエストソートプログラムのためのサブ空間における各ＩＯリクエストのために処理ソートインデックスを生成し、次に、ＩＯリクエストソートプログラムのためのインデックスキューにおける、ＩＯリクエストの処理ソートインデックスをソートする。小さい処理ソートインデックスを有するＩＯリクエストは、アイドル状態のＩＯリクエスト処理プログラムによって優先的に処理される。
【００６６】
ＩＯリクエスト処理プログラムは具体的には、ＩＯリクエストの種類に従って、ＩＯリクエストに対応する書込み操作または読出し操作を実行し得る。代替的に、ＩＯリクエスト処理プログラムは、ＩＯリクエストに保持されるデータに対して、整理または重複排除などを実行するよう構成され得る。
【００６７】
例えば、ストレージコントローラが位置するストレージアレイは、ブロックストレージを使用し、ストレージアレイのストレージ媒体は１００個のＬＵＮに仮想化される。サービス要求のために、いくつかのＬＵＮについてＩＯＰＳパラメータが設定される必要がある。ストレージコントローラによって受信される各ＩＯリクエストはＬＵＮを指す。クライアントがＩＯリクエストを生成する速度は一定ではないので、異なるＬＵＮを指す、毎秒に生成されるＩＯリクエストの数は著しく異なり得る。ＩＯリクエスト処理プログラムの処理効率は限定されているので、ＩＯリクエストソートプログラムのソート結果は、各ＬＵＮのＩＯＰＳパラメータを満たすことができるかどうかに影響する。例えば、ＬＵＮ  １のＩＯＰＳパラメータは１０００であり、ＬＵＮ  ２のＩＯＰＳパラメータは２００である。しかしながら、ＬＵＮ  ２を指す、比較的大きい数のＩＯリクエストがある期間内に生成されるので、ある時点において、ＬＵＮ  １を指す１０００個のＩＯリクエスト、および、ＬＵＮ  ２を指す２０００個のＩＯリクエストが、メモリデバイスのＩＯストレージ空間に記憶される。３０００個のＩＯリクエストは、ソートのために、コア２からコアｎ＋１上のＩＯリクエストソートプログラムに分配される。各ＩＯリクエストソートプログラムが、ＬＵＮ  １のＩＯＰＳパラメータおよびＬＵＮ  ２のＩＯＰＳパラメータのみに従ってＩＯリクエストをスケジューリングする場合、最終的に、３０００個のＩＯリクエストのためにｎ個のＩＯリクエストソートプログラムによって計算された処理ソートインデックスによって、ＬＵＮ  １のＩＯＰＳパラメータ、および、ＬＵＮ  ２のＩＯＰＳパラメータを満たすことは通常困難である。処理ソートインデックスを生成するプロセスにおいて、ＩＯリクエストソートプログラムが互いに通信する場合、これは、各ＬＵＮのＩＯＰＳパラメータの下限に到達することに役立つが、ＩＯリクエストソートプログラムの間の通信のオーバーヘッドは非常に高い。
【００６８】
本願はＩＯリクエスト処理方法を提供する。当該方法は、図２Ａおよび図２Ｂにおいて示されるストレージコントローラに適用可能である。
【００６９】
図３に示されるように、通信インタフェースは、クライアントによって送信された複数のＩＯリクエストを受信し、複数のＩＯリクエストをＩＯストレージ空間に記憶する。
【００７０】
ＩＯリクエスト分配プログラムは、各ＩＯリクエストのためにＩＯ記述情報を生成し、各ＩＯリクエストと、ＩＯリクエストのＩＯ記述情報との間のマッピング関係を確立する。各ＩＯリクエストのＩＯ記述情報は、ＩＯリクエストのメタデータに保持されるＬＵＮ  ＩＤを含む。
【００７１】
ＩＯリクエストが比較的大きい空間を占有するので、ＩＯリクエストをソートするプロセスにおいて、ＩＯ記述情報は、各ＩＯリクエストのために生成され得る。その後、ＩＯリクエストソートプログラムは、ＩＯリクエストのＩＯ記述情報に従って、ＩＯリクエストのために処理ソートインデックスを生成し、それにより、メモリデバイスの読出し／書込み負荷を低減する。
【００７２】
図４に示されるように、ＩＯリクエスト分配プログラムは、複数のＩＯ記述情報を、ＩＯリクエストソートプログラムが位置するコアのサブ空間に分配する。
【００７３】
ＩＯリクエスト分配プログラムは、各ＩＯリクエストソートプログラムが位置するコアのサブ空間における各ＬＵＮのためにキューを構築し、ＩＯリクエストソートプログラムが位置するコアのサブ空間に割り当てられたＩＯ記述情報を各ＬＵＮのキューに記憶し得て、その結果、ＩＯリクエストソートプログラムは、ＩＯ記述情報の各々が指すＬＵＮを後のステップにおいて識別する。
【００７４】
以下では、図５Ａおよび図５Ｂに関連して、コア２上で実行するＩＯリクエストソートプログラムが、どのように１つのＩＯ記述情報について処理ソートインデックスを生成するかを説明する。実行プロセスにおいて、各ＩＯリクエストソートプログラムは、各々のＩＯ記述情報について処理ソートインデックスを生成するために同一の方法を使用する。
【００７５】
図５Ａおよび図５Ｂにおいて、ＩＯ記述情報Ａ−Ｂ−Ｃは、コアＡ上で実行するＩＯリクエストソートプログラムに分配される、ＬＵＮ  Ｂを指すＣ番目のＩＯ記述情報を示す。それに対応して、処理ソートインデックスＡ−Ｂ−Ｃは、ＩＯ記述情報Ａ−Ｂ−Ｃの処理ソートインデックスを示す。
【００７６】
例えば、コア２上で実行するＩＯリクエストソートプログラムは現在、ＩＯ記述情報２−１−３のために処理ソートインデックスを生成する。したがって、ＩＯ記述情報２−１−１の処理ソートインデックス、および、ＩＯ記述情報２−１−２の処理ソートインデックスは、ＩＯリクエストソートプログラムによってコア２のインデックスキューに記憶されている。
【００７７】
コア２上で実行するＩＯリクエストソートプログラムは、コア２のサブ空間からＩＯ記述情報２−１−３を取得して、ＩＯ記述情報に対応するＬＵＮ  ＩＤを取得する。
【００７８】
コア２上で実行するＩＯリクエストソートプログラムは、ＬＵＮ  ＩＤに従ってＬＵＮ  １のＩＯＰＳパラメータを取得する。
【００７９】
コア２上で実行するＩＯリクエストソートプログラムは、ＬＵＮ  １の累積インデックス数を取得する。ＬＵＮ  １の累積インデックス数は、コア２上で実行するＩＯリクエストソートプログラムがＩＯ記述情報２−１−２のために処理ソートインデックスを生成して以来、すべてのＩＯリクエストソートプログラムが処理ソートインデックスを生成した、ＬＵＮ  １を指すＩＯ記述情報の数を示す。
【００８０】
各ＩＯリクエストソートプログラムが、ＩＯリクエストソートプログラムに分配されたＩＯ記述情報のために処理ソートインデックスを継続的に生成するので、コア２上で実行するＩＯリクエストソートプログラムがＩＯ記述情報２−１−２のために処理ソートインデックスを生成する時点から、コア２上で実行するＩＯリクエストソートプログラムがＩＯ記述情報２−１−３のために処理ソートインデックスを生成する時点までの期間の間に、別のＩＯリクエストソートプログラムも、ＬＵＮ  １を指す特定の数のＩＯ記述情報のために処理ソートインデックスを生成する。当該数は、コア２上で実行するＩＯリクエストソートプログラムがＩＯ記述情報２−１−３のために処理ソートインデックスを生成するときのＬＵＮ  １の累積インデックス数である。
【００８１】
同様に、コア２上で実行するＩＯリクエストソートプログラムがＩＯ記述情報２−１−２のために処理ソートインデックスを生成するときのＬＵＮ  １の累積インデックス数は、コア２上で実行するＩＯリクエストソートプログラムがＩＯ記述情報２−１−１のために処理ソートインデックスを生成する時点から、コア２上で実行するＩＯリクエストソートプログラムがＩＯ記述情報２−１−２のために処理ソートインデックスを生成する時点までの期間の間に残りのＩＯリクエストソートプログラムが処理ソートインデックスを生成する、ＬＵＮ  １を指すＩＯ記述情報の数である。
【００８２】
コア２上で実行するＩＯリクエストソートプログラムは、オペレーティングシステムのインタフェースを使用することによって現在のシステム時間を取得する。
【００８３】
現在のシステム時間は具体的には、ストレージコントローラが起動する時点から、ストレージコントローラがオペレーティングシステムのインタフェースを呼び出す時点までの期間の間に経過するナノ秒の数を表し得る。
【００８４】
コア２上で実行するＩＯリクエストソートプログラムは、ＩＯ記述情報２−１−３の処理ソートインデックス２−１−３を計算する。
【００８５】
処理ソートインデックス２−１−３＝Ｍａｘ｛処理ソートインデックス２−１−２＋Ｋ×ＬＵＮ  １の累積インデックス数／ＬＵＮ  １のＩＯＰＳパラメータ，システム時間｝である。ここで、Ｋは、正の数であり、Ｋの一般的な値は１である。
【００８６】
コア２上で実行するＩＯリクエストソートプログラムが現在、処理ソートインデックス２−１−１のために処理ソートインデックスを生成する場合、処理ソートインデックス２−１−１は、コア２上で実行するＩＯリクエストソートプログラムに分配される、ＬＵＮ  １を指す第１ＩＯリクエストの処理ソートインデックスであるので、処理ソートインデックス２−１−１＝Ｍａｘ｛最初の処理ソートインデックス＋Ｋ×ＬＵＮ  １の累積インデックス数／ＬＵＮ  １のＩＯＰＳパラメータ，システム時間｝である。最初の処理ソートインデックスは０であり得る。
【００８７】
コア２上で実行するＩＯリクエストソートプログラムは、処理ソートインデックス２−１−３をインデックスキューに記憶する。
【００８８】
ＩＯ記述情報２−１−３と処理ソートインデックス２−１−３との間に対応関係が確立され、または、処理ソートインデックス２−１−３と、ＩＯ記述情報２−１−３が生成されたＩＯリクエストとの間に対応関係が確立され、その結果、処理ソートインデックス２−１−３に対応するＩＯリクエストを後のステップにおいて決定できる。
【００８９】
上述のステップを実行することによって、各ＩＯリクエストソートプログラムは、ＩＯリクエストソートプログラムに分配されたＩＯ記述情報の各々のために処理ソートインデックスを生成し、生成された処理ソートインデックスをインデックスキューに記憶する。したがって、処理されないＩＯリクエストの処理ソートインデックスは、コア２からコアｎのインデックスキューに記憶される。
【００９０】
任意のコア上で実行するＩＯリクエスト処理プログラムがＩＯリクエストの処理を完了した後に、オペレーティングシステムは、ＩＯリクエスト処理プログラムがアイドル状態に入ることを認識する。
【００９１】
オペレーティングシステムに各ＩＯリクエスト処理プログラムの処理順序が記録される。すなわち、ＩＯリクエスト処理プログラムがアイドル状態に入る後にＩＯリクエスト処理プログラムによって後に処理される予定の、最小処理ソートインデックスに対応するＩＯリクエストを含む特定のインデックスキューが記録される。ＩＯＰＳパラメータが満たされることを保証するために、処理順序は、同一または同様の頻度で、ＩＯリクエスト処理プログラムが、インデックスキューにおける処理ソートインデックスを処理することを可能にする必要がある。すなわち、ＩＯリクエスト処理プログラムは、各インデックスキューにおける最小処理ソートインデックスに対応するＩＯリクエストを周期的に処理する。
【００９２】
処理順序は、コア２からコアｎまでのシーケンスにおいて、各ＩＯリクエスト処理プログラムがすべてのインデックスキューをポーリングし、アクセスされるたびにインデックスキューにおける最小処理ソートインデックスに対応するＩＯリクエストを処理することであり得る。インデックスキューにおける最小処理ソートインデックスに対応するＩＯリクエストが処理された後に毎回、アイドル状態のＩＯリクエスト処理プログラムは、次のインデックスキューにおける最小処理ソートインデックスに対応するＩＯリクエストを処理する。
【００９３】
代替的には、ｍ＝ｎ−１、すなわち、ＩＯリクエストソートプログラムの数がＩＯリクエスト処理プログラムの数と同一である場合、オペレーティングシステムは、ＩＯリクエスト処理プログラムおよびインデックスキューを１つずつバインディングする。このケースでは、ＩＯリクエスト処理プログラムがアイドル状態に入るとき、オペレーティングシステムは、アイドル状態のＩＯリクエスト処理プログラムが後に、アイドル状態のＩＯリクエスト処理プログラムに対応するインデックスキューにおける最小処理ソートインデックスに対応するＩＯリクエストを処理すると決定する。
【００９４】
アイドル状態のＩＯリクエスト処理プログラムによって後に処理される予定の、最小処理ソートインデックスに対応するＩＯリクエストを含む特定のインデックスキューをオペレーティングシステムが決定した後に、オペレーティングシステムは、インデックスキューから最小処理ソートインデックスを選択し、最小処理ソートインデックスに対応するＩＯリクエストを処理するようアイドル状態のＩＯリクエスト処理プログラムに命令する、または、オペレーティングシステムは、アイドル状態のＩＯリクエスト処理プログラムに、インデックスキューにアクセスし、インデックスキューにおける最小処理ソートインデックスに対応するＩＯリクエストを処理するよう命令する。
【００９５】
上述のステップのいくつかを実行する順序は調整され得る。ＬＵＮ  １のＩＯＰＳパラメータを取得するステップ、および、システム時間を取得するステップは各々、処理ソートインデックス２−１−３が生成される前の任意の時点に実行され得る。
【００９６】
システム時間を取得するステップは任意選択のステップである。当該ステップが実行されないとき、生成された処理ソートインデックス２−１−３＝処理ソートインデックス２−１−２＋Ｋ×ＬＵＮ  １の累積インデックス数／ＬＵＮ  １のＩＯＰＳパラメータである。
【００９７】
アイドル状態のＩＯリクエスト処理プログラムは、各インデックスキューにおける最小処理ソートインデックスに対応するＩＯリクエストを優先的に処理する。したがって、コア２上で実行するＩＯリクエストソートプログラムについては、ある期間内に、ＬＵＮ  ２を指すＩＯリクエストが分配されないが、別のＬＵＮを指すＩＯリクエストが当該期間内に継続的に分配される場合、次の期間内において、ＬＵＮ  ２を指すＩＯリクエストがコア２上で実行するＩＯリクエストソートプログラムに分配されると、ＬＵＮ  ２を指すＩＯリクエストのすべての処理ソートインデックスは、別のＬＵＮを指すＩＯリクエストの処理ソートインデックスより小さいことがあり得る。その結果、ＬＵＮ  ２を指すＩＯリクエストが、アイドル状態のＩＯリクエスト処理プログラムによって継続的に、かつ、優先的に処理され、従って、別のＬＵＮを指すＩＯリクエストは飢餓状態（ｈｕｎｇｒｙ）である。したがって、システム時間が処理ソートインデックスの計算において考慮され、それにより、アイドル状態のＬＵＮがあるとき、アイドル状態のＬＵＮを指すＩＯリクエストが後にＩＯリクエストソートプログラムに分配された後に、別のＬＵＮを指すＩＯリクエストがブロックされるというケースを回避し、その結果、ＩＯリクエストスケジューリング精度が改善される。
【００９８】
例えば、時点１において、コア２のインデックスキューに記録される処理ソートインデックスは、以下を含む。
処理ソートインデックス２−１−１＝３
処理ソートインデックス２−２−１＝２．２
処理ソートインデックス２−１−２＝３．５
処理ソートインデックス２−２−２＝２．８
処理ソートインデックス２−１−３＝５．５
処理ソートインデックス２−２−３＝３．０
【００９９】
時点２において、時点１においてインデックスキューに記憶された処理ソートインデックスに対応するすべてのＩＯリクエストが処理済みであり、時点１と時点２との間に生成される新しい処理ソートインデックスは、以下を含む。
処理ソートインデックス２−１−４＝６
処理ソートインデックス２−１−５＝７．５
処理ソートインデックス２−１−６＝９．５
処理ソートインデックス２−１−７＝１０．５
処理ソートインデックス２−１−８＝１２
【０１００】
すなわち、時点１から時点２までの期間の間には、ＬＵＮ  ２を指す新しいＩＯ記述情報が、コア２上で実行するＩＯリクエストソートプログラムに分配されない。したがって、時点２の後に、システム時間が処理ソートインデックスの計算において考慮されず、かつ、ＬＵＮ  ２を指す新しいＩＯ記述情報が、コア２上で実行するＩＯリクエストソートプログラムに分配される場合、ＬＵＮ  ２を指す新しい分配されたＩＯ記述情報の処理ソートインデックスは、ＬＵＮ  １を指すＩＯ記述情報の処理ソートインデックスより遥かに小さい。その結果、コア２のインデックスキューにアクセスするとき、アイドル状態のＩＯリクエスト処理プログラムは、ＬＵＮ  ２を指す新しい分配されたＩＯリクエストを継続的に処理する。システム時間が処理ソートインデックスの計算において考慮される場合、ＬＵＮ  ２を指す新しい分配されたＩＯ記述情報の処理ソートインデックスは、現在のシステム時間に等しいことがあり得て、ＬＵＮ  １を指すＩＯ記述情報の処理ソートインデックスより遥かに小さくないことがあり得る。
【０１０１】
したがって、処理ソートインデックスの計算においてシステム時間が考慮され、それにより、アイドル状態のＬＵＮが無いとき、アイドル状態のＬＵＮを指すＩＯリクエストが後に到着した後に、別のＬＵＮを指すＩＯリクエストがブロックされるというケースを回避し、その結果、ＩＯリクエストスケジューリング精度が改善される。
【０１０２】
上述のステップを実行するプロセスにおいて、コア２上で実行するＩＯリクエストソートプログラムが、ある時点で、コア２のインデックスキューにおいて、ＬＵＮ  １を指すすべてのＩＯ記述情報が処理されたと決定した場合、図６に示されるように、処理ソートインデックス２−１−５が生成された後に、コア２上で実行するＩＯリクエストソートプログラムに分配されたＩＯ記述情報において、処理ソートインデックスが生成されていない、かつ、ＬＵＮ  １を指すＩＯ記述情報が無い場合、コア２上で実行するＩＯリクエストソートプログラムは、処理ソート待ちインデックスを生成し、処理ソート待ちインデックスをコア２のインデックスキューに記憶する。
【０１０３】
処理ソート待ちインデックス＝処理ソートインデックス２−１−５＋Ｋ×当該時点におけるＬＵＮ  １の累積インデックス数／ＬＵＮ  １のＩＯＰＳパラメータである。
【０１０４】
当該時点におけるＬＵＮ  １の累積インデックス数は、コア２上で実行するＩＯリクエストソートプログラムがＩＯ記述情報２−１−５のために処理ソートインデックスを生成して以来、残りのＩＯリクエストソートプログラムが処理ソートインデックスを生成した、ＬＵＮ  １を指すＩＯ記述情報の数を示す。
【０１０５】
処理ソート待ちインデックスは、以下の２つのケースのうちの１つにおいて消去される。ケース１において、処理ソート待ちインデックスが生成された後に、ＬＵＮ  １を指すＩＯ記述情報が、コア２上で実行するＩＯリクエストソートプログラムに分配される。ケース２において、処理ソート待ちインデックスが存在する時間が、予め設定された閾値を超える。
【０１０６】
処理ソート待ちインデックスの生成は任意選択のステップである。各インデックスキューにおける処理ソートインデックスは、処理ソート待ちインデックスと共にソートされる。アイドル状態のＩＯリクエスト処理プログラムのために、後に処理される予定のＩＯリクエストを選択するプロセスにおいて、オペレーティングシステムが、現在のインデックスキューにおける最小処理ソートインデックスが処理ソート待ちインデックスであると決定する場合、処理ソート待ちインデックスはいずれのＩＯリクエストにも対応しないので、アイドル状態のＩＯリクエスト処理プログラムは、インデックスキューにおける処理ソートインデックスに対応するＩＯリクエストを処理できない。オペレーティングシステムは、アイドル状態のＩＯリクエスト処理プログラムのためにインデックスキューを再選択する必要がある。
【０１０７】
例えば、アイドル状態のＩＯリクエスト処理プログラムは、コア２からコアｎまでのシーケンスにおいて、コアのインデックスキューをポーリングする。このケースにおいて、アイドル状態のＩＯリクエスト処理プログラムが現在、コア３のインデックスキューをポーリングするが、コア３のインデックスキューにおける最小処理ソートインデックスが処理ソート待ちインデックスであると発見した場合、アイドル状態のＩＯリクエスト処理プログラムは、コア３のインデックスキューをスキップし、コア４のインデックスキューにアクセスする。
【０１０８】
各ＩＯリクエストソートプログラムに分配される、異なるＬＵＮを指すＩＯ記述情報の数は異なり、ＩＯリクエストソートプログラムがＩＯリクエストのために処理ソートインデックスを生成する速度は通常、ＩＯリクエスト処理プログラムがＩＯリクエストを処理する速度より遥かに高い。したがって、処理ソート待ちインデックスが生成されず、かつ、コア２上で実行するＩＯリクエストソートプログラムに分配される、ＬＵＮ  ２を指すＩＯ記述情報が少ない場合、コア２のインデックスキューにおける最小処理ソートインデックスを有するＩＯ記述情報は、常にＬＵＮ  １を指し得る。その結果、アイドル状態のＩＯリクエスト処理プログラムは、ＬＵＮ  １を指すＩＯリクエストを継続的に処理する。最終的に、ＬＵＮ  ２のＩＯＰＳパラメータを満たすことが困難になる。
【０１０９】
例えば、時点１において、コア２のインデックスキューに記憶された処理ソートインデックスは、以下を含む。
処理ソートインデックス２−１−１＝３
処理ソートインデックス２−２−１＝２．２
処理ソートインデックス２−１−２＝３．５
処理ソートインデックス２−２−２＝２．８
処理ソートインデックス２−１−３＝５．５
処理ソートインデックス２−２−３＝３．０
【０１１０】
時点２において、時点１において生成された処理ソートインデックスのいくつかに対応するＩＯリクエストは既に処理されている。加えて、時点１から時点２までの期間の間に新しい処理ソートインデックスが生成される。このケースでは、コア２のインデックスキューに記録される処理ソートインデックスは、以下を含む。
処理ソートインデックス２−１−４＝６
処理ソートインデックス２−２−４＝３．４
処理ソートインデックス２−１−５＝７．５
処理ソートインデックス２−１−６＝９．５
【０１１１】
次の期間内に、ＬＵＮ  ２を指すＩＯ記述情報が、コア２上で実行するＩＯリクエストソートプログラムに分配されないが、ＬＵＮ  １を指すＩＯ記述情報が、コア２上で実行するＩＯリクエストソートプログラムに継続的に分配される場合、処理ソートインデックス２−２−４に対応するＩＯリクエストが処理された後に、処理ソート待ちインデックスが生成されない場合、アイドル状態のＩＯリクエスト処理プログラムがコア２のインデックスキューにアクセスすると、アイドル状態のＩＯリクエスト処理プログラムは、ＬＵＮ  １を指すＩＯリクエストを継続的に処理する。その結果、ＬＵＮ  ２のＩＯＰＳパラメータを満たすことができない。
【０１１２】
対照的に、処理ソート待ちインデックス２−２−６が、上述の方法を使用することによって生成される場合、処理ソート待ちインデックス２−２−６が消去される前に、アイドル状態のＩＯリクエスト処理プログラムによって、処理ソート待ちインデックス２−２−６より大きい処理ソートインデックスに対応するＩＯリクエストを処理できない。その結果、アイドル状態のＩＯリクエスト処理プログラムは、別のインデックスキューにアクセスする必要がある。したがって、処理ソート待ちインデックスを使用することによって、ＩＯリクエストスケジューリング精度を改善でき、ＩＯＰＳパラメータ充足率を増加させることができる。
【０１１３】
上述のステップにおいて、処理ソートインデックス２−１−３のために処理ソートインデックスが生成されるとき、ＬＵＮ  １の累積インデックス数は具体的には、以下の２つの方式のいずれか１つで取得され得る。
【０１１４】
［方式１］
【０１１５】
共有カウンタが、メモリデバイスにおける各ＬＵＮのために維持される。各ＩＯリクエストソートプログラムは、Ｐ個の共有カウンタの読出し／書込みができる。共有カウンタの初期値は同一である。ＬＵＮ  １を指すＩＯ記述情報の処理ソートインデックスを生成した後に、各ＩＯリクエストソートプログラムは、ＬＵＮ  １の共有カウンタの値を１増加させる。したがって、すべての共有カウンタの初期値が０である場合、Ｐ個の共有カウンタはそれぞれ、処理ソートインデックスが生成された、Ｐ個のＬＵＮを指すＩＯ記述情報の数を記録する。
【０１１６】
ＩＯリクエストソートプログラムを実行する各コアについては、各ＬＵＮのためにプライベートカウンタが維持される。コアのＰ個のプライベートカウンタは、コア上で実行するＩＯリクエストソートプログラムのみによって読み出す／書き込むことができる。コアのすべてのプライベートカウンタの初期値は同一である。ＬＵＮ  １を指すＩＯ記述情報の処理ソートインデックスを生成した後に、コア２上で実行するＩＯリクエストソートプログラムは、ＬＵＮ  １の共有カウンタの値を使用することによって、ＬＵＮ  １に対応する、コア２のプライベートカウンタの値を更新する、すなわち、ＬＵＮ  １の共有カウンタの値を、ＬＵＮ  １に対応する、コア２のプライベートカウンタにコピーする。したがって、コア２上で実行するＩＯリクエストソートプログラムが、ＬＵＮ  ａを指すＩＯ記述情報の処理ソートインデックスを計算するたびに、プライベートカウンタｂ−ａの値は、コア２上で実行するＩＯリクエストソートプログラムが、ＬＵＮ  ａを指す、以前のＩＯ記述情報の処理ソートインデックスを計算した後の共有カウンタａの値に等しい。
【０１１７】
共有カウンタａは、ＬＵＮ  ａを指す共有カウンタを表す。プライベートカウンタｂ−ｃは、ＬＵＮ  ｃに対応する、コアｂ上で実行するＩＯリクエストソートプログラムのプライベートカウンタを表す。実際には、共有カウンタおよびプライベートカウンタは、複数の方式で実装され得る。例えば、各プライベートカウンタは、プライベートカウンタが属するＩＯリクエストソートプログラムが位置するコアの空間において設定され得る、または、コアの空間におけるプライベートカウンタは、テーブルに組み合わされ得て、テーブルは、メモリデバイスのストレージ空間において設定される。ＩＯリクエストソートプログラムは、ＩＯリクエストソートプログラムのプライベートカウンタに対応する、テーブルにおける領域のみにアクセスできる。別の例については、すべての共有カウンタはまた、テーブルに組み合わされ得て、テーブルは、メモリデバイスのストレージ空間において設定される。各ＩＯリクエストソートプログラムはテーブルにアクセスできる。すべての共有カウンタおよびプライベートカウンタは、ストレージコントローラがＩＯ記述情報の分配を開始する前に、オペレーティングシステムによって確立される。
【０１１８】
したがって、方式１が使用されるとき、ＬＵＮ  １の累積インデックス数を取得することは、以下のステップを含む。
【０１１９】
１．１．共有カウンタ１の値、および、プライベートカウンタ２−１の値を取得し、２つの値の間の差を計算する。ここで、当該差は、ＬＵＮ  １の累積インデックス数である。
【０１２０】
１．２．共有カウンタ１の値を１増加させる。
【０１２１】
１．３．共有カウンタ１の値を使用することによって、プライベートカウンタ２−１を更新する。
【０１２２】
例えば、プロセッサは、３つのソートコアを含む。図７−１は、初期状態を示し、共有カウンタ１、共有カウンタ２および各プライベートカウンタの初期値は、すべて０である。図７−１において、ＩＯ記述情報ａ‐ｂ‐ｃは、コアａに分配される、ＬＵＮ  ｂを指すｃ番目のＩＯ記述情報を示す。ＬＵＮ  １を指すＩＯ記述情報の最初の処理ソートインデックス、および、ＬＵＮ  ２を指すＩＯ記述情報の最初の処理ソートインデックスは、両方とも０である。ＬＵＮ  １のＩＯＰＳパラメータは１０００であり、ＬＵＮ  ２のＩＯＰＳパラメータは５００である。
【０１２３】
時点Ｔ１において、コア２上で実行するＩＯリクエストソートプログラムは、ＩＯ記述情報２−１−１のために処理ソートインデックスを計算する。その後、図７−２に示されるように、共有カウンタ１の値は１増加され、プライベートカウンタ２−１の値は、共有カウンタ１の値を使用することによって更新される。
【０１２４】
時点Ｔ２において、コア３上で実行するＩＯリクエストソートプログラムは、ＩＯ記述情報３−１−１のために処理ソートインデックスを計算する。その後、図７−３に示されるように、共有カウンタ１の値は１増加され、プライベートカウンタ３−１の値は、共有カウンタ１の値を使用することによって更新される。
【０１２５】
時点Ｔ３において、コア４上で実行するＩＯリクエストソートプログラムは、ＩＯ記述情報４−１−１のために処理ソートインデックスを計算する。その後、共有カウンタ１の値は１増加され、プライベートカウンタ４−１の値は、共有カウンタ１の値を使用することによって更新される。
【０１２６】
時点Ｔ４において、コア４上で実行するＩＯリクエストソートプログラムが、ＩＯ記述情報４−２−１のために処理ソートインデックスを計算する。その後、図７−４に示されるように、共有カウンタ２の値は１増加され、プライベートカウンタ４−２の値は、共有カウンタ２の値を使用することによって更新される。
【０１２７】
時点Ｔ５において、コア２上で実行するＩＯリクエストソートプログラムは、ＩＯ記述情報２−１−２のために処理ソートインデックスを計算する。その後、共有カウンタ１の値は１増加され、プライベートカウンタ２−１の値は、共有カウンタ１の値を使用することによって更新される。
【０１２８】
時点Ｔ６において、コア２上で実行するＩＯリクエストソートプログラムは、ＩＯ記述情報２−２−１のために処理ソートインデックスを計算する。その後、図７−５に示されるように、共有カウンタ２の値は１増加され、プライベートカウンタ２−２の値は、共有カウンタ２の値を使用することによって更新される。
【０１２９】
その後、残りのＩＯ記述情報のために処理ソートインデックスを生成するプロセスは、類推によって推定される。
【０１３０】
図７−１から図７−５に対応する例において、処理ソートインデックスの生成のプロセスに対するシステム時間の影響は考慮されない。
【０１３１】
［方式２］
【０１３２】
ＩＯリクエストソートプログラムを実行するコアは、各ＬＵＮのために２つのプライベートカウンタを維持する。プライベートカウンタＡ‐Ｂ‐１は、ＬＵＮ  Ｂに対応する、コアＡの第１のプライベートカウンタを表し、プライベートカウンタＡ‐Ｂ‐２は、ＬＵＮ  Ｂに対応する、コアＡの第２のプライベートカウンタを表す。コアの２×Ｐ個のプライベートカウンタは、コア上で実行するＩＯリクエストソートプログラムのみによって書き込むことができ、コアのＰ個の第１のプライベートカウンタは、任意のＩＯリクエストソートプログラムによって読み出すことができる。コアのすべてのプライベートカウンタの初期値は同一である。ＬＵＮ  Ｂを指すＩＯ記述情報の処理ソートインデックスを生成した後に、コアＡ上で実行するＩＯリクエストソートプログラムは、プライベートカウンタＡ‐Ｂ‐１の値を１増加させ、次に、ＩＯリクエストソートプログラムのＬＵＮ  Ｂについての第１のプライベートカウンタの和を使用することによってプライベートカウンタＡ‐Ｂ‐２を更新する。
【０１３３】
プライベートカウンタは複数の方式で実装され得る。例えば、各プライベートカウンタは、プライベートカウンタが属するＩＯリクエストソートプログラムが位置するコアの空間において設定され得る、または、コアの空間におけるプライベートカウンタは、テーブルに組み合わされ、テーブルは、メモリデバイスのストレージ空間において設定される。すべてのプライベートカウンタは、ストレージコントローラがＩＯ記述情報の分配を開始する前に、オペレーティングシステムによって確立される。
【０１３４】
したがって、方式２が使用されるとき、ＬＵＮ  １の累積インデックス数を取得することは、以下のステップを含む。
【０１３５】
２．１．コア上で実行するＩＯリクエストソートプログラムのＬＵＮ  １についての第１のプライベートカウンタの値を取得し、コア上で実行するＩＯリクエストソートプログラムのＬＵＮ  １についての第１のプライベートカウンタの値の和を求める。
【０１３６】
２．２．和の結果と、コア２上で実行するＩＯリクエストソートプログラムのＬＵＮ  １についての第２のプライベートカウンタとの間の差を計算する。ここで、当該差は、ＬＵＮ  １の累積インデックス数である。
【０１３７】
２．３．プライベートカウンタ２−１−１の値を１増加させる。
【０１３８】
２．４．ＬＵＮ  １に対応する、コアの第１のプライベートカウンタの値の和を使用することによって、プライベートカウンタ２−１−２を更新する。
【０１３９】
２．４において、代替的に、２．１において取得された和の結果に１を加算することによって取得される値が、プライベートカウンタ２−１−２を更新するために使用され得る。
【０１４０】
例えば、プロセッサは３つのソートコアを含む。例えば、図８−１は、初期状態を示し、すべてのプライベートカウンタの初期値は０である。ＬＵＮ  １を指すＩＯ記述情報の最初の処理ソートインデックス、および、ＬＵＮ  ２を指すＩＯ記述情報の最初の処理ソートインデックスは、両方とも０である。ＬＵＮ  １のＩＯＰＳパラメータは１０００であり、ＬＵＮ  ２のＩＯＰＳパラメータは５００である。
【０１４１】
時点Ｔ１において、コア２上で実行するＩＯリクエストソートプログラムは、ＩＯ記述情報２−１−１のために処理ソートインデックスを計算する。その後、図８−２に示されるように、プライベートカウンタ２−１−１の値は１増加され、プライベートカウンタ２−１−２の値は更新される。
【０１４２】
時点Ｔ２において、コア３上で実行するＩＯリクエストソートプログラムは、ＩＯ記述情報３−１−１のために処理ソートインデックスを計算する。その後、図８−３に示されるように、プライベートカウンタ３−１−１の値は１増加され、プライベートカウンタ３−１−２の値は更新される。
【０１４３】
時点Ｔ３において、コア４上で実行するＩＯリクエストソートプログラムは、ＩＯ記述情報４−１−１のために処理ソートインデックスを計算する。その後、プライベートカウンタ４−１−１の値は１増加され、プライベートカウンタ４−１−２の値は更新される。
【０１４４】
時点Ｔ４において、コア４上で実行するＩＯリクエストソートプログラムは、ＩＯ記述情報４−２−１のために処理ソートインデックスを計算する。その後、図８−４に示されるように、プライベートカウンタ４−２−１の値は１増加され、プライベートカウンタ４−２−２の値は更新される。
【０１４５】
時点Ｔ５において、コア２上で実行するＩＯリクエストソートプログラムは、ＩＯ記述情報２−１−２のために処理ソートインデックスを計算する。その後、プライベートカウンタ２−１−１の値は１増加され、プライベートカウンタ２−１−２の値は更新される。
【０１４６】
時点Ｔ６において、コア２上で実行するＩＯリクエストソートプログラムは、ＩＯ記述情報２−２−１のために処理ソートインデックスを計算する。その後、図８−５に示されるように、プライベートカウンタ２−２−１の値は１増加され、プライベートカウンタ２−２−２の値は更新される。
【０１４７】
その後、残りのＩＯ記述情報のために処理ソートインデックスを生成するプロセスは、類推によって推定される。
【０１４８】
図８−１から図８−５に対応する例において、処理ソートインデックスの生成のプロセスに対するシステム時間の影響は考慮されない。
【０１４９】
図２Ａおよび図２Ｂに示されるように、本願に適用されるストレージコントローラは、バス、プロセッサ、メモリデバイスおよび通信インタフェースを含む。プロセッサ、メモリデバイスおよび通信インタフェースは、バスを使用して通信する。
【０１５０】
メモリデバイスは、揮発性メモリ（英語：ｖｏｌａｔｉｌｅ  ｍｅｍｏｒｙ）、例えば、ランダムアクセスメモリ（英語：ｒａｎｄｏｍ  ａｃｃｅｓｓ  ｍｅｍｏｒｙ、略称：ＲＡＭ）を含み得る。
【０１５１】
通信インタフェースは、クライアントによって送信されるＩＯリクエストおよびアクセスストレージ媒体を取得するようそれぞれ構成される、ネットワークインタフェースおよびストレージ媒体アクセスインタフェースを含む。
【０１５２】
メモリデバイスは、ＩＯリクエスト分配プログラム、ＩＯリクエストソートプログラム、ＩＯリクエスト処理プログラム、および、オペレーティングシステムを実行するために必要なコードを記憶する。ストレージコントローラが実行するとき、プロセッサにおける各コアは、上で提供されるＩＯリクエスト処理方法を実行するために、メモリデバイスに記憶されたコードを呼び出す。
【０１５３】
上述の実施形態では、各実施形態の説明はそれぞれの焦点を有する。実施形態において詳細に説明されない部分については、他の実施形態における関連する説明を参照されたい。
【０１５４】
本願における開示された内容と併せて説明される方法は、プロセッサによってソフトウェア命令を実行する方式で実装され得る。ソフトウェア命令は、対応するソフトウェアモジュールを含み得る。ソフトウェアモジュールは、ＲＡＭ、フラッシュメモリ、ＲＯＭ、消去可能プログラム可能リードオンリメモリ（英語：ｅｒａｓａｂｌｅ  ｐｒｏｇｒａｍｍａｂｌｅ  ｒｅａｄ  ｏｎｌｙ  ｍｅｍｏｒｙ、略称：ＥＰＲＯＭ）、電気的消去可能プログラム可能リードオンリメモリ（英語：ｅｌｅｃｔｒｉｃａｌｌｙ  ｅｒａｓａｂｌｅ  ｐｒｏｇｒａｍｍａｂｌｅ  ｒｅａｄ  ｏｎｌｙ  ｍｅｍｏｒｙ、略称：ＥＥＰＲＯＭ）、ＨＤＤ、ＳＳＤ、光学ディスク、または、当該技術分野において既知の任意の他の形態のうちのストレージ媒体に記憶され得る。
【０１５５】
当業者であれば、上述の１または複数の例において、本願において説明される機能が、ハードウェアまたはソフトウェアによって実装され得ることを認識するはずである。本発明がソフトウェアによって実装されるとき、上述の機能は、コンピュータ可読媒体に記憶されるか、または、コンピュータ可読媒体における１または複数の命令もしくはコードとして伝送されてよい。当該ストレージ媒体は、汎用コンピュータまたは専用コンピュータがアクセス可能な任意の利用可能な媒体であってよい。
【０１５６】
本願の目的、技術的解決法、および利点は更に、上述の具体的な実施形態において詳細に説明される。上述の説明は、本願の具体的な実施形態に過ぎず、本願の保護範囲を限定することを意図するものではないことを理解すべきである。本発明の思想および原理の範囲において行われる任意の修正または改善は、本願の保護範囲内に属するものとする。
【図１】
0006773229.tif 000002
【図２Ａ】
0006773229.tif 000003
【図２Ｂ】
0006773229.tif 000004
【図３】
0006773229.tif 000005
【図４】
0006773229.tif 000006
【図５Ａ】
0006773229.tif 000007
【図５Ｂ】
0006773229.tif 000008
【図６】
0006773229.tif 000009
【図７−１】
0006773229.tif 000010
【図７−２】
0006773229.tif 000011
【図７−３】
0006773229.tif 000012
【図７−４】
0006773229.tif 000013
【図７−５】
0006773229.tif 000014
【図８−１】
0006773229.tif 000015
【図８−２】
0006773229.tif 000016
【図８−３】
0006773229.tif 000017
【図８−４】
0006773229.tif 000018
【図８−５】
0006773229.tif 000019