(19)【発行国】日本国特許庁(JP)
(12)【公報種別】特許公報(B2)
(11)【特許番号】
(24)【登録日】2023-07-04
(45)【発行日】2023-07-12
(54)【発明の名称】情報処理装置およびタスク管理プログラム
(51)【国際特許分類】
G06F 9/50 20060101AFI20230705BHJP
【FI】
G06F9/50 150D
G06F9/50 150C
(21)【出願番号】P 2019042231
(22)【出願日】2019-03-08
【審査請求日】2021-12-08
【前置審査】
(73)【特許権者】
【識別番号】000005223
【氏名又は名称】富士通株式会社
(74)【代理人】
【識別番号】110002918
【氏名又は名称】弁理士法人扶桑国際特許事務所
(72)【発明者】
【氏名】前田 宗則
【審査官】漆原 孝治
(56)【参考文献】
【文献】特開平09-185590(JP,A)
【文献】特表2002-535771(JP,A)
(58)【調査した分野】(Int.Cl.,DB名)
G06F 9/50
(57)【特許請求の範囲】
【請求項1】
複数の処理部
と、所定数の要素をそれぞれ有する複数の乱数列を記憶する記憶部とを有する情報処理装置であって、
前記複数の乱数列に含まれる乱数列の数以下の値を有する第1の数値をランダムに生成し、前記複数の乱数列から前記第1の数値が示す乱数列を選択し、前記複数の処理部の処理能力を収集し、
前記所定数のタスクを、収集された前記処理能力の比率に応じた分配確率で
、前記選択された乱数列を用いて前記複数の処理部に分配するタスク分配処理を、前記複数の処理部のそれぞれが独立して実行する、
情報処理装置。
【請求項2】
前記タスク分配処理は、さらに、前記所定数の要素を有する数列であって、前記複数の処理部のそれぞれを示す識別番号を前記比率に応じた数だけ含む前記数列を生成する処理を含み、
前記分配では、前記所定数のタスクのそれぞれが発生するたびに、前記選択された乱数列から1つずつ数値を選択し、前記数列に含まれる前記識別番号のうち、前記選択された数値が示す要素として含まれる前記識別番号を読み出し、前記複数の処理部のうち、読み出された前記識別番号に対応する処理部に対して発生したタスクを分配する、
請求項
1記載の情報処理装置。
【請求項3】
前記タスク分配処理は、さらに、前記複数の乱数列に含まれる乱数列の数以下の値を有する第2の数値をランダムに生成する処理を含み、
前記選択された乱数列からの数値の選択では、前記第2の数値に基づいて決定される要素を先頭にして、前記選択された乱数列から数値を巡回的に選択する、
請求項
2記載の情報処理装置。
【請求項4】
前記情報処理装置は、それぞれ個別のタスク種別に関連付けられた前記複数の処理部を複数組有し、
複数組の前記複数の処理部に含まれるそれぞれの処理部において、
前記複数の処理部のそれぞれについての前記タスク分配処理が実行され、
タスクが発生するたびに発生したタスクのタスク種別が判別され、発生したタスクの分配先が、判別されたタスク種別に対応する前記複数の処理部についての前記タスク分配処理によって決定される、
請求項1乃至
3のいずれか1項に記載の情報処理装置。
【請求項5】
前記情報処理装置は、それぞれ個別のタスク種別に関連付けられ、かつ、第1グループと第2グループのいずれかに分類される前記複数の処理部を、複数組有し、
複数組の前記複数の処理部に含まれるそれぞれの処理部において、
前記第1グループに含まれる前記複数の処理部のそれぞれについての前記タスク分配処理が実行され、
タスクが発生するたびに発生したタスクのタスク種別が判別され、前記第1グループに含まれる前記複数の処理部に対応するタスク種別のタスクの分配先が、判別されたタスク種別に対応する前記複数の処理部についての前記タスク分配処理によって決定され、前記第2グループに含まれる前記複数の処理部に対応するタスク種別のタスクが、判別されたタスク種別に対応する前記複数の処理部に対してランダムに分配される、
請求項1乃至
3のいずれか1項に記載の情報処理装置。
【請求項6】
コンピュータに、
所定数の要素をそれぞれ有する複数の乱数列を記憶する、前記コンピュータが備える記憶部を参照して、前記複数の乱数列に含まれる乱数列の数以下の値を有する第1の数値をランダムに生成し、前記複数の乱数列から前記第1の数値が示す乱数列を選択し、前記コンピュータが備える複数の処理部の処理能力を収集し、
前記所定数のタスクを、収集された前記処理能力の比率に応じた分配確率で
、前記選択された乱数列を用いて前記複数の処理部に分配するタスク分配処理を、前記複数の処理部のそれぞれが独立して実行する、
処理を実行させるタスク管理プログラム。
【発明の詳細な説明】
【技術分野】
【0001】
本発明は、情報処理装置およびタスク管理プログラムに関する。
【背景技術】
【0002】
マルチプロセッサシステムやマルチコアシステムのように複数の処理部を備えるシステムの処理性能を高めるためには、各処理部の間で負荷が分散するようにタスクの実行を制御することが重要である。このような負荷分散の方法としては、各処理部に対してタスクを均等に分配する方法があるが、この方法ではタスクの内容によっては処理部間での負荷バランスの偏りが大きくなる場合がある。そこで、他の方法として、各処理部での処理負荷の割合に応じた確率で、各処理部に対してタスクを分配するように制御する方法がある。
【0003】
また、負荷分散に関しては次のような提案がある。例えば、トランザクションの分配先登録表を用いて複数のサーバにトランザクションを分配する情報処理装置が提案されている。この情報処理装置は、各サーバの処理能力の相対比に基づいてトランザクションの分配比率を算出し、分配比率と、乱数を基に生成されたインデックス表とを用いて上記の分配先登録表を生成する。また、他の例として、複数のCPUの稼働率に基づいて負荷分散マトリックスを生成し、負荷分散マトリックスを用いてトランザクションを実行させるCPUを決定するゲートウェイプロセッサが提案されている。
【先行技術文献】
【特許文献】
【0004】
【文献】特開平9-282287号公報
【文献】特開平9-259093号公報
【発明の概要】
【発明が解決しようとする課題】
【0005】
ところで、ある時点での複数の処理部それぞれの負荷の割合に応じた確率で、一定数のタスクの分配先を決定する方法では、次のような問題がある。この方法では、一定数のタスクが分配される期間では、あくまでその期間の開始時点での負荷の割合に応じた確率で、タスクが分配される。このため、その期間内で処理部間の負荷バランスが変動すると、分配されたタスクを各処理部が処理したときの負荷分散の精度が低下する。
【0006】
1つの側面では、本発明は、複数の処理部の間での負荷分散の精度を向上させることが可能な情報処理装置およびタスク管理プログラムを提供することを目的とする。
【課題を解決するための手段】
【0007】
1つの案では、複数の処理部を有する次のような情報処理装置が提供される。この情報処理装置では、複数の処理部の処理能力を収集し、所定数のタスクを、収集された処理能力の比率に応じた分配確率で複数の処理部に分配するタスク分配処理を、複数の処理部のそれぞれが独立して実行する。
【0008】
また、1つの案では、上記の情報処理装置と同様の処理をコンピュータに実行させるタスク管理プログラムが提供される。
【発明の効果】
【0009】
1つの側面では、複数の処理部の間での負荷分散の精度を向上させることができる。
【図面の簡単な説明】
【0010】
【
図1】第1の実施の形態に係る情報処理装置の構成例および処理例を示す図である。
【
図2】第2の実施の形態に係るストレージシステムの構成例を示す図である。
【
図3】ストレージ制御装置のハードウェア構成例を示す図である。
【
図4】ストレージ制御装置が備える処理機能の構成例を示すブロック図である。
【
図5】コアの処理能力の比率に応じたタスク分配制御について説明するための図である。
【
図6】タスクの分配制御で利用される情報の例を示す図である。
【
図7】配列の生成処理について説明するための図である。
【
図8】乱数テーブルの生成処理を示すフローチャートの例である。
【
図9】タスク実行制御処理を示すフローチャートの例である。
【
図10】タスク分配制御処理を示すフローチャートの例(その1)である。
【
図11】タスク分配制御処理を示すフローチャートの例(その2)である。
【
図12】PeerSelector[i,*]の生成処理を示すフローチャートの例を示す。
【
図13】各コアでタスク分配制御が実行される様子を模式的に示した図である。
【
図14】変形例1におけるタスク分配制御処理を示すフローチャートの例である。
【
図15】変形例2におけるタスク分配制御処理を示すフローチャートの例である。
【
図16】機能別コアおよび使用される行列の構成例を示す図である。
【
図17】変形例3におけるタスク分配制御処理を示すフローチャートの例である。
【
図18】変形例4における機能別コアおよび使用される配列の構成例を示す図である。
【
図19】均等分配用のコア選択配列の例を示す図である。
【
図20】変形例4におけるタスク分配制御処理の一部を示すフローチャートの例である。
【
図21】変形例5におけるタスク分配制御処理の一部を示すフローチャートの例である。
【発明を実施するための形態】
【0011】
以下、本発明の実施の形態について図面を参照して説明する。
〔第1の実施の形態〕
図1は、第1の実施の形態に係る情報処理装置の構成例および処理例を示す図である。
図1に示す情報処理装置1は、処理部2a~2cを有する。処理部2a~2cは、例えば、マルチプロセッサシステムに含まれるプロセッサ、あるいはマルチコアプロセッサに含まれるプロセッサコアである。
【0012】
処理部2a~2cは、所定数のタスクを単位とした次のようなタスク分配処理を、それぞれ独立して実行する。例えば、処理部2aは、処理部2a~2cのそれぞれの処理能力を収集し、収集された処理能力の比率に応じた分配確率で、処理部2aで発生した所定数のタスクを処理部2a~2cに分配する。処理部2b,2cでも、処理部2b,2cでそれぞれ発生した所定数のタスクについて同様の処理が実行される。なお、収集される処理能力は、処理部での処理の余力であり、例えば、プロセッサやプロセッサコアの使用率(ビジー率)を100%から減算した値として算出される。
【0013】
このようなタスク分配処理では、タスク分配処理の開始時における処理部2a~2cの処理能力の比率に基づいて、処理部2a~2cでの処理負荷が平準化されるように所定数のタスクを分配することができる。ただし、個々の処理部によるタスク分配処理では、所定個数のタスクが発生する期間において、その期間の先頭で算出された1つの分配確率を用いて所定数のタスクが分配される。このため、ある処理部において所定数のタスクが発生する期間内で処理部2a~2cの間の負荷バランスが変動したとしても、その期間が終了するまで新たな分配確率は計算されない。したがって、1つの処理部のみが上記手順のタスク分配処理を実行した場合、所定数のタスクが発生する期間内で処理部2a~2cの間の負荷バランスが変動すると、負荷バランスの平準化精度が低下してしまう。
【0014】
これに対して、本実施の形態では、
図1に示すように、上記のような所定数のタスクについてのタスク分配処理が、処理部2a~2cのそれぞれによって独立して実行される。また、処理部2a~2cの間では、所定数のタスクごとのタスク分配処理の進行状況が異なる可能性が高い。例えば、ある処理部では、タスクを実行したとき、そのタスクの実行に伴って、分配の対象となる新たなタスクが生成される。この場合、実行されるタスクの処理内容によっては、タスクの実行に伴って所定数のタスクが生成され、それらが分配されるのに要する時間が変化する。このような時間の違いから、処理部2a~2cの間において、所定数のタスクごとのタスク分配処理の進行状況が変わってくる。
【0015】
その結果、ある処理部が分配確率を算出して所定数のタスクを分配する期間の途中で、別の処理部が分配確率を算出し直し、その分配確率に基づいて別の所定数のタスクを分配する、という状況が発生する。これにより、情報処理装置1の全体としては、分配確率が算出される頻度が高くなり、なおかつ、分配確率の算出タイミングが分散する。
【0016】
図1の例では、処理部2aは、所定数のタスクの分配処理(ステップS1)を実行し、その後、別の所定数のタスクの分配処理(ステップS2)を実行する。また、処理部2bは、処理部2aによるステップS1のタスク分配処理が開始された後、別の所定数のタスクの分配処理(ステップS3)を実行し、その後、別の所定数のタスクの分配処理(ステップS4)を実行する。さらに、処理部2cは、処理部2aによるステップS1のタスク分配処理が開始された後、別の所定数のタスクの分配処理(ステップS5)を実行し、その後、別の所定数のタスクの分配処理(ステップS6)を実行する。
【0017】
この例では、処理部2aが所定数のタスクの分配処理(ステップS1)を実行している期間において、処理部2cがステップS5の処理により処理部2a~2cの処理能力を収集して分配確率を算出し直し、その分配確率に基づいて別の所定数のタスクを分配する。また、同期間においてステップS5の処理が開始された後、さらに処理部2bがステップS3の処理により処理部2a~2cの処理能力を収集して分配確率を算出し直し、その分配確率に基づいて別の所定数のタスクを分配する。
【0018】
その結果、処理部2aが所定数のタスクの分配処理(ステップS1)を実行している期間において、他の処理部2b,2cによってさらに複数回、処理部2a~2cの処理能力が収集されて分配確率が再計算される。そして、それらの分配確率に基づいてタスク分配処理が実行される。したがって、処理部2a~2cの処理能力の収集結果に基づく分配確率の算出頻度が高くなる。そして、このように高頻度で算出された分配確率に基づいてタスクの分配制御が実行されることで、処理部2a~2cの間の負荷バランスの変動に対して高速に追随しながらタスクの分配先が適正化されていく。これにより、処理部2a~2cの間での負荷分散の精度を向上させることができる。
【0019】
〔第2の実施の形態〕
次に、
図1に示した情報処理装置1の例としてストレージ制御装置が適用されたストレージシステムについて説明する。
【0020】
図2は、第2の実施の形態に係るストレージシステムの構成例を示す図である。
図2に示すように、第2の実施の形態に係るストレージシステムは、ホストサーバ50と、ストレージ制御装置100,200と、ストレージ300とを有する。なお、ストレージ制御装置100,200は、
図1に示した情報処理装置1の一例である。
【0021】
ホストサーバ50は、例えば、業務処理などの各種の処理を実行するサーバコンピュータである。ストレージ制御装置100,200は、ホストサーバ50から受け付けたI/O(Input/Output)要求を処理する。例えば、ホストサーバ50からのアクセス対象となる1以上の論理ボリュームが、ストレージ300の記憶領域を用いて作成される。ストレージ制御装置100,200は、ホストサーバ50から論理ボリュームに対するI/O要求を受け付け、論理ボリュームに対するI/O処理を制御する。ストレージ制御装置100,200は、例えば、汎用のサーバコンピュータとして実現される。この場合、ストレージ制御装置100,200は、ストレージ制御用のアプリケーションプログラムを実行することで、ストレージ制御を実行する。ストレージ300には、1台以上の不揮発性記憶装置が搭載されている。例えば、ストレージ300には、不揮発性記憶装置としてSSD(Solid State Drive)が搭載されている。
【0022】
なお、ホストサーバ50とストレージ制御装置100,200とは、例えば、FC(Fibre Channel)やiSCSI(Internet Small Computer System Interface)などを利用して接続される。ストレージ制御装置100,200は、例えば、FC、iSCSI、LAN(Local Area Network)などを利用して接続される。ストレージ制御装置100,200が互いに接続されていることで、例えば、データの分散配置や、データの二重化(一方から他方へのデータコピー)などが実現可能になる。ストレージ制御装置100,200とストレージ300とは、例えば、FC、iSCSI、SATA(Serial Advanced Technology Attachment)などを利用してそれぞれ接続される。
【0023】
図3は、ストレージ制御装置のハードウェア構成例を示す図である。なお、
図3ではストレージ制御装置100のハードウェア構成について例示するが、ストレージ制御装置200についてもストレージ制御装置100と同様のハードウェア構成によって実現される。
【0024】
ストレージ制御装置100は、CPU(Central Processing Unit)101、RAM(Random Access Memory)102、SSD103、読み取り装置104、ホストインタフェース(I/F)105、ドライブインタフェース(I/F)106および通信インタフェース(I/F)107を備える。
【0025】
CPU101は、RAM102からプログラムを読み出して処理する処理装置である。CPU101は、複数のコア(プロセッサコア)を備えるマルチコアCPUである。
RAM102は、ストレージ制御装置100の主記憶装置として使用される。RAM102には、CPU101に実行させるOS(Operating System)プログラムやアプリケーションプログラムの少なくとも一部が一時的に格納される。また、RAM102には、CPU101による処理に必要な各種データが格納される。
【0026】
SSD103は、ストレージ制御装置100の補助記憶装置として使用される。SSD103には、OSプログラム、アプリケーションプログラムおよび各種データが格納される。なお、補助記憶装置としては、HDD(Hard Disk Drive)などの他の種類の不揮発性記憶装置を使用することもできる。
【0027】
読み取り装置104には、可搬型記録媒体104aが脱着される。読み取り装置104は、可搬型記録媒体104aに記録されたデータを読み取ってCPU101に送信する。可搬型記録媒体104aとしては、光ディスク、光磁気ディスク、半導体メモリなどがある。
【0028】
ホストインタフェース105は、ホストサーバ50と通信するためのインタフェース装置である。ドライブインタフェース106は、ストレージ300に含まれる不揮発性記憶装置と通信するためのインタフェース装置である。通信インタフェース107は、他方のストレージ制御装置200と通信するためのインタフェース装置である。
【0029】
図4は、ストレージ制御装置が備える処理機能の構成例を示すブロック図である。なお、
図4ではストレージ制御装置100の構成について例示するが、ストレージ制御装置200もストレージ制御装置100と同様の処理機能を備えている。
【0030】
ストレージ制御装置100は、I/O制御部110、スケジューラ120_1,120_2,120_3,・・・および記憶部130を備える。I/O制御部110およびスケジューラ120_1,120_2,120_3,・・・の処理は、例えば、CPU101が所定のプログラムを実行することで実現される。記憶部130は、例えば、RAM102の記憶領域によって実現される。
【0031】
I/O制御部110は、ホストサーバ50からのI/O要求に応じた論理ボリュームに対するI/O処理を制御する。I/O制御部110は、例えば、上位接続部111、キャッシュ管理部112、重複排除部113およびI/O処理部114を備える。
【0032】
上位接続部111は、ホストサーバ50からI/O要求(書き込み要求または読み出し要求)を受け付ける。キャッシュ管理部112は、上位接続部111が受け付けたI/O要求に応じたI/O処理を、RAM102に確保されたキャッシュ領域を用いて制御する。重複排除部113は、I/O要求に応じてストレージ300に格納されるデータの重複を排除するための制御を行う。I/O処理部114は、重複が排除されたデータをストレージ300に書き込む。このとき、例えば、RAID(Redundant Arrays of Inexpensive Disks)によって書き込みが制御される。また、I/O処理部114は、ストレージ300からデータを読み出す。
【0033】
スケジューラ120_1,120_2,120_3,・・・は、I/O制御部110の各部で発生するタスクの実行を制御する。I/O制御部110のタスクは、実体的にはスケジューラ120_1,120_2,120_3,・・・によって実行される。スケジューラ120_1,120_2,120_3,・・・の処理は、それぞれCPU101が備える個別のコアによって実行される。また、スケジューラ120_1,120_2,120_3,・・・は、タスクの実行によって新たなタスクが発生すると、CPU101の各コアの間で処理負荷が分散されるように、新たなタスクをいずれかのコアに分配して実行させる。
【0034】
記憶部130は、例えば、スケジューラ120_1,120_2,120_3,・・・が各コアに対するタスクの分配制御を実行するために利用する各種のデータを記憶する。
次に、コアに対するタスク分配制御について説明する。なお、これ以後、例としてストレージ制御装置100の処理について説明するが、ストレージ制御装置200でも同様の処理が実行される。
【0035】
マルチコアシステムの処理性能を高めるためには、コア間で処理負荷を分散させて、全コアの使用率(CPUビジー率)が一様に高まるようにすることが重要である。ストレージ制御装置100は、I/O制御部110のI/O処理を細分化してタスクという単位に分解し、各コアがまんべんなくタスクを実行するようにタスクを分配することで、各コアの使用率を平準化する。これによって、I/O処理性能を向上させる。このようなコア間の負荷分散の方法としては、動的負荷分散と静的負荷分散とがある。ストレージ制御では、I/O要求を発するホストサーバ50の処理状況を把握できないので、静的負荷分散を利用することは困難であり、動的負荷分散が利用される。
【0036】
図5は、コアの処理能力の比率に応じたタスク分配制御について説明するための図である。本実施の形態では、スケジューラ120_1,120_2,120_3,・・・のそれぞれが、各コアの処理能力を収集し、それらの処理能力の比率に応じた確率で各コアに対してタスクを分配する。ここでいう処理能力とは、コアの余力を示すものであり、例えば、コアの使用率(ビジー率)を100%から減算して得られる。
【0037】
例として、ストレージ制御装置100のCPU101が5つのコアを備えるものとする。以下、コア番号Xのコアを「コア#X」と記載する場合がある。
図5の表61に示すように、コア#1,#2,#3,#4,#5の処理能力がそれぞれ80%,40%,40%,20%,20%であったとする。このとき、合計が1になるように処理能力を正規化すると、正規化されたコア#1,#2,#3,#4,#5の処理能力はそれぞれ0.4,0.2,0.2,0.1,0.1となる。負荷バランスを平準化するには処理能力(余力)が大きいコアほど多くのタスクを分配すればよいので、正規化されたこれらの値は、各コアに対するタスクの分配確率を示すことになる。
【0038】
ここで、K個のタスクを分配する場合について考える。なお、Kは1以上の任意の整数である。表62に示す出現回数は、K=10個のタスクの分配先として各コアがいくつ出現するかを示す数である。コアが出現する出現確率は、上記のタスクの分配確率と一致する。すなわち、10個のタスクのうち、コア#1,#2,#3,#4,#5が分配先となるタスクの数は、それぞれ4個、2個、2個、1個、1個となる。
【0039】
図5に示す10桁のコア番号列63は、各コアのコア番号が表62の出現回数分だけ含まれ、かつ、その順番がランダムシャッフルされた数列である。このコア番号列63にしたがってタスクの分配先のコアが決定されることで、コア間の処理能力の比率に応じた確率で各コアに対してタスクが分配される。すなわち、スケジューラ120_1,120_2,120_3,・・・のそれぞれは、各コアから収集した処理能力に基づいてコア番号列63が示すようなコアの分配順を決定することで、コア間の負荷バランスをその変動に応じて最適化することができる。
【0040】
各コア、すなわちスケジューラ120_1,120_2,120_3,・・・のそれぞれは、自コアでのタスクの実行によって新たに生成されたN個のタスクを単位として、各コアの処理能力を収集し、処理能力に応じて各コアへの分配確率を更新する。そして、スケジューラ120_1,120_2,120_3,・・・のそれぞれは、更新された分配確率に基づいてN個のタスクの分配先を決定する。
【0041】
図6は、タスクの分配制御で利用される情報の例を示す図である。以下の説明では、ストレージ制御装置100はN個のコア108_1~108_Nを備えるものとする。コア108_1~108_Nは、
図1に示した処理部2a~2cの一例である。また、以下の説明において、コア108_1,108_2,・・・,108_Nは、それぞれコア#1,#2,・・・,#Nと記載される場合もある。なお、Nは2以上の任意の整数である。
【0042】
また、記憶部130には、コア108_1~108_Nのそれぞれによって利用されるタスクプール、N桁(1行N列)の処理能力配列、K桁(1行K列)のコア選択配列が記憶される。例えば、タスクプール131_1、処理能力配列132_1およびコア選択配列133_1は、コア108_1によって利用される。タスクプール131_2、処理能力配列132_2およびコア選択配列133_2は、コア108_2によって利用される。タスクプール131_N、処理能力配列132_Nおよびコア選択配列133_Nは、N番目のコア108_Nによって利用される。
【0043】
タスクプール131_1~131_Nは、対応するコアに分配されたタスクが記憶されるFIFO(First In/First Out)方式のキューである。コア(コアによって動作するスケジューラ)は、タスクプールから順にタスクを取得し、取得したタスクを実行する。
【0044】
処理能力配列132_1~132_Nのそれぞれは、コア108_1~108_Nのそれぞれに対応する要素を備える数値列である。処理能力配列132_1~132_Nのそれぞれに含まれる各要素には、対応するコアから収集された処理能力を示す数値が格納される。
【0045】
コア選択配列133_1~133_Nのそれぞれは、K個のタスクのそれぞれに対応する要素を備える数値列である。コア選択配列133_1~133_Nのそれぞれに含まれる各要素には、対応するタスクの分配先のコアを示すコア番号が格納される。
【0046】
なお、
図6に示す行列PeerProcessingCapaは、処理能力配列132_1~132_Nのそれぞれを行として含むN行N列の行列である。以下の説明では、N行N列の行列PeerProcessingCapaをPeerProcessingCapa[N,N]と記載する場合がある。
【0047】
また、
図6に示す行列PeerSelectorは、コア選択配列133_1~133_Nのそれぞれを行として含むN行K列の行列である。以下の説明では、N行K列の行列PeerSelectorをPeerSelector[N,K]と記載する場合がある。
【0048】
記憶部130にはさらに、乱数テーブル134が記憶される。乱数テーブル134は、M行K列の行列Randとして実現され、各行がK以下の乱数を含む。以下の説明では、M行K列の行列RandをRand[M,K]と記載する場合がある。乱数テーブル134(行列Rand)は、コア108_1,108_2,・・・,108_N(すなわち、スケジューラ120_1,120_2,120_3,・・・)によって共用される。
【0049】
以下、上記の各配列および乱数テーブル134を用いたタスクの分配制御について説明する。以下の
図7~
図12の説明では、スケジューラ120_1,120_2,120_3,・・・のうち、i番目のコア108_i(コア#i)において動作するスケジューラの処理について説明する。
【0050】
図7は、配列の生成処理について説明するための図である。
スケジューラは、N個のタスクの分配が完了した後、次の新たなタスクが発生したタイミングで、コア#1~#N(コア108_1~108_N)のそれぞれから現時点での処理能力を収集する。スケジューラは、PeerProcessingCapa[i,*]の各要素に対して、対応するコアから収集された処理能力の数値を格納する。ここで、角括弧内の*は、数値を特定しないことを示す。PeerProcessingCapa[i,*]は、行列PeerProcessingCapaにおけるi番目の行を示し、これはコア#iがタスク分配制御のために利用する処理能力配列に相当する。
【0051】
次に、スケジューラは、PeerProcessingCapa[i,*]に基づいて、PeerSelector[i,*]を生成する。なお、PeerSelector[i,*]は、行列PeerSelectorにおけるi番目の行を示し、これはコア#iがタスク分配制御のために利用するコア選択配列に相当する。
【0052】
PeerSelector[i,*]には、コア#1~#Nのそれぞれを示すコア番号が、処理能力の比率に基づく数だけ格納される。すなわち、PeerSelector[i,*]に格納されるコア番号の個数は、K個のタスクのうち、そのコア番号が示すコアに対して分配されるタスクの数(K個のタスク当たりのタスク分配数)を示す。
【0053】
スケジューラは、まず、PeerProcessingCapa[i,*]の各要素の合計値νを、次の式(1)によって算出する。
【0054】
【0055】
次に、スケジューラは、
図7に示すように、PeerSelector[i,*]に格納する、j番目のコア#jのコア番号の個数(コア#jに対するタスク分配数)を、K*PeerProcessingCapa[i,l]/νによって決定する。例えば、コア#1に対するタスク分配数は、K*PeerProcessingCapa[i,1]/νによって決定される。ただし、この式によればタスク分配数の計算結果に小数点以下の値が生じる場合がある。そこで、より具体的には、タスク分配数の個数は次のように決定される。
【0056】
まず、次の式(2)によってpjが算出される。
pj=PeerProcessingCapa[i,j]/ν ・・・(2)
次に、式(2)に基づいて、コア#1、#2、#3に対するタスク分配数S1,S2,S3が、それぞれ次の式(3-1),(3-2),(3-3)によって算出される。
S1=Round(K×p1) ・・・(3-1)
S2=Round(K×(p1+p2))-S1 ・・・(3-2)
S3=Round(K×(p1+p2+p3))-(S1+S2) ・・・(3-3)
式(2),(3-1),(3-2),(3-3)をまとめると、コア#jに対するタスク分配数Sjは、次の式(4)によって算出される。なお、ROUND(X)は、Xの小数点以下を切り捨てた値を示す。
【0057】
【0058】
上記の式(4)によれば、コア番号の先頭から末尾まで1回ずつ計算するだけで、各コアに対するタスク分配数が決定される。また、式(2)に基づくタスク分配数と式(4)に基づくタスク分配数との間で小数点以下の切り捨てによる計算誤差が生じても、式(4)によるタスク分配数の総和がKになることが保証される。
【0059】
スケジューラは、以上の手順によってPeerSelector[i,*]が生成されると、次に、K個のタスクのそれぞれについてPeerSelector[i,*]における列番号をランダムに選択し、選択された列番号の要素として格納されたコア番号が示すコアを、タスクの分配先に決定する。このように、PeerSelector[i,*](コア選択配列)からコア番号をランダムに取得することで、
図5に示したコア番号列63に相当する数列が得られることになる。すなわち、K個のタスクの分配先が、各コアの処理能力の比率に応じた分配確率で決定される。
【0060】
ここで、PeerSelector[i,*]からの要素選択のランダム性が、タスク分配のランダム性に影響を与え、その結果としてコア間の負荷の平準化精度に影響を与える。PeerSelector[i,*]からの要素のランダムな選択方法としては、例えば、K以下の乱数を計算によって得る方法がある。すなわち、算出された乱数列に含まれる数値のそれぞれが、選択する要素を示す列番号として用いられる。しかし、この方法では、乱数の計算処理の負荷が問題となる。
【0061】
タスクの分配制御のための処理負荷は、システムの処理性能、特にI/O処理性能に悪影響を与えてしまうため、軽量であることが望ましい。タスクの分配制御に含まれる処理のうち、上記のような乱数の算出処理は比較的高負荷の処理である。乱数の算出処理の実行頻度の増大は、I/O処理性能に与える影響が大きい。そのため、乱数の算出処理の実行頻度を低くすることが望ましいが、その一方で、生成される乱数には高いランダム性が要求される。
【0062】
他の乱数生成方法としては、計算によらず、あらかじめ記憶された乱数テーブルを用いる方法が考えられる。この方法では、乱数生成のための計算負荷はかからないものの、ランダム性を高めるための工夫が必要になる。例えば、K個の要素(1行K列)の乱数列を複数用意し、K個のタスクごとに異なる乱数列を用いて乱数を取得する方法がある。しかし、この方法では、ランダム性を高めるためには乱数列の数を多くする必要があり、乱数列を保存するための記憶領域のサイズが大きくなる。また、乱数列を順番に選択するなど、一定の規則にしたがって乱数列を選択した場合、全体として乱数に規則性が生じ、ランダム性の観点では問題となる。
【0063】
そこで、本実施の形態は、乱数計算と、複数(M行)の乱数列を有する乱数テーブル134(Rand[M,K])とを併用することで、計算負荷や乱数テーブル134の記憶領域の大きさを抑制しつつ、得られる乱数のランダム性を向上させる。具体的には、K個のタスクの分配制御を開始する際に、乱数計算によってK以下の値を有する数値がランダムに取得され、その数値によって乱数テーブル134から行が選択される。そして、選択された行の乱数列から数値が1つずつ選択されることで、PeerSelector[i,*]における列番号が1つずつ選択されて、K個のタスクの分配先が決定される。
【0064】
この方法によれば、K個のタスクを分配するために、乱数計算によってK以下の値を有する数値が1つだけ算出される。換言すると、K*K個のタスクを分配するために、1行K列の乱数列の計算が1回だけ実行される。したがって、算出された乱数列に含まれる数値のそれぞれを、PeerSelector[i,*]から選択する要素を示す列番号として用いる場合と比較して、乱数列の計算回数を減らすことができ、その結果、タスクの分配制御のための処理負荷を軽減できる。また、算出された乱数列を用いて、M行の乱数列の中から利用する乱数列が選択される。これにより、M行の乱数列の中から利用する乱数列を一定の規則にしたがって選択する場合と比較して、PeerSelector[i,*]からの要素選択のランダム性を向上させることができる。
【0065】
次に、ストレージ制御装置100におけるタスク分配制御に関する処理を、フローチャートを用いて説明する。まず、乱数テーブル134(Rand[M,K])を事前に生成するための処理について、
図8を用いて説明する。
【0066】
図8は、乱数テーブルの生成処理を示すフローチャートの例である。
図8の処理は、タスクの分配制御が開始される前に実行される。例えば、ストレージ制御装置100が起動したとき、あるいはI/O制御部110が起動したときに、
図8の処理が実行される。
図8の処理が実行されることで、乱数テーブル134(Rand[M,K])が生成される。
【0067】
なお、
図8の処理は、スケジューラ120_1,120_2,120_3,・・・のいずれかによって実行されればよい。ここでは例として、スケジューラ120_1が
図8の処理を実行するものとする。
【0068】
[ステップS11]スケジューラ120_1は、変数iの値を1からMまで1ずつ増加させながら、ステップS16までの処理を繰り返し実行する。なお、変数iは、Rand[M,K]における行番号を示す。
【0069】
[ステップS12]スケジューラ120_1は、変数jの値を1からKまで1ずつ増加させながら、ステップS14までの処理を繰り返し実行する。なお、変数jは、Rand[M,K]における列番号を示す。
【0070】
[ステップS13]スケジューラ120_1は、Rand[i,j](乱数テーブル134におけるi行j列の要素)にjの値を設定する。
[ステップS14]変数jがKに達した場合、処理はステップS15に進められる。この状態では、Rand[i,*](乱数テーブル134におけるi番目の行)には、1からMまでの整数が順番に配列されている。
【0071】
[ステップS15]スケジューラ120_1は、Rand[i,*]の配列内の数値をランダムに並び替える。この並び替えは、例えば、Fisher-Yatesシャッフルアルゴリズムを用いて実行される。
【0072】
[ステップS16]変数iがMに達した場合、処理が終了される。
図9は、タスク実行制御処理を示すフローチャートの例である。この
図9の処理は、コア#1~#N(コア108_1~108_N)にそれぞれ対応するスケジューラ120_1,120_2,120_3,・・・が、それぞれ独立して実行する。ここでは例として、i番目のコア#i(コア108_i)に対応するスケジューラ120_iの処理について説明する。
【0073】
[ステップS21]スケジューラ120_iは、タスクプール131_iにタスクが登録されているかを判定する。スケジューラ120_iは、タスクが登録されている場合にはステップS22の処理を実行し、タスクが登録されていない場合には一定時間後のステップS21の処理を再度実行する。
【0074】
[ステップS22]スケジューラ120_iは、タスクプール131_iの先頭からタスクを1つ取り出す。
[ステップS23]スケジューラ120_iは、取り出したタスクを実行する。これにより、I/O制御部110の断片的な処理がコア#iによって実行される。
【0075】
[ステップS24]スケジューラ120_iは、ステップS23でのタスクの実行により新たなタスクが発生した場合には、タスク分配制御を実行して、新たなタスクをコア#1~コア#Nのいずれかに分配する。そして、タスク分配制御が完了すると、スケジューラ120_iはステップS21の処理を実行する。一方、新たなタスクが発生していない場合、スケジューラ120_iはそのままステップS21の処理を実行する。
【0076】
図10、
図11は、タスク分配制御処理を示すフローチャートの例である。この
図10の処理は、
図9のステップS24において新たなタスクが発生した場合、そのタスクを処理対象として実行される。
【0077】
[ステップS31]スケジューラ120_iは、変数hがKより大きいかを判定する。スケジューラ120_iは、変数hがKより大きい場合にはステップS32の処理を実行し、変数hがK以下の場合には
図11のステップS41の処理を実行する。なお、変数hの初期値はKより大きい任意の整数である。
【0078】
[ステップS32]スケジューラ120_iは、変数hを1に設定する。
[ステップS33]スケジューラ120_iは、変数jの値を1からNまで1ずつ増加させながら、ステップS36までの処理を繰り返し実行する。なお、変数jは、Rand[M,K]における列番号を示す。
【0079】
[ステップS34]スケジューラ120_iは、j番目のコア#jについての現在の処理能力を取得する。
[ステップS35]スケジューラ120_iは、PeerProcessingCapa[i,j](行例PeerProcessingCapaにおけるi行j列の要素)に、ステップS34で取得した処理能力の値を設定する。
【0080】
[ステップS36]変数jがNに達した場合、処理はステップS37に進められる。この場合、PeerProcessingCapa[i,*](行列PeerProcessingCapaにおけるi番目の行)が更新された状態となる。
【0081】
[ステップS37]スケジューラ120_iは、PeerSelector[i,*](行列PeerSelectorにおけるi番目の行)の生成処理を実行する。
[ステップS38]スケジューラ120_iは、乱数計算によりM以下の整数を算出し、この値を変数mに決定する。
【0082】
以下、
図11を用いて説明を続ける。
[ステップS41]スケジューラ120_iは、Rand[m,h](乱数テーブル134におけるm行h列の数値)を読み出し、変数cに読み出した値を設定する。
【0083】
[ステップS42]スケジューラ120_iは、PeerSelector[i,c](行列PeerSelectorにおけるi行c列の数値)を読み出し、変数rに読み出した値を設定する。
【0084】
[ステップS43]スケジューラ120_iは、r番目のコア#rに対応するタスクプール131_rに、タスクを追加する。
[ステップS44]スケジューラ120_iは、変数hを1だけ増加させる。
【0085】
図12は、PeerSelector[i,*]の生成処理を示すフローチャートの例を示す。この
図12の処理は、
図10のステップS37で実行される処理である。
[ステップS51]スケジューラ120_iは、
図10のステップS34にてコア#1~コア#Nから取得した処理能力の合計値ν(PeerProcessingCapa[i,*]の各要素の合計値)を、前述の式(1)によって算出する。
【0086】
[ステップS52]スケジューラ120_iは、変数s_sum,p_sumをともに0にリセットする。
[ステップS53]スケジューラ120_iは、変数jの値を1からNまで1ずつ増加させながら、ステップS60までの処理を繰り返し実行する。なお、変数jは、PeerProcessingCapa[i,*]における列番号を示す。
【0087】
[ステップS54]スケジューラ120_iは、変数p_sumに、PeerProcessingCapa[i,j](行列PeerProcessingCapaのi行j列の値)の値を加算して、変数p_sumを更新する。
【0088】
[ステップS55]スケジューラ120_iは、変数xを次の式(5)によって算出する。この変数xは、j番目のコア#jに対するタスク分配数を示す。
x=ROUND(p_sum*K/ν)-s_sum ・・・(5)
[ステップS56]スケジューラ120_iは、変数yの値を1からxまで1ずつ増加させながら、ステップS59までの処理を繰り返し実行する。なお、変数yは、ループの実行回数を制御するために用いられる。
【0089】
[ステップS57]スケジューラ120_iは、変数s_sumに1を加算して、変数s_sumを更新する。
[ステップS58]スケジューラ120_iは、PeerSelector[i,s_sum](行列PeerSelectorにおけるi行s_sum列の要素)に、変数jを設定する。
【0090】
[ステップS59]変数yがxに達した場合、PeerSelector[i,*]に対してコア番号jをx個設定する処理が完了し、処理がステップS60に進められる。
[ステップS60]変数jがNに達した場合、PeerSelector[i,*]の全要素に対するコア番号の設定処理が完了し、
図12の処理が終了される。
【0091】
以上の
図8~
図12の処理によれば、K個のタスクのうち先頭のタスクが発生したとき、その時点でのコア#1~コア#Nの処理能力が収集される。そして、タスクの分配先となるコア#1~#Nの各コア番号が、収集された処理能力の比率に基づく個数だけPeerSelector[i,*]に設定される。さらに、PeerSelector[i,*]に設定されたコア番号がランダムに選択されることで、選択されたコア番号が示すコアがタスクの分配先に決定される。このような処理により、K個のタスクをコア#1~#Nの処理能力の比率に応じた分配確率でコア#1~コア#Nに対して分配できる。
【0092】
また、PeerSelector[i,*]に設定されたコア番号をランダムに選択する際に、乱数計算と乱数テーブル134とを併用して選択処理が行われる。この処理では、K個のタスクを分配するために、乱数計算によって乱数テーブル134の行数(M)以下のランダムな数値の計算が1回行われ、乱数テーブル134の中から算出された数値の行の乱数列が選択され、選択された乱数列を用いてコア番号がランダムに選択される。これにより、乱数計算の処理負荷を軽減して、その処理負荷がI/O制御部110によるストレージ制御性能に与える影響を軽減でき、その結果として、I/O制御部110によるストレージ制御性能を向上させることができる。さらに、このように乱数計算の処理負荷を軽減しつつ、コア番号の選択のランダム性を向上させることができるので、コア#1~#Nにおける負荷分散の精度を高めることができる。
【0093】
また、以上のようなK個のタスクごとの分配制御が、コア#1~コア#Nのそれぞれにおいて独立して実行される。その結果、次の
図13に示すように、コア#1~コア#Nにおける負荷バランスが変動した場合でも、高精度の負荷分散を実現できる。
【0094】
図13は、各コアでタスク分配制御が実行される様子を模式的に示した図である。上記のように、コア#1~コア#Nのそれぞれにおいて実行されるK個のタスクの分配制御は、コア#1~コア#Nの処理能力を収集してPeerSelector[i,*]を生成する処理と、PeerSelector[i,*]を用いてK個のタスクを分配する処理とを含む。これらのうち前者の処理は、収集された処理能力に基づいてコア#1~#Nのそれぞれに対するタスクの分配確率を計算することに相当する。
【0095】
このように、K個のタスクの分配制御は、K個のタスクが発生する期間の先頭において収集された処理能力に基づく分配確率で実行される。すなわち、K個のタスクが発生する期間では、その期間の先頭で算出された1つの分配確率を用いて分配制御が行われる。このため、K個のタスクが発生する期間内でコア間の負荷バランスが変動したとしても、その期間が終了するまで新たな分配確率の計算は行われない。したがって、例えばコア#1~#Nのうちの1つだけが上記手順でコア間の負荷バランスを平準化する場合、K個のタスクが発生する期間内でコア間の負荷バランスが変動すると、負荷バランスの平準化精度が低下してしまう。
【0096】
これに対して、本実施の形態では、
図13に示すように、上記のようなK個のタスクの分配制御が、コア#1~コア#Nのそれぞれにおいて独立して実行される。ここで、K個のタスクのうち2番目以降のタスクは、コアプールから取得されたタスクの実行に伴って新たに生成されるので、K個のタスクの分配制御にかかる時間は、コアプールから取得されたタスクの処理内容によって異なる。このため、K個のタスクの分配制御の進行状況は、コア#1~#Nのそれぞれにおいて異なる。その結果、コア#1~#Nのそれぞれがコア#1~#Nから処理能力を収集して分配確率を算出するタイミングが分散する。
【0097】
結果的に、あるコアが分配確率を算出してK個のタスクを分配する期間の途中で、別のコアが分配確率を算出し直し、その分配確率に基づいて別のK個のタスクを分配する。例えば
図13において、コア#1がK個のタスクの分配制御P11を開始した後、この分配制御P11の実行期間において、コア#3がK個のタスクの分配制御P12を開始し、さらにコア#2がK個のタスクの分配制御P13を開始している。そのため、分配制御P11の開始時において分配確率の計算処理P11aが実行された後、分配制御P11の実行期間においてさらに、分配確率の計算処理P12a,P13aが実行される。
【0098】
このように、K個のタスクの分配制御がコア#1~コア#Nのそれぞれにおいて独立して実行されることで、処理能力の収集結果に基づく分配確率の算出頻度が高まる。そして、このように高頻度で算出された分配確率に基づいてタスクの分配制御が実行されることで、コア間の負荷バランスの変動に対して高速に追随しながらタスクの分配先が適正化されていく。したがって、負荷分散の精度を向上させることができる。
【0099】
次に、第2の実施の形態における処理の一部を変形した変形例について説明する。最初に、乱数テーブル134を用いたM以下のランダムな数値の生成方法に関する変形例1,2について説明する。
【0100】
<変形例1>
第2の実施の形態では、
図10のステップS38において乱数計算によってM以下のランダムな変数mが生成されていた。そして、
図11のステップS41~S43において、乱数テーブル134の中から第m行の乱数列が選択され、選択された乱数列の先頭から1つずつ数値が読み込まれることで、タスクの分配先が決定されていた。これに対して、変形例1では、乱数計算によってK以下のランダムな変数nがさらに生成される。そして、乱数テーブル134の中から第m行の乱数列が選択され、選択された乱数列のうち第n列の数値を先頭として乱数列から数値が巡回的に読み込まれることで、タスクの分配先が決定される。
【0101】
図14は、変形例1におけるタスク分配制御処理を示すフローチャートの例である。この
図14では、
図10、
図11と同じ内容の処理には同じステップ番号を付して示し、その説明を省略する。
【0102】
図14の処理では、
図10のステップS38における変数mの決定後に、ステップS38aの処理が実行される。ステップS38aにおいて、スケジューラ120_iは、乱数計算によりK以下の整数を算出し、この値を変数nに決定する。なお、ステップS38aは、ステップS38の前に実行されてもよい。
【0103】
さらに、
図11のステップS41,S44の代わりにステップS41a,S44aがそれぞれ実行される。ステップS41aにおいて、スケジューラ120_iは、Rand[m,n](乱数テーブル134におけるm行n列の数値)を読み出し、変数cに読み出した値を設定する。また、ステップS44aにおいて、スケジューラ120_iは、変数hを1だけ増加させるとともに、変数nも1だけ増加させる。
【0104】
このような処理によれば、K個のタスクの分配制御のために仮に乱数テーブル134から同じ乱数列が選択されたとしても、ランダムな変数nが用いられることで異なる乱数列が生成される。このため、第2の実施の形態と比較して、タスク分配先のコアを選択する際のランダム性を向上させることができる。また、第2の実施の形態と比較して乱数テーブル134の行数Mを減らした場合でも、第2の実施の形態と同程度のランダム性を得ることができ、この場合には乱数テーブル134の記憶容量を削減できる。
【0105】
<変形例2>
変形例2では、M以下のランダムな数値として、1つの変数mでなく、2つの変数m1,m2が乱数計算によって生成される。そして、乱数テーブル134の中から第m1行の乱数列が選択された後、その乱数列から数値を読み込む際の先頭の列数が、第m2行の乱数列を用いて決定される。
【0106】
図15は、変形例2におけるタスク分配制御処理を示すフローチャートの例である。この
図15では、
図10、
図11と同じ内容の処理には同じステップ番号を付して示し、その説明を省略する。
【0107】
図15の処理では、
図10のステップS38の代わりにステップS38a1,S38b1が実行される。さらに、
図11のステップS41の代わりにステップS41a1が実行される。
【0108】
ステップS38a1において、スケジューラ120_iは、乱数計算によりM以下の整数を算出し、この値を変数m1に決定する。ステップS38a2において、スケジューラ120_iは、乱数計算によりM以下の整数を算出し、この値を変数m2に決定する。そして、ステップS41a1において、スケジューラ120_iは、Rand[m1,Rand[m2,h]]を読み出し、変数cに読み出した値を設定する。このステップS41a1では、乱数テーブル134の中から第m1行の乱数列が選択される。また、選択された乱数列における列数として、乱数テーブル134におけるm2行h列の数値が読み出される。
【0109】
このような処理によれば、K個のタスクの分配制御のために仮に乱数テーブル134から同じ乱数列が利用されたとしても、乱数列から巡回的に数値を選択する際の先頭の列数が他の乱数列に基づいて決定される。このため、第2の実施の形態およびその変形例1と比較して、タスク分配先のコアを選択する際のランダム性を向上させることができる。また、第2の実施の形態および変形例1と比較して乱数テーブル134の行数Mを減らした場合でも、ランダム性を低下させずに乱数テーブル134の記憶容量を削減できる。
【0110】
なお、第2の実施の形態および変形例1,2は、乱数計算によってM以下のランダムな数値が算出され、算出された数値の行の乱数列が乱数テーブル134から選択されてタスク分配制御に利用される点では共通している。これらの処理には、Kの大きさが変化しても乱数の計算量は変化しないという特徴がある。また、Mが大きいほどタスク分配のランダム性は高まるが、乱数テーブル134全体の容量を一定とした場合、Mが小さいほどKが大きくなることから、M,Kによらずほぼ一定のランダム性が得られる、という特徴もある。
【0111】
さらに、MをKの階乗の値とすることで、列方向の数列と行方向の数列のそれぞれにおけるランダム性が等価になるので、結果的に全体のランダム性を向上させることができる。この場合、変形例1では、乱数テーブル134の行数をK倍に拡大したことと等価であり、変形例2では、さらに列数をM倍に拡大したことと等価である。
【0112】
なお、変形例1では、変数mを計算せず、変数nのみを計算してもよい。この場合、乱数テーブル134の行数Mを1行のみとすることができる。この場合、1行の乱数列の先頭から1つずつ数値を選択する場合と比較して、選択される数値のランダム性を高めることができる。
【0113】
<変形例3>
ストレージ制御のための処理(I/O制御部110の処理)には、例えば、即時の応答性能が求められる処理や、複数のコアを同時に使用した並列処理が必要な処理、無限ループなどの処理の異常の影響を限定したい処理がある。こういった処理は、他の種別の処理とは別の専用のコアを用いて実行されることが望ましい。
【0114】
そこで、変形例3では、処理の種別ごとに処理の実行機能を定義する。例えば、特定の種別の処理をそれぞれ実行する専用機能と、これらの特定の種別以外の種別の処理を汎用的に実行する汎用機能とを定義する。そして、CPU101が備えるコアを、専用機能をそれぞれ実現するための1以上のコア集合と、汎用機能をそれぞれ実現するための1以上のコア集合とに分類する。
【0115】
変形例3では、コア集合ごとに上記のようなK個のタスクの分配制御が実行される。また、あるコア集合に属するコアにおいて他のコア集合で実行されるタスクが生成された場合、そのタスクは他のコア集合に属するコアに分配される。このとき、他のコア集合においてコア間の負荷が分散されるように、他のコア集合に対する上記のようなK個のタスクの分配制御が行われる。
【0116】
図16は、機能別コアおよび使用される行列の構成例を示す図である。
図16では例として、CPU101に含まれるコアはコア集合#1,#2,#3に分類されている。コア集合#1は、機能F1を実現するコアの集合である。コア集合#2は、機能F2を実現するコアの集合である。コア集合#3は、機能F3を実現するコアの集合である。機能F2は、特定の第1の種別の処理を実行する専用機能である。機能F3は、特定の第2の種別の処理を実行する別の専用機能である。機能F1は、第1、第2の種別以外の他の種別の処理を汎用的に実行する汎用機能である。また、コア集合#1には、N1個のコア#C1
1~#C1
N1が含まれる。コア集合#2には、N2個のコア#C2
1~#C2
N2が含まれる。コア集合#3には、N3個のコア#C3
1~#C3
N3が含まれる。
【0117】
コア集合#1に属するコアは、機能F1に対応する種別のK個のタスクについては、コア集合#1内のコア#C11~#C1N1の間で負荷バランスが平準化されるように、上記のタスク分配制御を行ってコア#C11~#C1N1にタスクを分配する。その分配制御のために、コア#C11~#C1N1は、PeerProcessingCapa11[N1,N1]とPeerSelector11[N1,K]を用いる。例えば、コア集合#1に属するi番目のコアは、機能F1に対応する種別のK個のタスクを分配する際、コア#C11~#C1N1から処理性能を収集してPeerProcessingCapa11[i,*]を生成する。さらに、i番目のコアは、生成されたPeerProcessingCapa11[i,*]に基づいてPeerSelector11[i,*]を生成し、生成されたPeerSelector11[i,*]を用いてコア#C11~#C1N1にタスクを分配する。
【0118】
また、コア集合#1に属するコアは、機能F2に対応する種別のK個のタスクについては、コア集合#2内のコア#C21~#C2N2の間で負荷バランスが平準化されるように、上記のタスク分配制御を行ってコア#C21~#C2N2にタスクを分配する。その分配制御のために、コア#C11~#C1N1は、PeerProcessingCapa12[N2,N2]とPeerSelector12[N2,K]を用いる。例えば、コア集合#1に属するi番目のコアは、機能F2に対応する種別のK個のタスクを分配する際、コア#C21~#C2N2から処理性能を収集してPeerProcessingCapa12[i,*]を生成する。さらに、i番目のコアは、生成されたPeerProcessingCapa12[i,*]に基づいてPeerSelector12[i,*]を生成し、生成されたPeerSelector12[i,*]を用いてコア#C21~#C2N2にタスクを分配する。
【0119】
さらに、コア集合#1に属するコアは、機能F3に対応する種別のK個のタスクについては、コア集合#3内のコア#C31~#C3N3の間で負荷バランスが平準化されるように、上記のタスク分配制御を行ってコア#C31~#C3N3にタスクを分配する。その分配制御のために、コア#C11~#C1N1は、PeerProcessingCapa13[N3,N3]とPeerSelector13[N3,K]を用いる。例えば、コア集合#1に属するi番目のコアは、機能F3に対応する種別のK個のタスクを分配する際、コア#C31~#C3N3から処理性能を収集してPeerProcessingCapa13[i,*]を生成する。さらに、i番目のコアは、生成されたPeerProcessingCapa13[i,*]に基づいてPeerSelector13[i,*]を生成し、生成されたPeerSelector13[i,*]を用いてコア#C31~#C3N3にタスクを分配する。
【0120】
コア集合#2,#3にそれぞれ属するコアにおいても、同様の処理が行われる。例えば、コア集合#2に属するコア#C21~#C2N2は、PeerProcessingCapa21[N1,N1]とPeerSelector21[N1,K]を用いて、機能F1に対応する種別のK個のタスクをコア#C11~#C1N1に分配する。コア集合#2に属するコア#C21~#C2N2は、PeerProcessingCapa22[N2,N2]とPeerSelector22[N2,K]を用いて、機能F2に対応する種別のK個のタスクをコア#C21~#C2N2に分配する。コア集合#2に属するコア#C21~#C2N2は、PeerProcessingCapa23[N3,N3]とPeerSelector23[N3,K]を用いて、機能F3に対応する種別のK個のタスクをコア#C31~#C3N3に分配する。
【0121】
また、コア集合#3に属するコア#C31~#C3N3は、PeerProcessingCapa31[N1,N1]とPeerSelector31[N1,K]を用いて、機能F1に対応する種別のK個のタスクをコア#C11~#C1N1に分配する。コア集合#3に属するコア#C31~#C3N3は、PeerProcessingCapa32[N2,N2]とPeerSelector32[N2,K]を用いて、機能F2に対応する種別のK個のタスクをコア#C21~#C2N2に分配する。コア集合#3に属するコア#C31~#C3N3は、PeerProcessingCapa33[N3,N3]とPeerSelector33[N3,K]を用いて、機能F3に対応する種別のK個のタスクをコア#C31~#C3N3に分配する。
【0122】
図17は、変形例3におけるタスク分配制御処理を示すフローチャートの例である。
図17の処理は、
図10、
図11の処理の代わりに実行される。ここでは例として、コア集合#1に属するi番目のコアに対応するスケジューラの処理について説明する。
【0123】
[ステップS71]スケジューラは、新たに発生したタスクの種別を判定する。なお、例えば、発生したタスクの情報には、タスクの種別を示す情報が付加されている。スケジューラは、タスクの種別が機能F1に対応する場合、ステップS72の処理を実行し、機能F2に対応する場合、ステップS73の処理を実行し、機能F3に対応する場合、ステップS74の処理を実行する。
【0124】
[ステップS72]スケジューラは、
図10、
図11と同様の手順で、コア集合#1に属するコア#C1
1~#C1
N1に対するタスクの分配制御を実行する。このとき、PeerProcessingCapa11[i,*]とPeerSelector11[i,*]が用いられる。タスクの分配制御では、スケジューラは、コア#C1
1~#C1
N1から処理性能を収集してPeerProcessingCapa11[i,*]を生成する。そして、スケジューラは、生成されたPeerProcessingCapa11[i,*]に基づいてPeerSelector11[i,*]を生成し、生成されたPeerSelector11[i,*]を用いてコア#C1
1~#C1
N1にタスクを分配する。
【0125】
[ステップS73]スケジューラは、
図10、
図11と同様の手順で、コア集合#2に属するコア#C2
1~#C2
N2に対するタスクの分配制御を実行する。このとき、PeerProcessingCapa12[i,*]とPeerSelector12[i,*]が用いられる。タスクの分配制御では、スケジューラは、コア#C2
1~#C2
N2から処理性能を収集してPeerProcessingCapa12[i,*]を生成する。そして、スケジューラは、生成されたPeerProcessingCapa12[i,*]に基づいてPeerSelector12[i,*]を生成し、生成されたPeerSelector12[i,*]を用いてコア#C2
1~#C2
N2にタスクを分配する。
【0126】
[ステップS74]スケジューラは、
図10、
図11と同様の手順で、コア集合#3に属するコア#C3
1~#C3
N3に対するタスクの分配制御を実行する。このとき、PeerProcessingCapa13[i,*]とPeerSelector13[i,*]が用いられる。タスクの分配制御では、スケジューラは、コア#C3
1~#C3
N3から処理性能を収集してPeerProcessingCapa13[i,*]を生成する。そして、スケジューラは、生成されたPeerProcessingCapa13[i,*]に基づいてPeerSelector13[i,*]を生成し、生成されたPeerSelector13[i,*]を用いてコア#C3
1~#C3
N3にタスクを分配する。
【0127】
以上の変形例3によれば、機能別に割り当てられたコア集合を単位として、コア集合内のコア間で高精度に負荷が分散するようにタスクの分配が行うことができる。その結果、各コア集合による処理効率が高まり、その結果としてI/O制御部110の処理全体の性能を向上させることができる。
【0128】
なお、専用機能に対応するストレージ制御上の処理としては、例えば次のような処理がある。
ストレージ制御装置100では、I/O処理対象のデータが一定長のデータユニットに分割されて取り扱われる。このデータユニットは、重複排除の単位にもなる。I/O制御部110のI/O処理部114は、重複排除されたデータユニットをストレージ300に書き込む前に、データユニットをストレージ制御装置100内の一定サイズのバッファに一時的に追記して蓄積する。そして、I/O処理部114は、バッファに複数のデータユニットが蓄積されてそれ以上データユニットを追記できない状態になると、バッファ内の複数のデータユニットをまとめてストレージ300に書き込む。このようなログ構造化データを用いて書き込みが制御されることで、ストレージ300に対する書き込み回数を削減できる。例えば、ストレージ300の記憶装置としてSSDが用いられた場合、SSDへの書き込み回数を削減することで、SSDに含まれるフラッシュメモリの寿命を延ばすことができる。
【0129】
また、このような書き込み制御においては、ストレージ300に格納されたデータのうち無効になったデータについては、ガベージコレクションによって無効化し、それらのデータが格納された領域を再利用できるようにしている。このガベージコレクションの処理では、無効化データの領域の解放を、新たな書き込みデータの発生速度より高速で実行できないと、ある時点でI/O処理の実行を待たせなくてはならなくなったり、I/Oリクエストを拒絶しなければならなくなる。このため、ガベージコレクションに対応するタスクについては実行の優先度を上げることが望ましい。そこで、上記の専用機能に対応する処理としてガベージコレクションの処理を適用することで、ガベージコレクションを、他の機能の処理負荷に影響されずに、専用のコア集合を用いて一定の速度を維持しながら安定的に実行できるようになる。
【0130】
<変形例4>
上記の変形例3では、専用機能を実現するコア集合と汎用機能を実現するコア集合のどちらにおいても、コア集合に含まれる各コアの処理能力に基づいてコア間の負荷が平準化されるようにコアの分配制御が行われた。しかし、専用機能を実現するコア集合では、単純にコア間でタスクが均等に分配されてもよい。これにより、コア集合におけるタスク分配制御のための処理負荷を軽減し、専用機能のためのタスクの実行性能を高めることができる。また、専用機能のためのタスクは特定の種別に属するため、各タスクの処理内容が近いものが多く、コア間での負荷バランスが均衡しやすい。このため、コア間でタスクを均等に分配しても、コア間の負荷バランスが大きく崩れる可能性は低い。
【0131】
図18は、変形例4における機能別コアおよび使用される配列の構成例を示す図である。
図18の例では、
図16と同様に、CPU101のコアは、機能F1に割り当てられたコア集合#1と、機能F2に割り当てられたコア集合#2と、機能F3に割り当てられたコア集合#3とに分類されている。
【0132】
機能F1に対応するタスクは、変形例3と同様に、コア集合#1内のコア#C11~#C1N1の間で負荷バランスが平準化されるように、コア#C11~#C1N1の間で分配される。したがって、コア集合#1に属するコアは、機能F1に対応する種別のK個のタスクについて、PeerProcessingCapa11[N1,N1]とPeerSelector11[N1,K]を用いて、コア#C11~#C1N1にタスクを分配する。また、コア集合#2に属するコアは、機能F1に対応する種別のK個のタスクについて、PeerProcessingCapa21[N1,N1]とPeerSelector21[N1,K]を用いて、コア#C11~#C1N1にタスクを分配する。さらに、コア集合#3に属するコアは、機能F1に対応する種別のK個のタスクについて、PeerProcessingCapa31[N1,N1]とPeerSelector31[N1,K]を用いて、コア#C11~#C1N1にタスクを分配する。
【0133】
一方、機能F2に対応するタスクは、コア集合#2に属するコア#C21~#C2N2に対して均等の確率で分配される。このような分配制御のために、N2個の要素を有するコア選択配列(1行N2列の配列)であるCoreSet12[N2]が、コア集合#1~#3の間で共通に使用される。行列PeerProcessingCapaは使用されない。
【0134】
また、機能F3に対応するタスクは、コア集合#3に属するコア#C31~#C3N3に対して均等の確率で分配される。このような分配制御のために、N3個の要素を有するコア選択配列(1行N3列の配列)であるCoreSet13[N3]が、コア集合#1~#3の間で共通に使用される。行列PeerProcessingCapaは使用されない。
【0135】
図19は、均等分配用のコア選択配列の例を示す図である。機能F2に対応するタスクを均等分配するために利用されるCoreSet12[N2]には、コア集合#2に属するコア#C2
1~#C2
N2の各コア番号が順に1つずつ配置される。また、機能F3に対応するタスクを均等分配するために利用されるCoreSet13[N3]には、コア集合#3に属するコア#C3
1~#C3
N3の各コア番号が順に1つずつ配置される。これらのCoreSet12[N2]およびCoreSet13[N3]は、あらかじめ生成されて記憶部130に格納されていればよい。
【0136】
図20は、変形例4におけるタスク分配制御処理の一部を示すフローチャートの例である。変形例4では、
図17に示したステップS73の代わりに
図20の処理が実行される。
【0137】
[ステップS81]スケジューラは、乱数計算によりN2以下の整数を算出し、この値を変数c1に決定する。
[ステップS82]スケジューラは、CoreSet12[c1](CoreSet12における第c1列の数値)を読み出し、変数r1に読み出した値を設定する。
【0138】
[ステップS83]スケジューラは、コア集合#2に属するコア#C2
1~#C2
N2のうちコア番号#r1のコア#C2
r1に対応するタスクプールに、タスクを追加する。
なお、変形例4ではさらに、
図18に示したステップS47の代わりに、
図20の処理を機能F3について適用した処理が実行される。この処理では、ステップS81でN3以下の変数c1が決定され、ステップS82でCoreSet13[c1]が変数r1に設定され、ステップS83でコア集合#3に属するコア#C3
r1に対応するタスクプールにタスクが追加される。
【0139】
<変形例5>
図20に示した変形例4の処理では、機能F2に対応するタスクが発生するたびに乱数計算(変数c1の計算)が行われていた。これに対して、変形例5では、機能F2(および機能F3)に対応するタスクの分配先を決定する際にも乱数テーブル134を用いることで、乱数計算の実行回数を減少させ、タスク分配制御の処理負荷を軽減する。
【0140】
図21は、変形例5におけるタスク分配制御処理の一部を示すフローチャートの例である。変形例5では、
図17に示したステップS73の代わりに
図21の処理が実行される。また、
図21では、
図17と同様に、例として、コア集合#1に属するi番目のコアに対応するスケジューラの処理について説明する。すなわち、
図21の処理は、当該スケジューラにおいて機能F2に対応するタスクが発生するたびに、そのタスクを処理対象として実行される。
【0141】
[ステップS91]スケジューラは、変数h1がKより大きいかを判定する。スケジューラは、変数h1がKより大きい場合にはステップS92の処理を実行し、変数h1がK以下の場合にはステップS95の処理を実行する。なお、変数h1の初期値はKより大きい任意の整数である。また、ここでは例として、Kの値は機能F1に対応するタスクの分配制御で利用されるKの値と同じであるものとするが、異なる値が利用されてもよい。
【0142】
[ステップS92]スケジューラは、変数h1を1に設定する。
[ステップS93]スケジューラは、乱数計算によりM以下の整数を算出し、この値を変数m3に決定する。
【0143】
[ステップS94]スケジューラは、オフセット値ofsに1を加算して、オフセット値ofsを更新する。このオフセット値ofsは、Kを上限とする数値であり、ステップS94の加算によりKを超えた場合、0にリセットされる。なお、オフセット値ofsの初期値は、0以上K以下の任意の整数である。
【0144】
[ステップS95]スケジューラは、変数c1を次の式(6)によって算出する。なお、演算子%は剰余の計算を示す。
c1=1+((ofs+Rand[m3,h1])%N2) ・・・(6)
[ステップS96]スケジューラは、CoreSet12[c1](CoreSet12における第c1列の数値)を読み出し、変数r1に読み出した値を設定する。
【0145】
[ステップS97]スケジューラは、コア集合#2に属するコア#C21~#C2N2のうちコア番号#r1のコア#C2r1に対応するタスクプールに、タスクを追加する。
[ステップS98]スケジューラは、変数h1を1だけ増加させる。
【0146】
以上の
図21の処理によれば、機能F2に対応するK個のタスクを分配する際に、ステップS93で乱数計算によってM以下のランダムな数が1回だけ計算される。そして、K個のタスクそれぞれの分配先は、最終的にステップS95で乱数テーブル134を用いて決定される。これにより、乱数計算の処理負荷を軽減して、その処理負荷がI/O制御部110によるストレージ制御性能に与える影響を軽減でき、その結果として、I/O制御部110によるストレージ制御性能を向上させることができる。また、このように乱数計算の処理負荷を軽減しつつ、コア番号の選択のランダム性を向上させることができるので、コア#C2
1~#C2
N2における負荷分散の精度を高めることができる。
【0147】
ここで、上記の式(6)は、乱数テーブル134におけるm3行h1列の値にオフセット値ofsを加算した加算値を基に、N2以下のランダムな整数を算出するものである。オフセット値ofsは、機能F2に対応するK個のタスクが分配されるたびに更新される。このオフセット値ofsは、Kがコア集合#2に属するコアの数(N2)より小さい場合に、変数c1のランダム性を確保するための補正値として機能する。したがって、KがN2以上の場合には変数c1は使用されなくてよい。この場合、ステップS94の実行が不要となる。これとともに、オフセット値ofcが固定値0に設定されるか、または式(6)からオフセット値ofsの加算が削除される。
【0148】
なお、ステップS94では、乱数計算によってK以下のランダムな数値を計算することで、オフセット値ofsが設定されてもよい。
また、変形例5ではさらに、
図18に示したステップS47の代わりに、
図21の処理を機能F3について適用した処理が実行される。この処理では、ステップS95でN3以下の変数c1が決定され、ステップS96でCoreSet13[c1]が変数r1に設定され、ステップS97でコア集合#3に属するコア#C3
r1に対応するタスクプールにタスクが追加される。
【0149】
ここで、動的負荷分散の一種であるワークスチールと上記処理との比較について説明する。ワークスチールでは、システム全体でタスクの集合が管理されるため、タスクの登録やタスクの取り出しの際に排他制御が必要となり、この排他制御の処理負荷が大きい。上記の第2の実施の形態やその変形例1~4では、コアごとに個別のタスクプールが設けられ、各コアが独立してタスクプールへのタスクの登録やタスクプールからのタスクの取り出しが行われる。このため、タスクの登録やタスクの取り出しの際に排他制御が必要とならず、ワークスチールと比較してタスク分配制御の処理効率を高めることができる。
【0150】
なお、上記の各実施の形態に示した装置(例えば、情報処理装置1、ストレージ制御装置100,200)の処理機能は、コンピュータによって実現することができる。その場合、各装置が有すべき機能の処理内容を記述したプログラムが提供され、そのプログラムをコンピュータで実行することにより、上記処理機能がコンピュータ上で実現される。処理内容を記述したプログラムは、コンピュータで読み取り可能な記録媒体に記録しておくことができる。コンピュータで読み取り可能な記録媒体としては、磁気記憶装置、光ディスク、光磁気記録媒体、半導体メモリなどがある。磁気記憶装置には、ハードディスク装置(HDD)、磁気テープなどがある。光ディスクには、CD(Compact Disc)、DVD(Digital Versatile Disc)、ブルーレイディスク(Blu-ray Disc:BD、登録商標)などがある。光磁気記録媒体には、MO(Magneto-Optical disk)などがある。
【0151】
プログラムを流通させる場合には、例えば、そのプログラムが記録されたDVD、CDなどの可搬型記録媒体が販売される。また、プログラムをサーバコンピュータの記憶装置に格納しておき、ネットワークを介して、サーバコンピュータから他のコンピュータにそのプログラムを転送することもできる。
【0152】
プログラムを実行するコンピュータは、例えば、可搬型記録媒体に記録されたプログラムまたはサーバコンピュータから転送されたプログラムを、自己の記憶装置に格納する。そして、コンピュータは、自己の記憶装置からプログラムを読み取り、プログラムにしたがった処理を実行する。なお、コンピュータは、可搬型記録媒体から直接プログラムを読み取り、そのプログラムにしたがった処理を実行することもできる。また、コンピュータは、ネットワークを介して接続されたサーバコンピュータからプログラムが転送されるごとに、逐次、受け取ったプログラムにしたがった処理を実行することもできる。
【0153】
以上の各実施の形態に関し、さらに以下の付記を開示する。
(付記1) 複数の処理部を有する情報処理装置であって、
前記複数の処理部の処理能力を収集し、所定数のタスクを、収集された前記処理能力の比率に応じた分配確率で前記複数の処理部に分配するタスク分配処理を、前記複数の処理部のそれぞれが独立して実行する、
情報処理装置。
【0154】
(付記2) 前記情報処理装置は、前記所定数の要素をそれぞれ有する複数の乱数列を記憶する記憶部をさらに有し、
前記タスク分配処理は、さらに、前記複数の乱数列に含まれる乱数列の数以下の値を有する第1の数値をランダムに生成し、前記複数の乱数列から前記第1の数値が示す乱数列を選択する処理を含み、
前記分配では、前記選択された乱数列を用いて前記所定数のタスクを分配する、
付記1記載の情報処理装置。
【0155】
(付記3) 前記タスク分配処理は、さらに、前記所定数の要素を有する数列であって、前記複数の処理部のそれぞれを示す識別番号を前記比率に応じた数だけ含む前記数列を生成する処理を含み、
前記分配では、前記所定数のタスクのそれぞれが発生するたびに、前記選択された乱数列から1つずつ数値を選択し、前記数列に含まれる前記識別番号のうち、前記選択された数値が示す要素として含まれる前記識別番号を読み出し、前記複数の処理部のうち、読み出された前記識別番号に対応する処理部に対して発生したタスクを分配する、
付記2記載の情報処理装置。
【0156】
(付記4) 前記タスク分配処理は、さらに、前記複数の乱数列に含まれる乱数列の数以下の値を有する第2の数値をランダムに生成する処理を含み、
前記選択された乱数列からの数値の選択では、前記第2の数値に基づいて決定される要素を先頭にして、前記選択された乱数列から数値を巡回的に選択する、
付記3記載の情報処理装置。
【0157】
(付記5) 前記情報処理装置は、それぞれ個別のタスク種別に関連付けられた前記複数の処理部を複数組有し、
複数組の前記複数の処理部に含まれるそれぞれの処理部において、
前記複数の処理部のそれぞれについての前記タスク分配処理が実行され、
タスクが発生するたびに発生したタスクのタスク種別が判別され、発生したタスクの分配先が、判別されたタスク種別に対応する前記複数の処理部についての前記タスク分配処理によって決定される、
付記1乃至4のいずれか1つに記載の情報処理装置。
【0158】
(付記6) 前記情報処理装置は、それぞれ個別のタスク種別に関連付けられ、かつ、第1グループと第2グループのいずれかに分類される前記複数の処理部を、複数組有し、
複数組の前記複数の処理部に含まれるそれぞれの処理部において、
前記第1グループに含まれる前記複数の処理部のそれぞれについての前記タスク分配処理が実行され、
タスクが発生するたびに発生したタスクのタスク種別が判別され、前記第1グループに含まれる前記複数の処理部に対応するタスク種別のタスクの分配先が、判別されたタスク種別に対応する前記複数の処理部についての前記タスク分配処理によって決定され、前記第2グループに含まれる前記複数の処理部に対応するタスク種別のタスクが、判別されたタスク種別に対応する前記複数の処理部に対してランダムに分配される、
付記1乃至4のいずれか1つに記載の情報処理装置。
【0159】
(付記7) コンピュータに、
前記コンピュータが備える複数の処理部の処理能力を収集し、所定数のタスクを、収集された前記処理能力の比率に応じた分配確率で前記複数の処理部に分配するタスク分配処理を、前記複数の処理部のそれぞれが独立して実行する、
処理を実行させるタスク管理プログラム。
【0160】
(付記8) 前記コンピュータは、前記所定数の要素をそれぞれ有する複数の乱数列を記憶する記憶部をさらに有し、
前記タスク分配処理は、さらに、前記複数の乱数列に含まれる乱数列の数以下の値を有する第1の数値をランダムに生成し、前記複数の乱数列から前記第1の数値が示す乱数列を選択する処理を含み、
前記分配では、前記選択された乱数列を用いて前記所定数のタスクを分配する、
付記7記載のタスク管理プログラム。
【0161】
(付記9) 前記タスク分配処理は、さらに、前記所定数の要素を有する数列であって、前記複数の処理部のそれぞれを示す識別番号を前記比率に応じた数だけ含む前記数列を生成する処理を含み、
前記分配では、前記所定数のタスクのそれぞれが発生するたびに、前記選択された乱数列から1つずつ数値を選択し、前記数列に含まれる前記識別番号のうち、前記選択された数値が示す要素として含まれる前記識別番号を読み出し、前記複数の処理部のうち、読み出された前記識別番号に対応する処理部に対して発生したタスクを分配する、
付記8記載のタスク管理プログラム。
【0162】
(付記10) 前記タスク分配処理は、さらに、前記複数の乱数列に含まれる乱数列の数以下の値を有する第2の数値をランダムに生成する処理を含み、
前記選択された乱数列からの数値の選択では、前記第2の数値に基づいて決定される要素を先頭にして、前記選択された乱数列から数値を巡回的に選択する、
付記9記載のタスク管理プログラム。
【0163】
(付記11) 前記コンピュータは、それぞれ個別のタスク種別に関連付けられた前記複数の処理部を複数組有し、
複数組の前記複数の処理部に含まれるそれぞれの処理部において、
前記複数の処理部のそれぞれについての前記タスク分配処理が実行され、
タスクが発生するたびに発生したタスクのタスク種別が判別され、発生したタスクの分配先が、判別されたタスク種別に対応する前記複数の処理部についての前記タスク分配処理によって決定される、
付記7乃至10のいずれか1つに記載のタスク管理プログラム。
【0164】
(付記12) 前記コンピュータは、それぞれ個別のタスク種別に関連付けられ、かつ、第1グループと第2グループのいずれかに分類される前記複数の処理部を、複数組有し、
複数組の前記複数の処理部に含まれるそれぞれの処理部において、
前記第1グループに含まれる前記複数の処理部のそれぞれについての前記タスク分配処理が実行され、
タスクが発生するたびに発生したタスクのタスク種別が判別され、前記第1グループに含まれる前記複数の処理部に対応するタスク種別のタスクの分配先が、判別されたタスク種別に対応する前記複数の処理部についての前記タスク分配処理によって決定され、前記第2グループに含まれる前記複数の処理部に対応するタスク種別のタスクが、判別されたタスク種別に対応する前記複数の処理部に対してランダムに分配される、
付記7乃至10のいずれか1つに記載のタスク管理プログラム。
【符号の説明】
【0165】
1 情報処理装置
2a~2c 処理部
S1~S6 ステップ