(57)【要約】【課題】ユーザからのリクエストに基づいてデバイスへのアクセスを制御する情報処理技術に関し、デバイスの状況の変化に応じて、負荷状況を動的に解析可能とし、それに基づきユーザからのリクエストのデバイスへの同時実行数を動的に制御可能とすることで、ユーザに対する適切な並列アクセス制御を実現する。また、大量の入出力を行うユーザの処理が比較的少量の入出力を行うユーザの処理を大きく遅延させることのない同時実行数の制御を可能として、ユーザ間のアクセスの公平性を確保する。【解決手段】サーバマシン１００内のディスクアクセス時刻記録部１０３は、ディスク装置１２０へのアクセスの開始時刻および終了時刻を記録する。ディスク負荷状況解析部１０４は、開始時刻および終了時刻に基づく経過時間から、デバイスの負荷状況を判断する。スレッド割り当て制御部１０２は、デバイスの負荷状況に応じてユーザからのリクエストに基づいて起動するサーバスレッド１０６の同時実行数を制限する。【選択図】図１
2015194892.tif 000002
【特許請求の範囲】
【請求項１】
１人以上のユーザからのリクエストに基づいてデバイスへのアクセスを制御する情報処理装置であって、
前記デバイスへのアクセスの開始時刻および終了時刻を記録するアクセス記録部と、
前記開始時刻および終了時刻に基づく経過時間から、前記デバイスの負荷状況を判断する負荷状況解析部と、
前記デバイスの負荷状況に応じて前記ユーザからの前記リクエストの前記デバイスにアクセスするスレッドの同時実行数を制限するスレッド割り当て制御部と、
を備えることを特徴とする情報処理装置。
【請求項２】
前記リクエストのデータサイズを前記デバイスへのアクセス時間が一定時間内に収まる一定サイズに区切って前記デバイスへアクセスさせるリクエスト受信部をさらに備え、
前記アクセス記録部は、前記アクセスごとに、当該アクセスに対応する前記経過時間内で、前記一定時間ごとに前記デバイスに対する当該アクセスと他のアクセスの並列実行数をそれぞれ計数し、当該一定時間ごとの並列実行数の計数の結果から前記経過時間での並列実行数を算出し、
前記負荷状況解析部は、前記アクセスごとの前記経過時間での前記並列実行数から前記並列実行数ごとの経過時間を集計し、当該集計の結果に基づいて前記デバイスへのアクセス時の遅延が大きくならない範囲の前記並列実行数である同時アクセス可能数を算出し、
前記スレッド割り当て制御部は、前記同時アクセス可能数を超えないように前記ユーザからの前記リクエストの前記スレッドの同時実行数を制限する、
ことを特徴とする請求項１に記載の情報処理装置。
【請求項３】
前記一定サイズは、前記デバイスのファイルシステムのブロックサイズである、
ことを特徴とする請求項２に記載の情報処理装置。
【請求項４】
前記負荷状況解析部は、前記アクセスごとの前記アクセス時間と前記並列実行数の記録から、前記経過時間を算出できない並列実行数に関しては、前記アクセス時間と前記並列実行数の記録から補間演算により当該並列実行数に対応する前記経過時間を算出する、
ことを特徴とする請求項２または３のいずれかに記載の情報処理装置。
【請求項５】
前記スレッド割り当て制御部は、前記同時実行数を前記ユーザごとおよび前記ユーザの全体でそれぞれ計数し、前記ユーザの全体で計数された同時実行数が前記同時アクセス可能数を超えない範囲で前記リクエストを処理し、前記ユーザの全体で計数された同時実行数が前記同時アクセス可能数を超える前記リクエストがあった場合には、前記ユーザごとに計数された前記同時実行数が最も少ない前記ユーザに合わせて、他の前記ユーザからの前記リクエストの前記デバイスへの同時実行数を減少させる、
ことを特徴とする請求項２ないし４のいずれかに記載の情報処理装置。
【請求項６】
前記スレッド割り当て制御部は、優先される前記ユーザに対して、前記デバイスへの前記リクエストの同時実行数を優先的に割り当てる、
ことを特徴とする請求項２ないし５のいずれかに記載の情報処理装置。
【請求項７】
前記スレッド割り当て制御部は、過去の前記アクセスの量が少ないユーザに対して、前記デバイスへの前記リクエストの前記同時実行数を優先的に割り当てる、
ことを特徴とする請求項２ないし６のいずれかに記載の情報処理装置。
【請求項８】
請求項１ないし７のいずれかに記載の情報処理装置と、
前記ユーザが操作し前記情報処理装置に対して前記リクエストを発行する１台以上の端末装置と、
を含むことを特徴とする情報処理システム。
【請求項９】
１人以上のユーザからのリクエストに基づいてデバイスへのアクセスを制御する情報処理装置に、
前記デバイスへのアクセスの開始時刻および終了時刻を記録するアクセス記録処理と、
前記開始時刻および終了時刻に基づく経過時間から、前記デバイスの負荷状況を判断する負荷状況解析処理と、
前記デバイスの負荷状況に応じて前記ユーザからの前記リクエストの前記デバイスへのアクセスの同時実行数を制限するアクセス割り当て制御処理と、
を実行させるための情報処理装置の制御プログラム。
【請求項１０】
１人以上のユーザからのリクエストに基づいてデバイスへのアクセスを制御する情報処理装置に、
前記デバイスへのアクセスの開始時刻および終了時刻を記録するアクセス記録処理と、
前記開始時刻および終了時刻に基づく経過時間から、前記デバイスの負荷状況を判断する負荷状況解析処理と、
前記デバイスの負荷状況に応じて前記ユーザからの前記リクエストの前記デバイスへのアクセスの同時実行数を制限するアクセス割り当て制御処理と、
を実行させるための情報処理装置の制御方法。
【発明の詳細な説明】
【技術分野】
【０００１】
ユーザからのリクエストに基づいてデバイスへのアクセスを制御する情報処理装置、情報処理システム、情報処理装置の制御プログラム、および情報処理装置の制御方法に関する。
【背景技術】
【０００２】
ＮＦＳ（Ｎｅｔｗｏｒｋ  Ｆｉｌｅ  Ｓｙｓｔｅｍ）のような分散ファイルシステムでは、多くのクライアントマシンから同時にファイルアクセスが行われると、サーバマシンが高負荷となり、ファイルアクセス速度が大幅に低下する場合がある。これは主に、サーバマシンに接続しているディスク装置のアクセス競合により、ディスク待ち時間が長くなることが原因である。
【０００３】
ファイルアクセスを制御するための技術として、以下のような技術が知られている。
ユーザごとに使用できるパーセンテージを割り当て、そのユーザが実行する全アプリケーションのファクタを決定する。このファクタを任意のアプリケーションからの個々のデータ検索要求に関連付ける。データ要求のバッチごとに、割り当て済みのファクタに従って各データ要求の開始時刻を計算する。この結果、このバッチの全てのユーザによる開始時刻を、開始時刻の計算値に従って整列する。本システムでは、効率的に動作するために開始時刻の再調整が必要な場合はこれを実行する（例えば特許文献１に記載の技術）。
【０００４】
各データ管理装置に多重度が設定され、高い多重度では同時に処理できる検索要求数は多いが単一の検索要求に要する処理時間は長く、低い多重度では同時に処理できる検索要求数は少ないが単一の検索要求に要する処理時間は短い。サービスサーバ装置は、ユーザ端末からの検索要求ごとに処理時間を予想し、長い処理時間の検索要求は低い多重度のデータ管理装置に、短い処理時間の検索要求は高い多重度のデータ管理装置に割り当て、検索要求処理の効率を向上させる。短い処理時間の検索要求は、高い多重度のデータ管理装置において処理が短時間で完了し、同時に実行する検索処理の数が多すぎても、検索要求を同時実行しない時と比べて処理時間があまり長くならず、全体として同時実行できる検索処理の数が増える。（例えば特許文献２に記載の技術）。
【０００５】
また、ファイルアクセスを制御する技術としては、例えば特許文献３、４、および５に記載したものがある。
【先行技術文献】
【特許文献】
【０００６】
【特許文献１】特開２０００−１７２５４１号公報
【特許文献２】特開２０１０−１５２４３５号公報
【特許文献３】特開２００２−３５８２５９号公報
【特許文献４】特開２００６−６７４０１号公報
【特許文献５】特開２００７−１８８４５２号公報
【発明の概要】
【発明が解決しようとする課題】
【０００７】
分散ファイルシステムにおいて、１アクセスあたりの所要時間が単体アクセスと比較して何倍にも長く場合がある。これによって、特に高負荷時において、ユーザ間の公平性を確保することが問題となる。
【０００８】
そこで、本発明の１つの側面では、デバイスの負荷状況の変化に応じて、ユーザに対する公平な並列アクセス制御を実現することを目的とする。
【課題を解決するための手段】
【０００９】
態様の一例では、１人以上のユーザからのリクエストに基づいてデバイスへのアクセスを制御する情報処理装置であって、デバイスへのアクセスの開始時刻および終了時刻を記録するアクセス記録部と、開始時刻および終了時刻に基づく経過時間から、デバイスの負荷状況を判断する負荷状況解析部と、デバイスの負荷状況に応じてユーザからのリクエストのデバイスへのアクセスの同時実行数を制限するスレッド割り当て制御部と、を備える。
【発明の効果】
【００１０】
デバイスの負荷状況の変化に応じて、ユーザに対する公平な並列アクセス制御を実現することが可能となる。
【図面の簡単な説明】
【００１１】
【図１】本発明による分散ファイルシステムの実施形態の構成図である。
【図２】ファイルアクセスに対する経過時間ごとの並列実行数の算出の具体例を示す図である。
【図３】ユーザ全体およびユーザごとの実行中スレッド数の制御動作の説明図である。
【図４】リクエスト送信部の説明図である。
【図５】リクエストのデータフォーマット例を示す図である。
【図６】ＥＸＴ３（Ｔｈｉｒｄ  Ｅｘｔｅｎｄｅｄ）ファイルシステム(ブロックサイズ＝４ＫＢ)における、書き込みサイズ別の書き込み時間のグラフ例を示す図である。
【図７】リクエスト受信部１０１におけるリクエスト管理の説明図である。
【図８】ハッシュテーブルのデータ構成例を示す図である。
【図９】スレッド割り当て制御処理の詳細例を示すフローチャートである。
【図１０】集計テーブル１のデータ構成例を示す図である。
【図１１】ディスクアクセス処理の詳細例を示すフローチャートである。
【図１２】並列実行数の計算処理の詳細例を示すフローチャートである。
【図１３】集計テーブル２のデータ構成例を示す図である。
【図１４】同時アクセス可能数の計算処理の詳細例を示すフローチャートである。
【図１５】第２の実施形態におけるハッシュテーブルのデータ構成例を示す図である。
【図１６】第２の実施形態におけるスレッド割り当て制御処理の詳細例を示すフローチャートである。
【図１７】第３の実施形態におけるハッシュテーブルのデータ構成例を示す図である。
【図１８】第３の実施形態におけるスレッド割り当て制御処理の詳細例を示すフローチャートである。
【図１９】図１の機能を備える分散ファイルシステムを実現可能なサーバマシンのハードウェア構成例を示す図である。
【発明を実施するための形態】
【００１２】
分散ファイルシステムにおいて、ディスク装置に対して並列で多数のアクセスを行うと、１アクセスあたりの処理時間が、単体アクセス時と比較して何倍にも長くなり、ファイルシステムのレスポンス遅延が発生する。これにより、高負荷時においては、大量の入出力（ＩＯ）を行う利用者の処理により、比較的少量のＩＯを行うユーザの処理が大きく遅延する場合がある。従って、ユーザ間の公平性を確保する必要がある。
【００１３】
以下、本発明を実施するための形態について図面を参照しながら詳細に説明する。
図１は、本発明による分散ファイルシステムの実施形態の構成図である。この分散ファイルシステムは、例えばＲＡＩＤシステムを搭載する外部記憶装置であるディスク装置１２０に対して、共有アクセスを実行する分散ファイルシステムのサーバマシン１００を備える。そして、この分散ファイルシステムは、サーバマシン１００に対して、例えばＬＡＮ（ローカルエリアネットワーク）やインターネットであるネットワーク１３０を介して接続される１台以上の分散ファイルシステムのクライアントマシン１１０を備える。クライアントマシン１１０は、サーバマシン１００に対して、ディスク装置１２０にアクセスするためのリクエストを発行する。このリクエストは、例えばディスク装置１２０へのファイルデータの書き込み要求、ディスク装置１２０上のファイルデータの読み出し要求等である。
【００１４】
サーバマシン１００は、リクエスト受信部１０１、スレッド割り当て制御部１０２、ディスクアクセス時刻記録部１０３、ディスク負荷状況解析部１０４、アクセス時間の記録テーブル１０５、およびサーバスレッド１０６を備える。クライアントマシン１１０は、リクエスト送信部１１１を備える。
【００１５】
ディスクアクセス時刻記録部１０３（アクセス記録部）は、ディスク装置１２０（デバイス）へのアクセスの開始時刻および終了時刻を、例えばサーバマシン１００のメモリに記憶されるアクセス時間の記録テーブル１０５に記録する。ディスクアクセス時刻記録部１０３は、ユーザからのアクセスのリクエストが同時に複数ある場合は、それぞれの開始時刻および終了時刻を、例えばアクセス時間の記録テーブル１０５に記憶する。
【００１６】
ディスク負荷状況解析部１０４（負荷状況解析部）は、例えばアクセス時間の記録テーブル１０５に記録された開始時刻から終了時刻までの経過時間から、ディスク装置１２０の負荷状況を判断する。
【００１７】
スレッド割り当て制御部１０２は、ディスク装置１２０の負荷状況に応じて、ユーザからのリクエストのディスク装置１２０をアクセスするスレッドの同時実行数を制限する。このリクエストは例えば、ユーザが操作するクライアントマシン１１０内のリクエスト送信部１１１から送信され、ネットワーク１３０を介して、サーバマシン１００内のリクエスト受信部１０１で受信されて、スレッド割り当て制御部１０２に引き渡される。スレッド割り当て制御部１０２は、ディスク装置１２０に対してアクセスを行うためにサーバマシン１００上で実行されるサーバスレッド１０６の、ユーザごとのアクセスの同時実行数を制限する。
【００１８】
以上の構成により、ディスク負荷状況解析部１０４は、ディスク装置１２０の状況の変化に応じて、負荷状況を動的に解析することができる。ここで、ディスク装置１２０（デバイス）の状況とは、例えばアクセス数であり、これらによってディスク装置１２０のレスポンス性能等が刻々と変化する。本実施形態では、このように刻々と変化するディスク装置の状況ごとに算出される負荷状況に基づいてユーザからのディスク装置１２０へのリクエストの同時実行数を制限することにより、ユーザに対する公平な並列アクセス制御を実現する。これは、ディスク装置１２０にアクセスした時間から、ディスクアクセス時の遅延が大きくならない範囲の並列実行数（同時アクセス可能数）を計算して求めることが可能となったからである。
【００１９】
上述の構成で、リクエスト受信部１０１は、クライアントマシン１１０から送られてくるリクエストのデータを、ディスク装置１２０へのアクセス時間が一定時間内に収まる一定サイズごとに区切って、ディスク装置１２０へのアクセスリクエストを発行してよい。この制御により、アクセス時間にバラつきが発生することが防止される。一定時間は例えば１０ミリ秒程度であり、一定サイズは例えばディスク装置１２０のファイルシステムのブロックサイズである。
【００２０】
ディスクアクセス時刻記録部１０３は、サーバスレッド１０６で発行されるアクセスごとに、そのアクセスの開始時刻から終了時刻までの経過時間内で、上記一定時間ごとにディスク装置１２０に対する上記アクセスと他のアクセスの並列実行数をそれぞれ計数する。そして、ディスクアクセス時刻記録部１０３は、上記アクセスごとに、上記一定時間ごとの並列実行数の計数の結果から、例えば平均を算出することにより、上記アクセスに対応する経過時間全体での並列実行数を算出する。
【００２１】
ディスク負荷状況解析部１０４は、アクセスごとの経過時間での並列実行数がある程度集まった時点で、同時アクセス可能数を算出する。例えば、ディスク負荷状況解析部１０４は、アクセスごとの経過時間と並列実行数の中で、単体（１並列）のアクセスでの経過時間と比較して、Ｎ（Ｎ＞０）倍以下の経過時間となっている並列実行数を、ディスク装置１２０への同時アクセス可能数として決定する。すなわち、ディスク負荷状況解析部１０４は、同時アクセス可能数を決定することによって、ディスク装置１２０の負荷状況を判断していることになる。なお、ディスク負荷状況解析部１０４は、負荷状況の解析を、一定時間ごとに繰り返し行うことにより、刻々と変化し得るディスクの負荷状況を的確に捉えることができる。
【００２２】
スレッド割り当て制御部１０２は、例えばサーバスレッド１０６において、上記同時アクセス可能数を超えないように、その同時実行数を制限する。
【００２３】
ディスク負荷状況解析部１０４が同時アクセス可能数を決定した後、アクセス時間の記録テーブル１０５の記録はクリアされる。そして、スレッド割り当て制御部１０２が、決定された同時アクセス可能数でサーバスレッド１０６の同時実行数を制限する。ディスクアクセス時刻記録部１０３は再度、アクセスごとに、アクセス時間の記録テーブル１０５への記録を開始し、そのアクセスに対応する経過時間での並列実行数を算出する。ディスク負荷状況解析部１０４は、アクセスごとの経過時間での並列実行数が再度ある程度集まった時点で、並列実行数ごとの経過時間を集計し、その集計結果から同時アクセス可能数を再度算出する。このようにして、１回の同時アクセス可能数の計算でディスクアクセスの遅延が改善されなくても、複数回に渡って同時アクセス可能数が算出されてゆくことで、より正確にディスク装置１２０の負荷状況を判断することが可能となる。
【００２４】
このようにして同時アクセス可能数の計算が繰り返されることにより、ディスク装置１２０の状況の変化に応じたユーザごとの公平な並列アクセス制御が実現される。どのアクセスもその経過時間が単体アクセス時の経過時間のＮ倍以下となるように制御されることで、ユーザ間のアクセスの公平性が確保される。すなわち、実行中のスレッド数がシステムの許容する総実行数を超えない範囲でも、ユーザごとの並列アクセス数が制限されるので、高負荷ユーザのスレッド数が制限される。これによって、低負荷ユーザもディスク装置１２０にアクセス可能となるので、公平性が実現できる。ここで、ディスク装置１２０の状況とは、前述のユーザからのアクセス数に加えて、ＲＡＩＤシステムにおけるディスクの障害発生状況や、アクセスを発生させるリクエストの種別等を含む。さらに、本実施形態によれば、実行中のスレッド数（同時実行数）が制限されるので、１アクセスあたりの処理時間が長くなることを抑止できる。従って、ファイルシステムのレスポンス遅延の発生を低下させることができる。
【００２５】
図２は、ディスクアクセス時刻記録部１０３による、ファイルアクセスに対する経過時間ごとの並列実行数の算出の、具体例を示す図である。この例では、全てのアクセスのデータ長は同じに仮定されている。
【００２６】
図２の例では、ファイルアクセス１が実行開始されて１０ミリ秒後にファイルアクセス２の実行が開始されている。最初の０から１０ミリ秒の期間では同時実行数が１で、１０から３０ミリ秒の期間では同時実行数が２、３０から４０ミリ秒の期間では同時実行数が１となっている。ファイルアクセス１の経過時間は３０ミリ秒で、並列数は、１０ミリ秒単位で平均をとると、以下の計算式となる。
ファイルアクセス１の並列実行数＝（1+2+2）÷3＝1.67       経過時間30ミリ秒
【００２７】
同様に、
ファイルアクセス２の並列実行数＝（2+2+1）÷3＝1.67       経過時間30ミリ秒
ファイルアクセス３の並列実行数＝（1+1+1）÷3＝1          経過時間30ミリ秒
ファイルアクセス４の並列実行数＝（1+3+4+5）÷4＝3.25     経過時間40ミリ秒
ファイルアクセス５の並列実行数＝（3+4+5+4+4）÷5＝4      経過時間50ミリ秒
ファイルアクセス６の並列実行数＝（3+4+5+4+4）÷5＝4      経過時間50ミリ秒
ファイルアクセス７の並列実行数＝（4+5+4+4+2+2）÷6＝3.5  経過時間60ミリ秒
ファイルアクセス８の並列実行数＝（5+4+4+2+2）÷5＝3.4    経過時間50ミリ秒
・・・（１）式
【００２８】
図２の例において、ファイルアクセス３は、並列実行数の計算結果が１となって、図２からもわかるように、そのアクセスの経過時間全体にわたって単体（１並列）でのアクセスとなっている。また、図２の例では、ディスク装置１２０で同時に処理できるアクセスの数が２個と仮定した場合、図２で「待ち」と表示されている１０ミリ秒の期間では、ディスクアクセスがリクエスト受信部１０１が管理するメモリ上のリクエストキューで待たされることになる。これにより、例えばファイルアクセス４から８については、経過時間が、本来の３０ミリ秒よりも多くかかっている。
【００２９】
上述のファイルアクセス１から８に関する（１）式の計算例から、並列実行数とアクセスの経過時間の相関関係を取得することが可能となる。この相関関係は、並列実行数が多くなってシステムが許容する同時アクセス可能数を超えるアクセスが発生してアクセスの待ちが増えれば、アクセスの経過時間が長くなる関係となる。この相関関係より、どのアクセスにおいてもディスク装置１２０に対するアクセス遅延があまり大きくならないように制御するためには、例えば次のような制御が実行されればよい。ディスク装置１２０へのアクセスにおける並列実行数が、それに対応する経過時間が単体アクセスすなわち並列実行数＝１における経過時間のＮ倍、例えばＮ＝１．５倍もしくは２倍程度以内に収まる経過時間を有する並列実行数になるように制御されればよい。
【００３０】
一般に、ディスク装置１２０におけるアクセスの並列実行数が多くなると、アクセスあたりの処理時間が単体アクセス時に比較して一定値以上に長くなり、ファイルシステムのレスポンス遅れが発生する。これにより、ディスク装置１２０へのアクセスが高負荷ユーザに偏り、低負荷ユーザによるディスクアクセスが阻害される。本実施形態によりまず、
一定サイズごとに区切ってリクエストが発行されることにより、ディスク装置１２０における一アクセスあたりのアクセス時間を一定（例えば１０ミリ秒）にできる。これにより、上記各一定時間毎の並列実行数を正確に算出することが可能となる。そして、この並列実行数に基づいて同時アクセス可能数を制限することにより、アクセスの応答時間を単体アクセス時の応答時間のＮ倍以内に収まるように制御でき、かつその範囲以内で各ユーザのリクエストを公平に処理することが可能となる。このように、本実施形態では、ディスク装置１２０における並列実行数を制限しているのでリクエスト応答遅延を抑制でき、同時にリクエストの公平な処理によって、高負荷ユーザの並列実行数のみが多くならないように制御できる。  上述の（１）式の計算例において、並列実行数＝１となるときの経過時間は、ファイルアクセス３に対応する経過時間＝３０ミリ秒である。いま、例えばＮ＝１．５とすると、並列実行数＝１の経過時間の１．５倍は、３０×１．５＝４５ミリ秒となる。そこで、ディスク負荷状況解析部１０４は、ディスクアクセス時刻記録部１０３による上述の（１）式の計算例において、経過時間＝４５ミリ秒以下となる並列実行数のうちの最大値を選択する。この結果、（１）式の計算例において、ファイルアクセス４の経過時間＝４０ミリ秒に対応する並列実行数＝３．２５が選択される。前述したように、ディスク装置１２０に対するアクセス制御は、スレッド割り当て制御部１０２が、サーバスレッド１０６が同時に実行される数を制御することにより実現する。そこで、ディスク負荷状況解析部１０４は、上述の選択した並列実行数＝３．２５の整数部の値“３”を、同時アクセス可能数として決定し、スレッド割り当て制御部１０２に通知する。
【００３１】
スレッド割り当て制御部１０２は、通知された同時アクセス可能数＝３を超えないように、サーバスレッド１０６における同時実行数を制限する。
【００３２】
この後は、同時アクセス可能数が３と変更されて、メモリ上の上述の（１）式の計算結果に対応するアクセス時間の記録テーブル１０５の内容がクリアされる。そして、ファイルアクセスがある程度以上たまったら、再度上述のようにして同時アクセス可能数が計算され、同時アクセス可能数が妥当かどうかが判断される。
【００３３】
図１の分散ファイルシステムの構成において、スレッド割り当て制御部１０２は、サーバスレッド１０６における同時実行数をユーザごとおよびユーザの全体でそれぞれ計数してよい。その上で、スレッド割り当て制御部１０２は、ユーザの全体で計数された同時実行数がディスク負荷状況解析部１０４から通知された同時アクセス可能数を超えない範囲でリクエストを処理してよい。そして、スレッド割り当て制御部１０２は、ユーザの全体で計数された同時実行数が同時アクセス可能数を超えるリクエストがあった場合には、次の制御動作を実行してよい。スレッド割り当て制御部１０２は、ユーザごとに計数された同時実行数が最も少ないユーザに合わせて、他のユーザからのリクエストのサーバスレッド１０６における同時実行数を減少させる。
【００３４】
図３は、上述のユーザ全体およびユーザごとの実行中スレッド数（同時実行数）の制御動作の説明図である。
【００３５】
図１のユーザが操作するクライアントマシン１１０内のリクエスト送信部１１１からのリクエストに基づいて、リクエスト受信部１０１が例えば１０ミリ秒ごとに発行するリクエストごとに、スレッド割り当て制御部１０２がサーバスレッド１０６を起動する。スレッド割り当て制御部１０２は、ユーザごとおよびユーザ全体で、起動するサーバスレッド１０６の同時実行数を制限する。
【００３６】
より具体的には、スレッド割り当て制御部１０２は、リクエスト受信部１０１から新たに入力するリクエストに基づいてサーバスレッド１０６を起動するごとに、以下の制御動作を実行する。
【００３７】
まず、スレッド割り当て制御部１０２は、上記リクエストに付加されているユーザＩＤ  ３０１に対してハッシュ値を生成する処理３０２を実行する。例えば、ユーザＩＤの値“５３００”からハッシュ値“１”が生成される。
【００３８】
スレッド割り当て制御部１０２は、サーバマシン１００のメモリ上に記憶されるハッシュテーブル３０３上で、生成したハッシュ値をＩＮＤＥＸ項目に有するレコードを検索する。
【００３９】
スレッド割り当て制御部１０２は、ハッシュテーブル３０３上に該当するレコードが無い場合には、以下の処理を実行する。まず、スレッド割り当て制御部１０２は、ハッシュテーブル３０３上に新たにレコードを生成して、そのレコードのＩＮＤＥＸ項目に、上記ハッシュ値を登録する。さらに、スレッド割り当て制御部１０２は、上記ハッシュ値を生成させたユーザＩＤに対応する実行中スレッド数（同時実行数）を記憶する記憶領域３０４（３０４（＃１）、３０４（＃２）等）を確保する。なお、記憶領域３０４の初期値は０に設定される。そして、スレッド割り当て制御部１０２は、その生成した記憶領域３０４のアドレスへのポインタ値を、上記ハッシュテーブル３０３上で新たに生成したレコードのポインタ項目に登録する。そして、スレッド割り当て制御部１０２は、上記ポインタ値を取得する。例えば、ハッシュ値“１”に対して、記憶領域３０４（＃１）が確保され、ハッシュテーブル３０３上の新規レコードに、ハッシュ値“１”とポインタ値“０ｘ６０６８００００”が登録される。あるいは例えば、ハッシュテーブル３０３上の新規レコードに、ハッシュ値“２”に対して、記憶領域３０４（＃２）が確保され、ハッシュテーブル３０３上のレコードに、ハッシュ値“２”とポインタ値“０ｘ６０６７４０００”が登録される。ハッシュテーブル３０３上の他のレコードも同様である。
【００４０】
スレッド割り当て制御部１０２は、上記ハッシュ値をＩＮＤＥＸ項目に有するレコードをハッシュテーブル３０３上で検索できた場合には、そのレコードに登録されているポインタ値を取得する。
【００４１】
スレッド割り当て制御部１０２は、ハッシュテーブル３０３から取得したポインタ値が示すメモリ上のアドレスの記憶領域３０４に記憶されている、上記ハッシュ値を生成したユーザＩＤに対応する実行中スレッド数を＋１する。同時に、スレッド割り当て制御部１０２は、サーバマシン１００のメモリに記憶されている、ユーザ全体に対応する記憶領域３０５の実行中スレッド数を＋１する。
【００４２】
一方、スレッド割り当て制御部１０２は、サーバスレッド１０６によるディスク装置１２０へのアクセスが完了するごとに、以下の制御動作を実行する。
【００４３】
まず、スレッド割り当て制御部１０２は、アクセスが完了したサーバスレッド１０６に対応するユーザＩＤ  ３０１に対してハッシュ値を生成する処理３０２を実行する。
【００４４】
スレッド割り当て制御部１０２は、サーバマシン１００のメモリ上に記憶されるハッシュテーブル３０３上で、生成したハッシュ値をＩＮＤＥＸ項目に有するレコードを検索し、そのレコードに登録されているポインタ値を取得する。
【００４５】
スレッド割り当て制御部１０２は、アクセスが完了したので、ハッシュテーブル３０３から取得したポインタ値が示すメモリ上のアドレスの記憶領域３０４に記憶されている、上記ハッシュ値を生成したユーザＩＤに対応する実行中スレッド数を−１する。同時に、スレッド割り当て制御部１０２は、ユーザ全体に対応する記憶領域３０５の実行中スレッド数を−１する。
【００４６】
スレッド割り当て制御部１０２は、上述の実行中スレッド数の増減管理を実行するのに先だって、以下の制御処理を実行する。
【００４７】
スレッド割り当て制御部１０２は、＃１、＃２、・・・の各ユーザＩＤごとの記憶領域３０４の実行中スレッド数が、サーバマシン１００のメモリ上の記憶領域３０７に記憶されている１ユーザに割り当て可能な最大スレッド数を超えないように、制御を行う（図３の３０６）。
【００４８】
具体的には、スレッド割り当て制御部１０２は、リクエスト受信部１０１からリクエストが入力したときに、そのリクエストに付加されているユーザＩＤに対応する記憶領域３０４上の実行中スレッド数をハッシュテーブル３０３を介して参照する。
【００４９】
スレッド割り当て制御部１０２は、上記記憶領域３０４上の実行中スレッド数が記憶領域３０７の１ユーザに割り当て可能な最大スレッド数を超えていれば、入力したリクエストに基づくサーバスレッド１０６の起動は行わない。この場合、リクエストは、リクエスト受信部１０１においてサーバマシン１００のメモリ上に確保されているリクエストキューで待たされることになる。この制御動作により、少量のデータ処理を実行するユーザが大量のデータ処理を実行するユーザにリソースを奪われてしまうことが防止でき、ユーザ間の公平なアクセスが実現される。
【００５０】
一方、上記記憶領域３０４上の実行中スレッド数が記憶領域３０７の１ユーザに割り当て可能な最大スレッド数を超えていなければ、スレッド割り当て制御部１０２は以下の制御を行う。
【００５１】
スレッド割り当て制御部１０２は、記憶領域３０５に記憶されているユーザ全体の実行中スレッド数が、サーバマシン１００のメモリ上の記憶領域３０８に記憶されている同時アクセス可能数を超えないように、制御を行う（図３の３０６）。
【００５２】
スレッド割り当て制御部１０２は、リクエスト受信部１０１からのリクエストの入力時に、記憶領域３０５のユーザ全体の実行中スレッド数が記憶領域３０８の同時アクセス可能数を超えていなければ、入力したリクエストに基づいてサーバスレッド１０６を起動する。
【００５３】
一方、ユーザ全体の実行中スレッド数が同時アクセス可能数を超えている場合には、スレッド割り当て制御部１０２は、以下の制御動作を実行する。
【００５４】
スレッド割り当て制御部１０２は、ハッシュテーブル３０３を参照することにより、各ユーザの記憶領域３０４の実行中スレッド数のうち、最も少ない実行中スレッド数を取得し、その数を記憶領域３０７の１ユーザに割り当て可能な最大スレッド数として再設定する。
【００５５】
この結果、実行中スレッド数が多いユーザＩＤについては、その実行中スレッド数が上記再設定された１ユーザに割り当て可能な最大スレッド数以下となるように、リクエストのサーバスレッド１０６への投入が抑制される。すなわち、ユーザごとに計数された実行中スレッド数（同時実行数）が最も少ないユーザに合わせて、他のユーザからのリクエストのサーバスレッド１０６における実行中スレッド数が減少させられる。
【００５６】
このようにして、図３に例示される制御動作により、大量の入出力アクセスを行うユーザのリクエストが比較的少量の入出力アクセスを行うユーザのリクエストを大きく遅延させることのない実行中スレッド数（同時実行数）の制御が可能となる。この結果、ユーザ間のアクセスのさらなる公平性を確保することが可能となる。
【００５７】
以下に、図１の構成を有する本実施形態による分散ファイルシステムのさらに詳細な制御動作について説明する。
【００５８】
まず、クライアントマシン１１０内のリクエスト送信部１１１の詳細動作について説明する。
【００５９】
図４は、図１のクライアントマシン１１０内のリクエスト送信部１１１の説明図である。
【００６０】
ユーザが分散ファイルシステムにアクセス４０１Ａ、４０１Ｂ等を行った時に、リクエスト送信部１１１は、リクエスト４０２Ａ、４０２Ｂ等を作成して図１のサーバマシン１００に送信する。
【００６１】
リクエスト送信部１１１は、リクエスト４０２Ａ、４０２Ｂ等に、アクセス４０１Ａ、４０１Ｂ等を行ったユーザを特定できる情報（ユーザＩＤ）を付加する。これにより、サーバマシン１００のリクエスト受信部１０１で、どのユーザからのリクエストかを判定できる。
【００６２】
このユーザＩＤにより、図３で前述したように、スレッド割り当て制御部１０２は、サーバスレッド１０６を起動するときの実行中スレッド数（同時実行数）を、ユーザごとおよびユーザ全体の両方で制御することが可能となる。
【００６３】
図５は、図４のリクエスト４０２Ａ、４０２Ｂ等の具体的なデータフォーマット例を示す図である。リクエストのデータオフセット０の位置には、例えば書き込み（ｗｒｉｔｅ）または読み出し（ｒｅａｄ）を表すリクエスト種別の値が格納される。リクエストのデータオフセット８の位置には、例えば“５３００”などのユーザＩＤが格納される。リクエストのデータオフセット１６の位置には書き込みデータのデータ長を示す書き込みサイズが格納される。リクエストのデータオフセット２４の位置には、リクエスト種別が書き込みを表す場合に、ディスク装置１２０（図１）に書き込まれるべき書き込みデータが格納される。
【００６４】
次に、サーバマシン１００内のリクエスト受信部１０１の詳細動作について説明する。
クライアントマシン１１０からのリクエストは、データサイズ（例えば書き込み要求サイズ）が様々なため、そのままディスク装置１２０への書き込みを行うと、各処理時間にバラつきが生じて、ディスク装置１２０の負荷状況を正確に計算することができない。そこで、クライアントマシン１１０からのリクエストのサイズが異なってもディスク装置１２０への書き込み時間が均等となるように、リクエスト受信部１０１は、クライアントマシン１１０から受診したリクエストのデータを、アクセス時間が一定時間内に収まる一定サイズごとに区切って処理を行う。区切るサイズについては例えば、ディスク装置１２０のファイルシステムのブロックサイズ（一般的に４ＫＢ（キロバイト）の倍数）と同じ値としてよい。
【００６５】
ディスク装置１２０へのアクセス時間は、ブロックサイズの範囲内であれば、処理時間に大きな差はないことが、実測値から判明している。図６は、ディスク装置１２０がＥＸＴ３（Ｔｈｉｒｄ  Ｅｘｔｅｎｄｅｄ）ファイルシステム(ブロックサイズ＝４ＫＢ)である場合における、書き込みサイズ（ＫＢ：キロバイト）別の書き込み時間（秒）のグラフ例を示す図である。
【００６６】
このグラフ例から理解されるように、ブロックサイズ（４ＫＢ）以下の範囲では、ディスク装置１２０への書き込み時間に大きな差はない。このため、リクエスト受信部１０１は、クライアントマシン１１０からのリクエストを、ユーザが指定したサイズ（図４参照）ではなく、ブロックサイズで分割してディスク装置１２０への書き込みを行う。これにより、各ディスクアクセス時の処理時間を一定にして、ディスク装置１２０の負荷状況を正確に計算することが可能となる。
【００６７】
クライアントマシン１１０からのリクエストをブロックサイズ単位で分割して処理するために、リクエスト受信部１０１は、図７の説明図で示されるデータ構造で、リクエストを管理する。
【００６８】
図１で、リクエスト受信部１０１は、ユーザが操作するクライアントマシン１１０内のリクエスト送信部１１１からのリクエストを受信するごとに、次の制御動作を実行する。リクエスト受信部１０１は、サーバマシン１００内のメモリ上にユーザごとの記憶領域として確保しているリクエストキュー３０５（３０５Ａ、３０５Ｂ等）に、受信したリクエストのデータを、一定サイズ例えばブロックサイズ４ＫＢごとに区切って記憶（キューイング）する。
【００６９】
より具体的には、リクエスト受信部１０１は、受信したリクエストに付加されているユーザＩＤ  ７０１に対してハッシュ値を生成する処理７０２を実行する。例えば、受信されたリクエストＡに付加されているユーザＩＤの値“５３００”に対して（図４の４０２Ａ参照）、ハッシュ値“１”が生成される。
【００７０】
リクエスト受信部１０１は、サーバマシン１００のメモリ上に記憶されるハッシュテーブル７０３（図３のハッシュテーブル３０３とは異なる）上で、生成したハッシュ値をＩＮＤＥＸ項目に有するレコードを検索する。
【００７１】
リクエスト受信部１０１は、ハッシュテーブル７０３上に該当するレコードが無い場合には、以下の処理を実行する。まず、リクエスト受信部１０１は、ハッシュテーブル７０３上に新たにレコードを生成して、そのレコードのＩＮＤＥＸ項目に、上記ハッシュ値とユーザＩＤを登録する。さらに、リクエスト受信部１０１は、上記ハッシュ値を生成させたユーザＩＤに対応するリクエストを例えばブロックサイズごとに区切ったリクエストを記憶するリクエストキュー７０４（７０４Ａ、７０４Ｂ等）を確保する。そして、リクエスト受信部１０１は、その生成したリクエストキュー７０４の先頭アドレスを、上記ハッシュテーブル７０３上で新たに生成したレコードのアドレス項目に登録する。そして、リクエスト受信部１０１は、上記先頭アドレスを取得する。例えば、図４のリクエスト４０２Ａ内のユーザＩＤ“５３００”から生成されたハッシュ値“１”に対して、リクエストキュー７０４Ａが確保される。そして、ハッシュテーブル７０３上の新規レコードに、ハッシュ値“１”と、リクエストキュー７０４Ａの先頭アドレス“０ｘ７０６８００００”が登録される。あるいは例えば、図４のリクエスト４０２Ｂ内のユーザＩＤ“５４００”から生成されたハッシュ値“３”に対して、リクエストキュー７０４Ｂが確保される。そして、ハッシュテーブル７０３上の新規レコードに、ハッシュ値“３”と、リクエストキュー７０４Ｂの先頭アドレス“０ｘ７０６６５０００”が登録される。
【００７２】
リクエスト受信部１０１は、上記ハッシュ値をＩＮＤＥＸ項目に有するレコードをハッシュテーブル７０３上で検索できた場合には、そのレコードに登録されている先頭アドレスを取得する。
【００７３】
リクエスト受信部１０１は、受信したリクエストのデータを一定サイズ例えばブロックサイズ＝４ＫＢごとに区切った１つ以上のリクエストを生成し、それをハッシュテーブル７０３から取得した先頭アドレスが示すメモリ上のリクエストキュー７０４の末尾に登録する。例えば、図４のリクエスト４０２Ａ内のデータ長＝１０ＫＢの書き込みデータがブロックサイズ＝４ＫＢごとに区切られたリクエスト７０５Ａ−１（データ長＝４ＫＢ）、７０５Ａ−２（データ長＝４ＫＢ）、７０５Ａ−３（データ長＝２ＫＢ）が生成される。そして、それらのリクエスト７０５Ａ−１、７０５Ａ−２、７０５Ａ−３が、リクエスト４０２Ａに付加されているユーザＩＤに対応してハッシュテーブル７０３を介してアクセスされるリクエストキュー７０４Ａに順次登録される。あるいは例えば、図４のリクエスト４０２Ｂ内のデータ長＝５ＫＢの書き込みデータがブロックサイズ＝４ＫＢごとに区切られたリクエスト７０５Ｂ−１（データ長＝５ＫＢ）、７０５Ｂ−２（データ長＝１ＫＢ）が生成される。そして、それらのリクエスト７０５Ｂ−１、７０５Ｂ−２が、リクエスト４０２Ｂに付加されているユーザＩＤに対応してハッシュテーブル７０３を介してアクセスされるリクエストキュー７０４Ｂに順次登録される。
【００７４】
ここで、リクエストキュー７０４Ａ内の最後のリクエスト７０５Ａ−３やリクエストキュー７０４Ｂ内の最後のリクエスト７０５Ｂ−２は、データサイズ（データ長）がブロックサイズ＝４ＫＢにならず端数になっている。しかし、これらのリクエストの処理時間は、図６で説明したように、データサイズがブロックサイズ＝４ＫＢのときとほぼ同じ一定時間になっている。このように、本実施形態では、各リクエストによるディスクアクセス時の処理時間が一定にされることにより、ディスク装置１２０の負荷状況を正確に計算することが可能となる。
【００７５】
上述のようにして、リクエスト受信部１０１においてリクエストキュー７０４（７０４Ａ、７０４Ｂ等）が管理されることで、スレッド割り当て制御部１０２は、以下に説明するようにして、ユーザ単位、かつブロックサイズ単位に、ディスク装置１２０へのアクセスを実行することが可能となる。
【００７６】
次に、サーバマシン１００内のスレッド割り当て制御部１０２の詳細動作について説明する。
【００７７】
図８は、スレッド割り当て制御部１０２がサーバマシン１００のメモリ上に記憶するハッシュテーブル８０３のデータ構成例を示す図である。このハッシュテーブル８０３は、図３で説明したハッシュテーブル３０３と同じ機能を備える。ただし、図３で説明したユーザＩＤごとの実行中スレッド数の記憶領域３０４は、図８では、ハッシュテーブル８０３内に１項目として直接記憶され、ポインタ値の項目は省略されている。また、図３で説明したユーザ全体の実行中スレッド数の記憶領域３０５は、図８では、ハッシュテーブル８０３の末尾に記憶される。また、ハッシュテーブル８０３内の各レコードには、ハッシュ値を記憶するＩＮＤＥＸ項目に加えて、そのハッシュ値を生成させたユーザＩＤも一緒に記憶される。
【００７８】
スレッド割り当て制御部１０２は、リクエスト受信部１０１から入力したユーザＩＤごとおよび例えばブロックサイズ＝４ＫＢごとのリクエストについて、ユーザ単位に例えばラウンドロビン方式で、サーバスレッド１０６（図１）を割り当てる。スレッド割り当て制御部１０２は、ユーザＩＤごとに実行中スレッド数（割り当て済みのスレッド数）をハッシュテーブル８０３で管理し、ディスク装置１２０への同時アクセス可能数を超えてサーバスレッド１０６を割り当てないように制御を行う。
【００７９】
図９は、スレッド割り当て制御処理の例を示すフローチャートである。この処理は、サーバマシン１００のＣＰＵ（中央演算処理装置）が外部記憶装置等に記憶されたスレッド割り当て制御プログラムをメモリに読み出して実行する処理であり、上述したスレッド割り当て制御部１０２の機能を実行する。また、この処理は、サーバマシン１００上の分散ファイルシステムのメイン処理として動作する。
【００８０】
まず、メモリ上の変数Ｔａの値が大きな値９９９９９９に、変数Ｕｍａｘの値がＴａに、および変数Ｃｏｕｎｔの値が０に、それぞれ初期化される（ステップＳ９０１）。変数Ｔａは、図３の記憶領域３０８に対応し、同時アクセス可能数を保持する。変数Ｕｍａｘは、図３の記憶領域３０７に対応し、１ユーザに割り当て可能な最大スレッド数を保持する。変数Ｃｏｕｎｔは、図１のディスク負荷状況解析部１０４の機能である後述するステップＳ９０９の同時アクセス可能数の計算処理を実行する時間間隔を制御する変数である。この変数Ｃｏｕｎｔの値は、ステップＳ９０１で０に初期設定された後、１リクエストのアクセスが完了する毎にステップＳ９０７で＋１インクリメントされる。そして、ステップＳ９０８で変数Ｃｏｕｎｔの値が１０００に達したと判定されると、ステップＳ９０９の同時アクセス可能数の計算処理が実行され、その後、ステップＳ９１０で再び変数Ｃｏｕｎｔの値が０にリセットされ、以後同様の処理が繰り返される。
【００８１】
次に、リクエスト受信部１０１がメモリ上に生成したユーザ別のリクエストキュー７０４（７０４Ａ、７０４Ｂ、・・・）内の各々先頭のリクエストが、例えばラウンドロビン方式によって参照される（ステップＳ９０２）。
【００８２】
次に、メモリ上に生成されているハッシュテーブル８０３が参照されることにより、ステップＳ９０２で参照されたリクエストキュー７０４に対応するユーザＩＤの実行中スレッド数が取得される。そして、この実行中スレッド数が、変数Ｕｍａｘが保持する１ユーザに割り当て可能な最大スレッド数未満であるか否かが判定される（以上、ステップＳ９０３）。
【００８３】
ステップＳ９０３の判定がＹＥＳならばさらに、ハッシュテーブル８０３の末尾の記憶領域に記憶されているユーザ全体の実行中スレッド数が、変数Ｔａが保持する同時アクセス可能数未満であるか否かが判定される（ステップＳ９０４）。
【００８４】
ステップＳ９０４の判定もＹＥＳならば、ステップＳ９０２で参照されたユーザＩＤのリクエストに、サーバスレッド１０６（図１）が割り当てられる。その後、ハッシュテーブル８０３上の上記ユーザＩＤに対応するレコードの実行中スレッド数の値が＋１される。同時に、ハッシュテーブル８０３の末尾に記憶されているユーザ全体の実行中スレッド数も＋１される（以上、ステップＳ９０５）。
【００８５】
その後、ステップＳ９０２で参照されたユーザＩＤのリクエストに対してステップＳ９０５で割り当てられたサーバスレッド１０６によって、ディスクアクセス処理が実行される（ステップＳ９０６）。このディスクアクセス処理では、図１のディスクアクセス時刻記録部１０３の機能が実行される。この処理の詳細については、図９から図１１を用いて後述する。
【００８６】
上記リクエストに対応するディスクアクセス処理が完了すると、ハッシュテーブル８０３上の上記ディスクアクセス処理が終了したユーザＩＤに対応するレコードの実行中スレッド数の値が−１される。同時に、ハッシュテーブル８０３の末尾に記憶されているユーザ全体の実行中スレッド数も−１される。さらに、変数Ｃｏｕｎｔに１が加算される（以上、ステップＳ９０７）。
【００８７】
その後、変数Ｃｏｕｎｔの値が１０００に達したか否かが判定される（ステップＳ９０８）。
【００８８】
ステップＳ９０８の判定がＮＯならば、ステップＳ９０２の処理に戻って、次のリクエストに対する処理が実行される。
【００８９】
リクエストごとの処理が繰り返し実行されながらステップＳ９０７で変数Ｃｏｕｎｔの値がカウントアップされてゆき、変数Ｃｏｕｎｔの値が１０００に達すると、ステップＳ９０８の判定がＹＥＳとなる。
【００９０】
この結果、同時アクセス可能数の計算処理が実行される（ステップＳ９０９）。この処理では、図１のディスク負荷状況解析部１０４の機能が実行される。この処理の詳細については、図１２および図１３を用いて後述する。この処理の結果、変数Ｔａが保持する同時アクセス可能数が更新される。この変数Ｔａの値は、システム起動直後はステップＳ９０１にて大きな値に設定されてリクエストに対してサーバスレッド１０６を制限なく投入できる状態にされる。しかし、時間が経過して並列実行数が上がってくると、ステップＳ９０９の同時アクセス可能数の計算処理によって、変数Ｔａが保持する同時アクセス可能数はディスク装置１２０の現在の負荷状況に応じた適切な値、例えば“３”などに制限される。
【００９１】
同時アクセス可能数が計算されると、変数Ｃｏｕｎｔの値が０にリセットされ、変数Ｕｍａｘが保持する１ユーザに割り当て可能な最大スレッド数として、ステップＳ９０９で変数Ｔａに新たに保持された同時アクセス可能数がセットされる。すなわち、同時アクセス可能数が更新された直後は、各ユーザに公平に同時アクセス可能数までサーバスレッド１０６を割り当てることが可能な状態になる。
【００９２】
その後、ステップＳ９０２の処理に戻って、次のリクエストに対する処理が実行される。
【００９３】
上述の処理で、ステップＳ９０２で参照されたリクエストキュー７０４に対応するユーザＩＤの実行中スレッド数が変数Ｕｍａｘが保持する１ユーザに割り当て可能な最大スレッド数に達しステップＳ９０３の判定がＮＯになると、サーバスレッド１０６は起動されない。この場合、上記リクエストはリクエストキュー７０４で待たされることになる。その後、ステップＳ９０２の処理に戻って、次のユーザＩＤのリクエストに対する処理が実行される。変数Ｕｍａｘに基づくユーザごとの実行中スレッド数の制限動作により、少量のデータ処理を実行するユーザが大量のデータ処理を実行するユーザにリソースを奪われてしまうことが防止できる。これにより、ユーザ全体の実行中のスレッド数が所定数（例えばＴａ）を超えない範囲でも、ユーザ間の公平なアクセスが実現される。
【００９４】
上述の処理で、ユーザ全体の実行中スレッド数が変数Ｔａが保持する同時アクセス可能数に達してステップＳ９０４の判定がＮＯになると、以下の制御動作が実行される。ハッシュテーブル８０３が参照されることにより、各ユーザＩＤごとの実行中スレッド数のうち最も少ない実行中スレッド数が取得され、その数が変数Ｕｍａｘの１ユーザに割り当て可能な最大スレッド数として再設定される（ステップＳ９１１）。この結果、ステップＳ９０３において、実行中スレッド数が多いユーザＩＤについては、その実行中スレッド数が上記再設定された変数Ｕｍａｘの値未満となるように、リクエストからのサーバスレッド１０６の起動が抑制される。すなわち、ユーザごとに計数された実行中スレッド数（同時実行数）が最も少ないユーザに合わせて、他のユーザからのリクエストのサーバスレッド１０６における実行中スレッド数が減少させられる。ステップＳ９１１の処理により、比較的少量の入出力を行うユーザのリクエストも処理される可能性が高まる。従って、ステップＳ９１１の処理により、ユーザ全体の実行中のスレッド数が所定数（例えばＴａ）を超えた場合でも、ユーザ間の公平なアクセスが実現される。
【００９５】
このようにして、図３に例示される制御動作により、大量の入出力アクセスを行うユーザのリクエストが比較的少量の入出力アクセスを行うユーザのリクエストを大きく遅延させることのない実行中スレッド数（同時実行数）の制御が可能となる。この結果、ユーザ間のアクセスのさらなる公平性を確保することが可能となる。
【００９６】
なお、ステップＳ９１１において、変数Ｕｍａｘの値は、必ずしも実行中スレッド数が最も少ないユーザＩＤに対応する値に設定される必要はなく、現在の変数Ｕｍａｘの値よりも小さい値になるように、その値が制御されてもよい。
【００９７】
次に、図１のディスクアクセス時刻記録部１０３の詳細動作について説明する。
前述したように、ディスクアクセス時刻記録部１０３は、ディスク装置１２０へのアクセスの開始時刻（ディスクアクセス開始時刻１００１）および終了時刻（ディスクアクセス終了時刻１００２）を、例えば図１０に例示される集計テーブル１に記録してゆく。そして、ディスクアクセス時刻記録部１０３は、これらのアクセス時刻から、経過時間１００３と並列実行数１００４を算出して、集計テーブル１に保存する。
【００９８】
図１１は、図９のステップＳ９０６のディスクアクセス処理の詳細例を示すフローチャートである。この処理では、図１０のデータ構成例を有する集計テーブル１を制御するディスクアクセス時刻記録部１０３の機能が実行される。
【００９９】
図９のステップＳ９０６が呼び出されるとまず、集計テーブル１に新たなレコードが生成される。そして、現在時刻が、そのレコードのディスクアクセス開始時刻１００１の項目に書き込まれる（ステップＳ１１０１）。
【０１００】
次に、図９のステップＳ９０５で割り当てられたサーバスレッド１０６によって、ディスクアクセス処理が実行される（ステップＳ１１０２）。
【０１０１】
ステップＳ１１０２のディスクアクセス処理が完了すると、現在時刻が、集計テーブル１のステップＳ１１０１で生成されたレコードのディスクアクセス終了時刻１００２の項目に書き込まれる。さらに、そのレコードにおいて、ディスクアクセス終了時刻１００２の項目値からディスクアクセス開始時刻１００１の項目値が減算され、その減算結果が同じレコードの経過時間１００３の項目に書き込まれる（以上、ステップＳ１１０３）。
【０１０２】
その後、並列実行数の計算処理が実行される（ステップＳ１１０４）。この計算処理の例は、図１２のフローチャートで示される。
【０１０３】
図１２においてまず、サーバマシン１００のメモリ上の変数Ｌｉに、チェック単位として例えば１０ミリ秒の時間値が設定される。また、メモリ上の変数Ｔｓに図１１のステップＳ１１０１で設定された集計テーブル１上のレコードのディスクアクセス開始時刻１００１の項目値が初期設定される。同様に、メモリ上の変数Ｔｅに図１１のステップＳ１１０３で設定された集計テーブル１上の上記レコードのディスクアクセス終了時刻１００２の項目値が初期設定される。さらに、並列実行数の合計値を格納するメモリ上の変数Ｔｏｔａｌに、初期値０が設定される。加えて、例えば１０ミリ秒単位の区間数をカウントするメモリ上の変数Ｃｎｔに、初期値０が設定される（以上、ステップＳ１２０１）。
【０１０４】
次に、例えば１０ミリ秒単位の区間ごとに、ステップＳ１２０２からＳ１２０３の処理が実行される。
【０１０５】
まず、図１０のデータ構成例を有する集計テーブル１の各レコードのディスクアクセス開始時刻１００１からディスクアクセス終了時刻１００２の各時間範囲が参照される。そして、各時間範囲のうち、変数Ｔｓの時刻値から（変数Ｔｓの時刻値＋変数Ｌｉの時間値）で求まる時刻値までの例えば１０ミリ秒の時間範囲を含む時間範囲の個数がカウントされることにより、同時実行されたディスクアクセス数がカウントされる。そして、そのカウント値が、変数Ｔｏｔａｌに加算される（以上、ステップＳ１２０２）。この処理により、変数Ｔｓの時刻値から（変数Ｔｓの時刻値＋変数Ｌｉの時間値）で求まる時刻値までの例えば１０ミリ秒の時間範囲における並列実行数がカウントされる。
【０１０６】
その後、変数Ｃｎｔに１が加算され、変数Ｔｓの時刻値に変数Ｌｉの時間値が加算されて変数Ｔｓの新たな時刻値とされる（以上、ステップＳ１２０３）。この時刻値は、次の例えば１０ミリ秒の時間範囲の先頭時刻を示す。
【０１０７】
その後、変数Ｔｓの時刻値が、変数Ｔｅが示すディスクアクセス終了時刻１００２の項目値に到達したか否かが判定される（ステップＳ１２０４）。
【０１０８】
ステップＳ１２０４の判定がＮＯならば、ステップＳ１２０２に戻って、次の例えば１０ミリ秒の時間範囲での並列実行数のカウント処理が繰り返される。
【０１０９】
ステップＳ１２０４の判定がＹＥＳになると、変数Ｔｏｔａｌに格納されている全ての例えば１０ミリ秒区間の並列実行数の合計値が、変数Ｃｎｔの例えば１０ミリ秒の時間範囲の区間数で除算され、その除算結果が四捨五入される。そして、その計算結果が、図１０のデータ構成例を有する集計テーブル１の、図９のステップＳ１１０１で生成されたレコードの並列実行数１００４の項目に書き込まれる。
【０１１０】
その後、図１２のフローチャートの処理が終了し、図１１のステップＳ１１０４の並列実行数の計算処理が終了する。この結果、図１１のディスクアクセス処理のフローチャートが終了し、図９のステップＳ９０６のディスクアクセス処理が終了する。
【０１１１】
以上のようにして、図１のディスクアクセス時刻記録部１０３の機能が実現される。
【０１１２】
上述のディスクアクセス処理により図１０のデータ構成例を有する集計テーブル１に集計されるデータは、図２の説明において前述した（１）式の計算と同等の計算により得られるデータである。ただし、集計テーブル１に集計されるレコードごと（アクセスごと）の並列実行数は、後述する集計テーブル２を用いた同時アクセス可能数の計算処理を容易にするために、自然数値に四捨五入される。
【０１１３】
次に、図１のディスク負荷状況解析部１０４の詳細動作について説明する。
図１０のデータ構成例を有する集計テーブル１から、並列実行数別に経過時間の平均値が計算されて、図１３（ａ）のデータ構成例を有する集計テーブル２が、サーバマシン１００のメモリ上に作成される。
【０１１４】
まず、並列実行数＝１について見ると、図１０の集計テーブル１上には並列実行数１００４の項目値が１のレコードは、１つのみである。そこでまず、図１３の集計テーブル２上に新たに生成されたレコードの並列実行数１３０１の項目に１が書き込まれる。続いて、図１０の集計テーブル１上で並列実行数１００４の項目値が１であるレコードの経過時間１００３の項目値＝０．０２１２１９が、図１３の集計テーブル２上の並列実行数１３０１の項目値が１のレコードの経過時間の平均１３０２の項目に書き込まれる。
【０１１５】
次に、並列実行数＝２について見ると、図１０の集計テーブル１上には並列実行数１００４の項目値が２のレコードは、最初の２つのレコードである。そこでまず、図１３の集計テーブル２上に新たに生成されたレコードの並列実行数１３０１の項目に２が書き込まれる。続いて、図１０の集計テーブル１上で並列実行数１００４の項目値が２である２つのレコードの経過時間１００３の各項目値＝０．０３０２９８，０．０２５８１９の平均値＝０．０２８０５８５が計算される。そして、その平均値＝０．０２８０５８５が、図１３の集計テーブル２上の並列実行数１３０１の項目値が２のレコードの経過時間の平均１３０２の項目に書き込まれる。また、この平均値＝０．０２８０５８５を、集計テーブル２上の並列実行数１３０１の項目値が１のレコードの経過時間の平均１３０２の項目値＝０．０２１２１９で除算した結果値＝１．３２が、集計テーブル２上の並列実行数１３０１の項目値が２のレコードの経過時間の倍率１３０３の項目に書き込まれる。この値１．３２は、並列実行数＝１の経過時間の平均１３０２に対する、並列実行数＝２の経過時間の平均１３０２の、時間倍率を示している。
【０１１６】
さらに、並列実行数＝３について見ると、図１０の集計テーブル１上には並列実行数１００４の項目値が３のレコードは、最後の３つのレコードである。そこでまず、図１３の集計テーブル２上に新たに生成されたレコードの並列実行数１３０１の項目に３が書き込まれる。続いて、図１０の集計テーブル１上で並列実行数１００４の項目値が３である３つのレコードの経過時間１００３の各項目値＝０．０５８３１１，０．０６０４３１，０．０６３５２１の平均値＝０．０６０７５４３が計算される。そして、その平均値＝０．０６０７５４３が、図１３の集計テーブル２上の並列実行数１３０１の項目値が３のレコードの経過時間の平均１３０２の項目に書き込まれる。また、この平均値＝０．０６０７５４３を、集計テーブル２上の並列実行数１３０１の項目値が１のレコードの経過時間の平均１３０２の項目値＝０．０２１２１９で除算した結果値＝２．８６が、集計テーブル２上の並列実行数１３０１の項目値が２のレコードの経過時間の倍率１３０３の項目に書き込まれる。この値２．８６は、並列実行数＝１の経過時間の平均１３０２に対する、並列実行数＝３の経過時間の平均１３０２の、時間倍率を示している。
【０１１７】
ここで、ディスク装置１２０の高負荷時のレスポンス低下をＮ倍、例えば２倍までに抑えるためには、次のような制御が実行されればよい。ディスク装置１２０へのアクセスにおける並列実行数が、それに対応する経過時間が単体アクセスすなわち並列実行数＝１における経過時間のＮ＝例えば２倍以内に収まる並列実行数になるように制御されればよい。図１３の集計テーブル２の経過時間の倍率１３０３の項目を見た場合、並列実行数１３０１の項目値＝２の時は２倍以内であり（１．３２倍）、並列実行数１３０１の項目値＝３の時は２倍を超えている（２．８６倍）。従って、図１３の集計テーブル２の例の場合、レスポンス低下しない範囲での並列実行数１３０１の項目値は２となり、これが同時アクセス可能数として決定される。
【０１１８】
ユーザのアクセスパターンによっては、並列実行数１３０１の一部の項目値に対して、経過時間の平均１３０２の項目値が得られない場合がある。例えば図１３（ｂ）に示される集計テーブル２の場合、並列実行数１３０１の項目値＝２および３の各経過時間の平均１３０２が０となって得られておらず、それぞれに対応する経過時間の倍率１３０３の項目値も計算できていない。これらの値は、次式のように、並列実行数１３０１の項目値＝１と経過時間の平均１３０２の項目値＝０．０２１２１９、および並列実行数１３０１の項目値＝４と経過時間の平均１３０２の項目値＝０．０８０２５３４からの線形補間で算出される。
並列実行数２の倍率＝（3.78倍−1倍）÷3×1＋1倍＝1.92倍
並列実行数３の倍率＝（3.78倍−1倍）÷3×2＋1倍＝2.85倍
【０１１９】
なお、並列実行数＝１に対応する経過時間の平均１３０２の項目値が無いと、基準となる経過時間が不明なため、この場合は、並列実行数＝１のデータが得られるまで、同時アクセス可能数の変更は行われないように制御されてよい。
【０１２０】
いま例えば、同時アクセス可能数が２に変更された後に再度ディスクアクセスが行われて集計テーブル２が作成された場合、図１３（ｃ）に例示されるように、並列実行数は２までの経過時間の平均１３０２の項目値しか得られない。これは、スレッド割り当て制御部１０２での制御により、並列実行数が２を超えないようにサーバスレッド１０６の割り当てが制御されているためである。
【０１２１】
このようなケースでは、並列実行数が３以上の時に、経過時間がどれくらいになるかが分からない。そのため、ここでも線形補間が実行され、並列実行数＝１の時と比較して、Ｎ＝例えば２倍を超える倍率まで、次式のようにして、経過時間の平均１３０２の項目値が計算される。
並列実行数３の倍率＝（1.32倍−1倍）÷1×2＋1倍＝1.64倍
並列実行数４の倍率＝（1.32倍−1倍）÷1×3＋1倍＝1.96倍
【０１２２】
上述のようにして、同時アクセス可能数より上の並列実行数を線形補間することで、同時アクセス可能数が小さ過ぎる場合（減らしすぎた場合やディスク装置１２０の処理に余裕がある場合）では、どのくらいまで同時アクセス可能数を増やせばよいかが判断可能となる。
【０１２３】
図１４は、図９のステップＳ９０９で実行される同時アクセス可能数の計算処理の詳細例を示すフローチャートである。この処理では、図１３のデータ構成例を有する集計テーブル２を制御するディスク負荷状況解析部１０４の機能が実行される。
【０１２４】
まず、図１０に例示される集計テーブル１に集計されている並列実行数１００４の項目値の中で、最大値がサーバマシン１００のメモリ上の変数Ｍｘに設定される。また、集計テーブル２に集計を行うときの並列実行数１３０１の項目値を指示する変数Ｈｅに１が設定される（以上、ステップＳ１４０１）。
【０１２５】
次に、図１０の集計テーブル１の並列実行数１００４の項目値の中で、変数Ｈｅの値と同じ並列実行数を有するレコードの経過時間１００３の項目値が集計される（ステップＳ１４０２）。いま、Ｈｅ＝１ならば、図１０の集計テーブル１上で並列実行数１００４の項目値が１であるレコードの経過時間１００３の項目値＝０．０２１２１９が集計値として得られる。Ｈｅ＝２ならば、図１０の集計テーブル１上で並列実行数１００４の項目値が２である２つのレコードの経過時間１００３の各項目値＝０．０３０２９８と０．０２５８１９が集積されて、集計値０．０５６１１７が得られる。Ｈｅ＝３ならば、図１０の集計テーブル１上で並列実行数１００４の項目値が３である３つのレコードの経過時間１００３の各項目値＝０．０５８３１１と０．０６０４３１と０．０６３５２１が集計されて、集計値０．１８２２６３が得られる。
【０１２６】
次に、集計された経過時間が０（変数Ｈｅの値に対応するデータが無い）か否かが判定される（ステップＳ１４０３）。
【０１２７】
集計された経過時間が０ではなくステップＳ１４０３の判定がＮＯならば、ステップＳ１４０２で集計された経過時間が集計された件数で割られて、平均値が計算される。Ｈｅ＝１ならば、集計値０．０２１２１９が件数＝１で割られて、平均値０．０２１２１９が計算される。Ｈｅ＝２ならば、集計値０．０５６１１７が件数＝２で割られて、平均値０．０２８０５８５が計算される。Ｈｅ＝３ならば、集計値０．１８２２６３が件数＝３で割られて、平均値０．０６０７５４３が計算される。そして、変数Ｈｅが示す並列実行数と、上記平均値が、図１３（ａ）に例示される集計テーブル２の各レコードの並列実行数１３０１と経過時間の平均１３０２の各項目値として書き込まれる。さらに、各レコードの経過時間の平均１３０２の項目値を、並列実行数１３０１の項目値＝１のレコードに対する経過時間の平均１３０２の項目値で割った値が、各レコードの経過時間の倍率１３０３の項目値として書き込まれる（以上、ステップＳ１４０４）。
上記計算例では、並列実行数＝１と経過時間の平均＝０．０２１２１９と経過時間の倍率＝１が、集計テーブル２に書き込まれる。また、並列実行数＝２と経過時間の平均＝０．０２８０５８５と経過時間の倍率＝１．３２が、集計テーブル２に書き込まれる。さらに、並列実行数＝３と経過時間の平均＝０．０６０７５４３と経過時間の倍率＝２．８６が、集計テーブル２に書き込まれる。
【０１２８】
その後、変数Ｈｅに１が加算される（ステップＳ１４０５）。
【０１２９】
そして、変数Ｈｅの値が集計テーブル１上の並列実行数１００４の項目値の最大値を示す変数Ｍｘの値に到達したか否かが判定される（ステップＳ１４０６）。
【０１３０】
ステップＳ１４０６の判定がＮＯならば、ステップＳ１４０２の処理に戻り、変数Ｈｅが示す次の並列実行数に対する集計処理が繰り返される。
【０１３１】
ステップＳ１４０２からＳ１４０６の繰り返し処理において、ステップＳ１４０２で集計された経過時間が０、すなわち変数Ｈｅの値に対応する並列実行数１００４の項目値が集計テーブル１に無い場合は、ステップＳ１４０３の判定がＹＥＳとなる。この場合には、変数Ｈｅの値が１であるか否かが判定される（ステップＳ１４０９）。
【０１３２】
変数Ｈｅの値が１ではなくステップＳ１４０９の判定がＮＯならば、変数Ｈｅの値が示す並列実行数の集計は無視され、ステップＳ１４０５に進んで、次の並列実行数の集計処理に移行する。
【０１３３】
変数Ｈｅの値が１でステップＳ１４０９の判定がＹＥＳならば、同時アクセス可能数の計算の基準となる並列実行数＝１に対応する経過時間１００３の項目値が集計テーブル１から得られない。この場合は、図１４のフローチャートの処理を終了し図９のステップＳ９０９の同時アクセス可能数の計算処理が終了して、並列実行数＝１のデータが得られるようになるので同時アクセス可能数の変更は行われないように制御される。
【０１３４】
ステップＳ１４０６の判定がＹＥＳになって集計テーブル１から集計テーブル２への集計が終了すると、ステップＳ１４０３の判定がＹＥＳとなった並列実行数については、図１３（ｂ）や（ｃ）で前述したように、線形補間処理によって経過時間の平均１３０２の項目値が計算される。その後、集計テーブル２の各レコードの経過時間の倍率１３０３が参照されることにより、この倍率がＮ倍以内となるレコードのうち並列実行数１３０１の項目値の最大値が求められる。そして、この値が同時アクセス可能数として、変数Ｔａに設定される（以上、ステップＳ１４０７）。
【０１３５】
最後に、図１０に例示される集計テーブル１と図１３に例示される集計テーブル２の内容がクリアされて（ステップＳ１４０８）、図１４のフローチャートの処理が終了し、図９のステップＳ９０９の同時アクセス可能数の計算処理が終了する。
【０１３６】
上述したように、一部の並列実行数のデータが無い場合は、線形補間で値が算出されるため、必ずしも最適な同時アクセス可能数が得られるとは限らない。また、ユーザのアクセスパターン（ランダムアクセス、シーケンシャルアクセス等）や、ディスク性能のバラつき（ＲＡＩＤ構成の一部ディスク故障による一時的な性能低下等）によって、同時アクセス可能数の適切な値は変化する可能性がある。そのため、一度決定した同時アクセス可能数の値を定期的に見直す必要がある。この定期的に見直す処理については、図９のフローチャートの変数Ｃｏｕｎｔにより行っている。図９のフローチャートのステップＳ９０８では変数Ｃｏｕｎｔが１０００に到達すると、ステップＳ９０９の同時アクセス可能数の計算処理が実行されるが、この値を変更することで同時アクセス可能数の見直しを行う頻度が調整可能である。
【０１３７】
図８で説明したスレッド割り当て制御部１０２において、全ユーザを公平に扱うのではなく、優先ユーザにはスレッドを優先して多く割り当てる制御を行ってよい。このような制御を行うことで、一般ユーザよりシステム管理者（ｒｏｏｔユーザ等）を優先することが可能となる。
【０１３８】
具体的には、各ユーザの実行中スレッド数の上限を抑える処理において、優先ユーザの場合は、上限を抑えないように制御されてよい。但し、優先ユーザによるディスク装置１２０の処理遅延を防止するために、ユーザ全体での同時アクセス可能数を超える場合は、優先ユーザであっても実行中スレッド数の上限を抑える制御が行われてよい。
【０１３９】
図１５は、上述の優先ユーザに対する制御動作を実現するための第２の実施形態として、図１のスレッド割り当て制御部１０２がサーバマシン１００のメモリ上に記憶するハッシュテーブル１５０１のデータ構成例を示す図である。ハッシュテーブル１５０１は、図８で前述したハッシュテーブル８０３に対して、濃く塗りつぶされたユーザ種別項目が追加されている。ユーザ種別の項目値としては例えば、“一般”と“優先”が設定できる。
【０１４０】
図１６は、上述の優先ユーザに対する制御動作を実現するための第２の実施形態における、スレッド割り当て制御処理の例を示すフローチャートである。図１６において、前述した図９のフローチャートと同じ処理を実行するステップには、同じ参照番号を付してある。図１６のフローチャートの処理が図９のフローチャートの処理と異なる部分は、ステップＳ９０３の判定がＮＯとなったときの制御処理である。
【０１４１】
図１６において、ステップＳ９０２で参照されたリクエストキュー７０４に対応するユーザＩＤの実行中スレッド数が変数Ｕｍａｘが保持する１ユーザに割り当て可能な最大スレッド数に達しステップＳ９０３の判定がＮＯになると、ステップＳ１６０１が実行される。ステップＳ１６０１では、図１５のデータ構成例を有するハッシュテーブル８０３上で、現在処理しているユーザＩＤに対応するユーザ種別の項目値が参照される。そして、その項目値が“優先”であるか否かが判定される（ステップＳ１６０１）。
【０１４２】
項目値が“優先”ではなく“一般”で（例えば図１５のユーザＩＤが０以外）、ステップＳ１６０１の判定がＮＯならば、図９のフローチャートの場合と同様に、サーバスレッド１０６は起動されない。
【０１４３】
一方、項目値が“優先”で（例えば図１５のユーザＩＤ＝０（ｒｏｏｔユーザ等））、ステップＳ１６０１の判定がＹＥＳならば、ステップＳ９０４に処理が戻されて、サーバスレッド１０６の割り当てが可能とされる。ただし、ユーザ全体の実行中スレッド数が変数Ｔａが保持する同時アクセス可能数に達してステップＳ９０４の判定がＮＯになると、図９の場合と同様の制御処理が実行されて、優先ユーザに対するサーバスレッド１０６の割り当てが抑制される。
【０１４４】
以上のようにして、第２の実施形態の制御動作により、ディスク装置１２０に対する実行中スレッド数の制御処理によって、システム管理者等の優先ユーザの処理に支障がきたすことを防止することが可能となる。
【０１４５】
図８で説明したスレッド割り当て制御部１０２において、各ユーザにラウンドロビンでスレッドを割り当てるのではなく、過去のファイルアクセス量（以下「ＩＯ量」と記載する）によって、ＩＯ量が少ないユーザに優先してスレッドを割り当てる制御を行ってよい。このような制御を行うことで、ＩＯ量が多いユーザによる影響で、ＩＯ量が少ないユーザの遅延が発生する確率を下げることが可能となる。
【０１４６】
具体的には、各ユーザの実行中スレッド数の上限を抑える処理において、ラウンドロビンではなく、過去のＩＯ量が最も少ないユーザにスレッドが割り当てられるように制御されてよい。ただし、過去一時的にＩＯ量が多かったユーザに対して、スレッドが割り当てられない状態が発生することを防止するため、ＩＯ量は定期的にクリアされてよい。
【０１４７】
図１７は、上述のＩＯ量に基づく制御動作を実現するための第３の実施形態として、図１のスレッド割り当て制御部１０２がサーバマシン１００のメモリ上に記憶するハッシュテーブル１７０１のデータ構成例を示す図である。ハッシュテーブル１７０１は、図８で前述したハッシュテーブル８０３に対して、濃く塗りつぶされたＩＯ量項目が追加されている。ＩＯ量の項目値はバイト単位で設定できる。
【０１４８】
図１８は、上述のＩＯ量に基づく制御動作を実現するための第３の実施形態における、スレッド割り当て制御処理の例を示すフローチャートである。図１８において、前述した図９のフローチャートと同じ処理を実行するステップには、同じ参照番号を付してある。図１８のフローチャートの処理が図９のフローチャートの処理と異なる部分は、ステップＳ９０２′、ステップＳ９０７′、およびステップＳ９１０′であり、それぞれ図９のステップＳ９２、ステップＳ９０７、およびステップＳ９１０を置き換える処理である。
【０１４９】
図９のステップＳ９０２では、リクエスト受信部１０１がメモリ上に生成した図７に例示されるユーザ別のリクエストキュー７０４（７０４Ａ、７０４Ｂ、・・・）内のリクエストが、例えばラウンドロビン方式によって参照された。これに対して、図１８のステップＳ９０２′では、図１７のデータ構成例を有するハッシュテーブル１７０１において、ＩＯ量の項目値が最も小さいユーザＩＤに対応するリクエストキュー７０４内のリクエストが参照される。
【０１５０】
図１８のステップＳ９０７′では、図９のステップＳ９０７の処理に加えて、次の処理が実行される。図１７のデータ構成例を有するハッシュテーブル１７０１において、ステップＳ９０６のディスクアクセス処理を実行したユーザＩＤに対応するＩＯ量の項目値に、今回のディスクアクセスでのＩＯ量が加算される。
【０１５１】
図１８のステップＳ９１０′では、図９のステップＳ９１０の処理に加えて、図１７のデータ構成例を有するハッシュテーブル１７０１の全てのユーザＩＤに対応する全てのレコードのＩＯ量の項目値がクリアされる。これにより、過去一時的にＩＯ量が多かったユーザに対して、スレッドが割り当てられない状態が発生することが防止される。
【０１５２】
図１９は、図１の機能を備える分散ファイルシステムをソフトウェア処理として実現できるサーバマシン１００のハードウェア構成の一例を示す図である。
【０１５３】
図１９に示されるコンピュータは、ＣＰＵ１９０１、メモリ１９０２、入力装置１９０３、出力装置１９０４、外部記憶装置１９０５、可搬記録媒体１９０９が挿入される可搬記録媒体駆動装置１９０６、及び通信インタフェース１９０７を有し、これらがバス１９０８によって相互に接続された構成を有する。同図に示される構成は図１の分散ファイルシステムを実現できるサーバマシン１００の一例であり、そのようなコンピュータはこの構成に限定されるものではない。
【０１５４】
ＣＰＵ１９０１は、当該サーバマシン１００全体の制御を行う。メモリ１９０２は、プログラムの実行、データ更新等の際に、外部記憶装置１９０５（或いは可搬記録媒体１９０９）に記憶されているプログラム又はデータを一時的に格納するＲＡＭ等のメモリである。データとしては例えば、図３、図７、図８、図１５、図１７等に示されるハッシュテーブルやリクエストキュー、図１０に示される集計テーブル１、図１３に示される集計テーブル２等が、メモリ１９０２に記憶される。ＣＰＵ１９０１は、プログラムをメモリ１９０２に読み出して実行することにより、全体の制御を行う。
【０１５５】
入力装置１９０３は、ユーザによるキーボードやマウス等による入力操作を検出し、その検出結果をＣＰＵ１９０１に通知する。
【０１５６】
出力装置１９０４は、ＣＰＵ１９０１の制御によって送られてくるデータを表示装置や印刷装置に出力する。
【０１５７】
外部記憶装置１９０５は、例えばハードディスク記憶装置である。主に各種データやプログラムの保存に用いられる。
【０１５８】
可搬記録媒体駆動装置１９０６は、光ディスクやＳＤカード、コンパクトフラッシュ（登録商標）等の可搬記録媒体１９０９を収容するもので、外部記憶装置１９０５の補助の役割を有する。
【０１５９】
通信インタフェース１９０７は、例えばＬＡＮ（ローカルエリアネットワーク）又はＷＡＮ（ワイドエリアネットワーク）の通信回線を接続するための装置である。
【０１６０】
本実施形態によるシステムは、図９、図１１、図１２、図１４、図１６、図１８等のフローチャートで実現される機能を搭載した処理プログラムをＣＰＵ１９０１が実行することで実現される。そのプログラムは、例えば外部記憶装置１９０５や可搬記録媒体１９０９に記録して配布してもよく、或いは通信インタフェース１９０７により接続される図１のネットワーク１３０から取得できるようにしてもよい。
【０１６１】
以上の実施形態に関して、更に以下の付記を開示する。
（付記１）
１人以上のユーザからのリクエストに基づいてデバイスへのアクセスを制御する情報処理装置であって、
前記デバイスへのアクセスの開始時刻および終了時刻を記録するアクセス記録部と、
前記開始時刻および終了時刻に基づく経過時間から、前記デバイスの負荷状況を判断する負荷状況解析部と、
前記デバイスの負荷状況に応じて前記ユーザからの前記リクエストの前記デバイスにアクセスするスレッドの同時実行数を制限するスレッド割り当て制御部）と、
を備えることを特徴とする情報処理装置。
（付記２）
前記リクエストのデータサイズを前記デバイスへのアクセス時間が一定時間内に収まる一定サイズに区切って前記デバイスへアクセスさせるリクエスト受信部をさらに備え、
前記アクセス記録部は、前記アクセスごとに、当該アクセスに対応する前記経過時間内で、前記一定時間ごとに前記デバイスに対する当該アクセスと他のアクセスの並列実行数をそれぞれ計数し、当該一定時間ごとの並列実行数の計数の結果から前記経過時間での並列実行数を算出し、
前記負荷状況解析部は、前記アクセスごとの前記経過時間での前記並列実行数から前記並列実行数ごとの経過時間を集計し、当該集計の結果に基づいて前記デバイスへのアクセス時の遅延が大きくならない範囲の前記並列実行数である同時アクセス可能数を算出し、
前記スレッド割り当て制御部は、前記同時アクセス可能数を超えないように前記ユーザからの前記リクエストの前記スレッドの同時実行数を制限する、
ことを特徴とする付記１に記載の情報処理装置。
（付記３）
前記一定サイズは、前記デバイスのファイルシステムのブロックサイズである、
ことを特徴とする付記２に記載の情報処理装置。
（付記４）
前記負荷状況解析部は、前記アクセスごとの前記アクセス時間と前記並列実行数の記録から、前記経過時間を算出できない並列実行数に関しては、前記アクセス時間と前記並列実行数の記録から補間演算により当該並列実行数に対応する前記経過時間を算出する、
ことを特徴とする付記２または３のいずれかに記載の情報処理装置。
（付記５）
前記スレッド割り当て制御部は、前記同時実行数を前記ユーザごとおよび前記ユーザの全体でそれぞれ計数し、前記ユーザの全体で計数された同時実行数が前記同時アクセス可能数を超えない範囲で前記リクエストを処理し、前記ユーザの全体で計数された同時実行数が前記同時アクセス可能数を超える前記リクエストがあった場合には、前記ユーザごとに計数された前記同時実行数が最も少ない前記ユーザに合わせて、他の前記ユーザからの前記リクエストの前記デバイスへの同時実行数を減少させる、
ことを特徴とする付記２ないし４のいずれかに記載の情報処理装置。
（付記６）
前記スレッド割り当て制御部は、優先される前記ユーザに対して、前記デバイスへの前記リクエストの同時実行数を優先的に割り当てる、
ことを特徴とする付記２ないし５のいずれかに記載の情報処理装置。
（付記７）
前記スレッド割り当て制御部は、過去の前記アクセスの量が少ないユーザに対して、前記デバイスへの前記リクエストの前記同時実行数を優先的に割り当てる、
ことを特徴とする付記２ないし６のいずれかに記載の情報処理装置。
（付記８）
付記１ないし７のいずれかに記載の情報処理装置と、
前記ユーザが操作し前記情報処理装置に対して前記リクエストを発行する１台以上の端末装置と、
を含むことを特徴とする情報処理システム。
（付記９）
１人以上のユーザからのリクエストに基づいてデバイスへのアクセスを制御する情報処理装置に、
前記デバイスへのアクセスの開始時刻および終了時刻を記録するアクセス記録処理と、
前記開始時刻および終了時刻に基づく経過時間から、前記デバイスの負荷状況を判断する負荷状況解析処理と、
前記デバイスの負荷状況に応じて前記ユーザからの前記リクエストの前記デバイスへのアクセスの同時実行数を制限するアクセス割り当て制御処理と、
を実行させるための情報処理装置の制御プログラム。
（付記１０）
１人以上のユーザからのリクエストに基づいてデバイスへのアクセスを制御する情報処理装置に、
前記デバイスへのアクセスの開始時刻および終了時刻を記録するアクセス記録処理と、
前記開始時刻および終了時刻に基づく経過時間から、前記デバイスの負荷状況を判断する負荷状況解析処理と、
前記デバイスの負荷状況に応じて前記ユーザからの前記リクエストの前記デバイスへのアクセスの同時実行数を制限するアクセス割り当て制御処理と、
を実行させるための情報処理装置の制御方法。
【符号の説明】
【０１６２】
１００  サーバマシン
１０１  リクエスト受信部
１０２  スレッド割り当て制御部
１０３  ディスクアクセス時刻記録部
１０４  ディスク負荷状況解析部
１０５  アクセス時間の記録テーブル
１０６  サーバスレッド
１１０  クライアントマシン
１１１  リクエスト送信部
１２０  ディスク装置
１３０  ネットワーク
３０３、７０３、８０３、１５０１、１７０１  ハッシュテーブル
７０４、７０４Ａ、７０４Ｂ  リクエストキュー
７０５、７０５Ａ−１、７０５Ａ−２、７０５Ａ−３、７０５Ｂ−１、７０５Ｂ−２  リクエスト
１００１  ディスクアクセス開始時刻
１００２  ディスクアクセス終了時刻
１００３  経過時間
１００４、１３０１  並列実行数
１３０２  経過時間の平均
１３０３  経過時間の倍率
１９０１  ＣＰＵ
１９０２  メモリ
１９０３  入力装置
１９０４  出力装置
１９０５  外部記憶装置
１９０６  可搬記録媒体駆動装置
１９０７  通信インタフェース
１９０８  バス
１９０９  可搬記録媒体
【図３】
2015194892.tif 000003
【図４】
2015194892.tif 000004
【図５】
2015194892.tif 000005
【図６】
2015194892.tif 000006
【図７】
2015194892.tif 000007
【図８】
2015194892.tif 000008
【図９】
2015194892.tif 000009
【図１０】
2015194892.tif 000010
【図１１】
2015194892.tif 000011
【図１２】
2015194892.tif 000012
【図１３】
2015194892.tif 000013
【図１４】
2015194892.tif 000014
【図１９】
2015194892.tif 000015
【図１】
2015194892.tif 000016
【図２】
2015194892.tif 000017
【図１５】
2015194892.tif 000018
【図１６】
2015194892.tif 000019
【図１７】
2015194892.tif 000020
【図１８】
2015194892.tif 000021