(57)【要約】【課題】既存のソフトウェアの改変を回避してパケットの振分先のプロセッサとパケットの処理を行うプロセスが動作するプロセッサとを一致させる。【解決手段】通信装置は、複数のプロセッサと、受信されたパケットを振分ルールに従って複数のプロセッサのいずれかに振り分ける振分部と、受信されたパケットが属するフローと振分ルールに従って決定される受信されたパケットの振分先のプロセッサとの対応関係を管理する管理部と、受信されたパケットの処理を行うプロセスを複数のプロセッサの１つに割り当てるスケジューラと、対応関係に基づいて求められる受信されたパケットの振分先のプロセッサに受信されたパケットの処理を行うプロセスを割り当てる設定を前記スケジューラに与える設定部とを含む。【選択図】図２
2016162266.tif 000002
【特許請求の範囲】
【請求項１】
複数のプロセッサと、
受信されたパケットを振分ルールに従って前記複数のプロセッサのいずれかに振り分ける振分部と、
前記受信されたパケットが属するフローと前記振分ルールに従って決定される前記受信されたパケットの振分先のプロセッサとの対応関係を管理する管理部と、
前記受信されたパケットの処理を行うプロセスを前記複数のプロセッサの１つに割り当てるスケジューラと、
前記対応関係に基づいて求められる前記受信されたパケットの振分先のプロセッサに前記受信されたパケットの処理を行うプロセスを割り当てる設定を前記スケジューラに与える設定部と
を含む通信装置。
【請求項２】
前記複数のプロセッサのいずれかへの割当対象のプロセスが前記受信されたパケットの処理を行うプロセスであると判定したときに前記受信されたパケットの処理を行うプロセスに係る情報から前記受信されたパケットが属するフローを示す情報を得て前記管理部に供給する判定部をさらに含み、
前記管理部は、前記フローを示す情報に対応する振分先のプロセッサを示す情報を前記対応関係から求めて前記設定部に供給し、
前記設定部は、前記管理部から供給された振分先のプロセッサを示す情報を用いて前記設定を前記スケジューラに与える
請求項１に記載の通信装置。
【請求項３】
前記管理部は、前記受信されたパケットからフローを示す情報を抽出する一方で、前記振分部によって前記振分先のプロセッサに振り分けられた前記受信されたパケットを前記受信されたパケットの処理を行うプロセスに引き渡す引き渡し部から前記振分先のプロセッサを示す情報を取得し、前記フローの情報と前記プロセッサを示す情報とを前記対応関係として記憶する
請求項１又は２に記載の通信装置。
【請求項４】
前記受信されたパケットが前記通信装置と前記通信装置の通信相手との間の接続を確立するためのパケットである
請求項３に記載の通信装置。
【請求項５】
前記管理部は、前記振分部で使用される前記振分ルールを示す情報を記憶し、前記パケットの属するフローを示す情報と前記振分ルールを示す情報とを用いて得られた前記振分先のプロセッサを示す情報を前記設定部に供給する
請求項１又は２に記載の通信装置。
【請求項６】
前記設定部は、前記スケジューラによって参照されるリストであって前記受信されたパケットの処理を行うプロセスを割当可能なプロセッサが登録されるリストの内容を前記振分先のプロセッサが登録された内容に変更する
請求項１から５のいずれか１項に記載の通信装置。
【請求項７】
前記振分部で使用される前記振分ルールの変更を検出し、変更後の振分ルールを示す情報を前記管理部に通知する検出部をさらに含み、
前記管理部は、前記変更後の振分ルールを示す情報を用いて前記対応関係を更新する
請求項１から６のいずれか１項に記載の通信装置。
【請求項８】
複数のプロセッサを含む通信装置のプロセッサ割当方法であって、
前記通信装置が、
受信されたパケットを振分ルールに従って前記複数のプロセッサのいずれかに振り分け、
前記受信されたパケットが属するフローと前記振分ルールに従って決定される前記受信されたパケットの振分先のプロセッサとの対応関係を管理し、
前記受信されたパケットの処理を行うプロセスを前記複数のプロセッサの１つに割り当てるスケジューラに対し、前記対応関係に基づいて求められる前記受信されたパケットの振分先のプロセッサに前記受信されたパケットの処理を行うプロセスを割り当てる設定を与える
ことを含む通信装置のプロセッサ割当方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、通信装置及びそのプロセッサ割当方法に関する。
【背景技術】
【０００２】
近年、１０Ｇビット／４０Ｇビットイーサネット（登録商標）のような高速通信をサポートするNetwork Interface Card （ＮＩＣ）が、パーソナルコンピュータ（ＰＣ）サー
バの領域でも使われるようになってきている。
【０００３】
一方、Central Processing Unit（ＣＰＵ）の性能に関して、ＣＰＵ単体の動作クロッ
ク数は３．０ＧＨｚ程度に止まっている。但し、ＣＰＵに複数の「コア」（「ＣＰＵコア」とも呼ばれる）を実装し、並列処理可能な実行主体の数を増やすことで性能を向上させる傾向にある。ＣＰＵが複数のコアを備える環境は、マルチコア環境と呼ばれる。マルチコア環境で高い通信性能を得られるように、複数のＣＰＵコアでパケットの送受信を分業する仕組みが開発され、さまざまな通信装置に実装されている。
【０００４】
複数のＣＰＵコアでパケット送受信を分業する仕組みの例としてReceive Side Scaling
（ＲＳＳ）がある。ＲＳＳは、ＮＩＣに複数の受信キューを設け、各受信キューがそれ
ぞれ固有の割り込みを発生することでパケット受信処理を複数のＣＰＵに分散させる技術である。ＮＩＣは、ネットワークからパケットを受信すると、振り分けルールに従ってパケットを各受信キューに振り分ける。これによって、カーネルにおけるパケットの受信処理が複数のＣＰＵで並列に処理される。
【０００５】
一般には、パケットの振り分け先の受信キューは、パケットが属するフローに従って決定される。受信キューは、例えば、送信元ＩＰ（Internet Protocol）アドレス，送信元
ポート番号，宛先ＩＰアドレス，及び宛先ポート番号に基づくハッシュ値に従って決定される。これによって、同一フローのパケットは同一の受信キューに振り分けられ、同一のＣＰＵで処理される。
【０００６】
しかし、ＲＳＳのようにパケットを単に複数のＣＰＵに振り分けるだけでは、パケットの振分け先のＣＰＵとパケットの宛先プロセスが動作するＣＰＵとが異なる場合に次の問題が発生する。すなわち、ＣＰＵ間での処理の引継ぎに伴うＣＰＵ間の割り込み処理やＣＰＵ間でキャッシュ内容を同期させるためのメインメモリへのアクセスのようなオーバヘッドが発生する。
【０００７】
そこで、パケットの振分け先のＣＰＵとパケットの宛先プロセスが動作するＣＰＵとを一致させるために、以下の方式が考えられている。第１の方式として、パケットの宛先プロセスが動作するＣＰＵに合わせてパケットの振分け先のＣＰＵを制御する方式が考えられる。第２の方式として、パケットの振分け先のＣＰＵに合わせてパケットの宛先プロセスが動作するＣＰＵを制御する方式が考えられる。
【０００８】
第１の方式を採用している技術の例としてReceive Flow Steering（ＲＦＳ）やIntel Flow Directorがある。これらの技術は宛先プロセスが動作するＣＰＵとパケットの振分け先のＣＰＵとが一致するように振り分けルールを書き換える技術である。しかし、第１の方式には次のような問題がある。
【０００９】
第１の方式では、制御対象となるフロー毎に振り分けルールが作成される。このため、扱うフローの数が多くなった場合に振り分けテーブルの容量が膨大になる可能性がある。
また、第１の方式では、ＯＳのスケジューラによってプロセスが動作するＣＰＵが変更された場合にパケットが装置に到着した順序とは異なる順序で宛先プロセスに届けられる可能性がある。
【００１０】
一方、第２の方式を採用する技術の例としては、あるセッションに関するカーネル処理とプロキシ処理とを同一のＣＰＵコア内で処理することが可能な並列化されたプロキシ装置がある（例えば、特許文献１）。特許文献１の技術では、複数のＣＰＵコアを備えるマルチコアＣＰＵと、複数のＣＰＵコアに対応する複数のキューを具備する拡張リッスンソケットと、複数のＣＰＵコアに対応する複数のカーネルスレッド及び複数のプロキシスレッドとが備えられる。各カーネルスレッドは、各カーネルスレッドの動作するＣＰＵコアに割り当てられたクライアント側コネクションの確立要求パケットの受信処理を行って、確立待ちソケットを各カーネルスレッドの動作するＣＰＵコアに対応したキューに登録する。各プロキシスレッドは、各プロキシスレッドの動作するＣＰＵコアに対応するキューを参照して、確立待ちソケットが登録されている場合に第１コネクションを確立する。
【先行技術文献】
【特許文献】
【００１１】
【特許文献１】国際公開第２０１１／０９６３０７号
【発明の概要】
【発明が解決しようとする課題】
【００１２】
しかし、特許文献１に記載の技術では、接続を確立する手順において、各プロセスは自身が動作するＣＰＵコアで処理された接続確立用ソケットのみを受け付けるといった独自の仕様を採用している。このため、既存のソフトウェアに適用するにはそのソフトウェアの改変を要する。従って、ソースコードを入手できるソフトウェアにしか適用することができないといった問題があった。
【００１３】
本発明は、既存のソフトウェアの改変を回避してパケットの振分先のプロセッサとパケットの処理を行うプロセスが動作するプロセッサとを一致させることができる技術を提供することを目的とする。
【課題を解決するための手段】
【００１４】
本発明の一態様は、通信装置である。この通信装置は、複数のプロセッサと、受信されたパケットを振分ルールに従って前記複数のプロセッサのいずれかに振り分ける振分部と、前記受信されたパケットが属するフローと前記振分ルールに従って決定される前記受信されたパケットの振分先のプロセッサとの対応関係を管理する管理部と、前記受信されたパケットの処理を行うプロセスを前記複数のプロセッサの１つに割り当てるスケジューラと、前記対応関係に基づいて求められる前記受信されたパケットの振分先のプロセッサに前記受信されたパケットの処理を行うプロセスを割り当てる設定を前記スケジューラに与える設定部とを含む。
【発明の効果】
【００１５】
本発明によれば、既存のソフトウェアの改変を回避してパケットの振分先のプロセッサとパケットの処理を行うプロセスが動作するプロセッサとを一致させることができる。
【図面の簡単な説明】
【００１６】
【図１】図１は、実施形態に係るネットワーク構成例を示す図である。
【図２】図２は、実施形態１に係るサーバ（通信装置）が有する機能を模式的に示す図である。
【図３】図３は、実施形態２に係るサーバ（通信装置）の機能を模式的に示す図である。
【図４】図４は、サーバがクライアントから受信するパケット（フレーム）の一例を示す。
【図５】図５は、パケット振分テーブルのデータ構造例（振分ルールの例）を示す。
【図６】図６は、フロー／ＣＰＵ対応テーブルのデータ構造例を示す。
【図７】図７は、プロセス判定部の動作例の説明図である。
【図８】図８は、ＣＰＵ割当設定部の動作例の説明図である。
【図９】図９は、実施形態２に係るサーバの動作例を示すフローチャートである。
【図１０】図１０は、実施形態２の変形例１に係るサーバの動作例を示すフローチャートである。
【図１１】図１１は、実施形態２の変形例２に係るサーバの動作例を示すフローチャートである。
【図１２】図１２は、実施形態２の変形例３に係るサーバの動作例を示すフローチャートである。
【図１３】図１３は、実施形態２の変形例４に係るサーバの動作例を示すフローチャートである。
【図１４】図１４は、実施形態２における振分ルールの変更時における動作例を示すフローチャートである。
【発明を実施するための形態】
【００１７】
以下、図面を参照して実施形態に係る通信装置について説明する。実施形態の構成は例示であり、実施形態の構成に限定されない。
【００１８】
実施形態では、複数のＣＰＵを備えた通信装置において、既存のソフトウェアに改変を施すことなくパケットの振分け先のＣＰＵとパケットの処理を行うプロセスが動作するＣＰＵとを一致させる。
【００１９】
実施形態では、パケットの宛先プロセス（すなわち、パケットの処理を行うプロセス）がパケットの振分先のＣＰＵと同一のＣＰＵに割り当てられるように、プロセスの割り当て（スケジューリング）を行うスケジューラの動作が制御される。本実施形態では、スケジューラは、通信装置に実装された既存のソフトウェアの一例であるオペレーティングシステム（ＯＳ）が備える一機能である。
【００２０】
図１は、実施形態に係るネットワーク構成例を示す図である。図１において、ネットワークシステムは、サーバ１と、サーバ１とネットワーク３を介して通信するクライアント２とを含む。サーバ１は、クライアント２に情報を発信したりサービスを提供したりする。サーバ１は、データセンターであっても良い。ネットワーク３は、例えば、インターネット、イントラネット、その他のＩＰネットワークである。
【００２１】
サーバ１は、「通信装置」の一例である。但し、通信装置は、サーバ１に限定されず、クライアント２であっても良い。通信装置は、例えば、ＰＣ，サーバマシン，スマートフォン，Personal Digital Assistant（ＰＤＡ）のようなデータ通信機能を有する情報処理装置（コンピュータ）や情報処理装置の集合体である。また、通信装置は、クライアント２やサーバ１のような端末装置に限定されず、ルータやレイヤ３スイッチのような中継装置も含み得る。
【００２２】
サーバ１は、複数のＣＰＵ１１と、各ＣＰＵ１１によって使用されるキャッシュメモリ１２とを含む。図１に示す例では、二つのＣＰＵ１１ＡとＣＰＵ１１Ｂとが図示される一方で、ＣＰＵ１１Ａによって使用されるキャッシュメモリ１２Ａと、ＣＰＵ１１Ｂによって使用されるキャッシュメモリ１２Ｂとが図示されている。
【００２３】
ＣＰＵ１１の数は、例示であり、３以上であっても良い。また、図１に示す例では、複数のＣＰＵ１１を備える例を示しているが、ＣＰＵ１１Ａ及びＣＰＵ１１Ｂの代わりに、マルチコア構成（複数のＣＰＵコアを含む）ＣＰＵが適用されても良い。「複数のＣＰＵ」は、複数のＣＰＵコアを有するＣＰＵを含む概念である。
【００２４】
ＣＰＵ１１Ａ及びＣＰＵ１１Ｂは、メモリコントローラ１３を介してメモリ１４に接続されている。メモリ１４は、揮発性記憶媒体と不揮発性記憶媒体とを含む。揮発性記憶媒体は、例えばRandom Access Memory（ＲＡＭ）である。ＲＡＭは、ＣＰＵ１１の作業領域、プログラムの展開領域，データの記憶領域として使用される。不揮発性記憶媒体は、Read Only Memory（ＲＯＭ），ハードディスクドライブ（ＨＤＤ），Solid State Drive（
ＳＳＤ），Electrically Erasable Programmable Read-Only Memory（ＥＥＰＲＯＭ），
フラッシュメモリなどから選択される少なくとも１つを含む。不揮発性記憶媒体は、ＯＳや様々なアプリケーションプログラム、並びにプログラムの実行時に使用されるデータを記憶する。各キャッシュメモリ１２（キャッシュメモリ１２Ａ，１２Ｂ）は、メモリ１４から読み出されたデータを一時的に記憶する記憶領域として使用される。
【００２５】
また、各ＣＰＵ１１（ＣＰＵ１１Ａ及びＣＰＵ１１Ｂ）は、ＩＯ（Input-Output）バスコントローラ１５を介してＮＩＣ１６と接続されている。ＮＩＣ１６は、ネットワーク３を介してクライアント２とパケットを送受信するためのインタフェース回路である。ＮＩＣ１６として、例えば、Local Area Network（ＬＡＮ）カードを適用することができる。
【００２６】
ＣＰＵ１１Ａ及びＣＰＵ１１Ｂの夫々は、ＯＳ及びアプリケーションプログラムの実行によって、所定の処理を実施する。例えば、プログラムの実行によって、ＣＰＵ１１Ａ及び１１Ｂの夫々は、クライアント２から受信されるパケットを処理するプロセス（通信用プロセス）を生成する。通信用プロセスによって、パケットに対する所定の処理が実行される。
【００２７】
サーバ１では、クライアント２から受信される各パケットの処理が、ＣＰＵ１１ＡとＣＰＵ１１Ｂとを用いた分散処理によって並列に実行される。このため、ＣＰＵ１１Ａ及びＣＰＵ１１Ｂに対するパケットの振り分け処理がＮＩＣ１６によって行われる。
【００２８】
パケットの処理を行うプロセスが動作するＣＰＵは、ＣＰＵ１１Ａ及びＣＰＵ１１Ｂから選択される。パケットの処理を行うプロセスに対するＣＰＵの割り当ては、ＯＳが有する一機能であるスケジューラ１０２によって実行される。
【００２９】
メモリ１４及びキャッシュメモリ１２の夫々は、「記憶装置」，「コンピュータ読み取り可能な記憶媒体」の一例である。ＣＰＵ１１は、「プロセッサ」の一例である。また、「プロセッサ」の語は、ＣＰＵコアを含む概念である。
【００３０】
〔実施形態１〕
図２は、実施形態１に係るサーバ１（通信装置）が有する機能を模式的に示す図である。サーバ１は、通信用プロセス１０１と、プロセスのスケジューラ１０２と、カーネルスレッド１０３と、パケット振分処理部１０４と、プロセス判定部１０５と、ＣＰＵ割当設定部１０６と、フロー／ＣＰＵ対応管理部１０７と、振分先変更検出部１０８とを含む。
【００３１】
通信用プロセス１０１は、「受信されたパケットの処理を行うプロセス」の一例である。スケジューラ１０２は、「スケジューラ」の一例である。カーネルスレッド１０３は、「振り分けられたパケットを受信されたパケットの処理を行うプロセスに引き渡す引き渡し部」の一例である。パケット振分処理部１０４は、「振分部」の一例である。プロセス
判定部１０５は、「判定部」の一例である。ＣＰＵ割当設定部１０６は、「設定部」の一例である。フロー／ＣＰＵ対応管理部１０７は、「管理部」の一例である。振分先変更検出部１０８は、「検出部」の一例である。
【００３２】
パケット振分処理部１０４は、ＮＩＣ１６に備えられる。スケジューラ１０２及びカーネルスレッド１０３は、ＣＰＵ１１のＯＳの実行によって得られる機能である。通信用プロセス１０１，プロセス判定部１０５，ＣＰＵ割当設定部１０６，フロー／ＣＰＵ対応管理部１０７及び振分先変更検出部１０８は、ＣＰＵ１１がプログラムを実行することによって発揮されるＣＰＵ１１の機能である。通信用プロセス１０１，カーネルスレッド１０３は、各ＣＰＵ１１（ＣＰＵ１１Ａ，ＣＰＵ１１Ｂ）上で動作する。スケジューラ１０２，プロセス判定部１０５，ＣＰＵ割当設定部１０６，フロー／ＣＰＵ対応管理部１０７及び振分先変更検出部１０８は、ＣＰＵ１１ＡとＣＰＵ１１Ｂとの少なくとも一方で動作することができる。
【００３３】
通信用プロセス１０１（以下、「プロセス１０１」とも表記）は、通信相手（実施形態ではクライアント２）とデータ通信を行う。カーネルスレッド１０３は、通信相手から受信したパケットに対するプロトコル処理を行い、処理済みのパケットをプロセス１０１に引き渡す。
【００３４】
パケット振分処理部１０４（以下、「振分処理部１０４」とも表記）は、通信相手から受信されたパケット（パケットの処理）を所定の振分アルゴリズム及び振分ルールに従ってＣＰＵ１１Ａ及びＣＰＵ１１Ｂに振り分ける。
【００３５】
フロー／ＣＰＵ対応管理部１０７（以下、「管理部１０７」とも表記）は、受信されたパケットが属するフローと当該フローに属するパケットの振り分け先となるＣＰＵとの対応付け（対応関係）を示す情報（フロー／ＣＰＵ対応情報）を管理する。
【００３６】
プロセス判定部１０５（以下、「判定部１０５」とも表記）は、宛先プロセスが外部とデータ通信を行うプロセス（プロセス１０１）か否かを判定する。ＣＰＵ割当設定部１０６（以下、「設定部１０６」とも表記）は、管理部１０７で管理されるフロー／ＣＰＵ対応情報（対応関係）を参照してプロセス１０１が処理するフローに対応するＣＰＵを示す情報を取得する。設定部１０６は、ＣＰＵを示す情報で特定されるＣＰＵ（ＣＰＵ１１Ａ又はＣＰＵ１１Ｂがプロセス１０１に割り当てられようにスケジューラ１０２の設定を行う。
【００３７】
振分先変更検出部１０８（以下、「検出部１０８」とも表記）は、振分処理部１０４におけるパケットの振分先が変更されたことを検出し、管理部１０７に通知する。管理部１０７は、検出部１０８から通知される変更後のパケットの振分先を示す情報を元に対応関係を更新する。スケジューラ１０２は、設定部１０６によって指定されたＣＰＵ１１をプロセス１０１に割り当てる。
【００３８】
サーバ１は、以下のような手順によって、受信パケットの宛先プロセスが動作するＣＰＵを当該パケットの振分先のＣＰＵに一致させる。
【００３９】
（手順１）サーバ１は、ネットワーク（ネットワーク３）から受信されるパケットを監視する。監視対象のパケットは既に確立されている接続（コネクション）のフローに属するパケットでもよいし、新規に接続（コネクション）を確立するためのパケットでもよい。コネクションは、例えばTransmission Control Protocol（ＴＣＰ）やStream Control Transmission Protocol（ＳＣＴＰ）のセッションである。実施形態ではＴＣＰを例に説
明する。
【００４０】
（手順２）監視対象のパケットに関して、振分処理部１０４によって振り分けられる振分け先のＣＰＵと当該パケットが属するフローの識別情報とが、対応情報として管理部１０７で管理される。フローの識別情報は、例えば、送信元ＩＰアドレス、送信元ポート番号、宛先ＩＰアドレス、宛先ポート番号の４情報である。或いは、フローの識別情報は、４情報に基づいて計算されるハッシュ値でも良い。
【００４１】
（手順３）スケジューラ１０２がプロセスにＣＰＵを割り当てる場合に、判定部１０５は、対象のプロセスが外部とデータ通信を行うプロセス１０１か否かを判定する。手順３において、プロセスがプロセス１０１であると判定された場合には、設定部１０６は、プロセス１０１が処理するフローに属するパケットの振分先のＣＰＵの情報を対応情報から取得する。このとき、プロセスがプロセス１０１でないと判定された場合には、次の手順４.以降は実施されない。
【００４２】
（手順４）設定部１０６は、スケジューラ１０２に対してプロセス１０１を割り当てるＣＰＵとしてパケットの振分先のＣＰＵを指定する。スケジューラ１０２は、指定されたＣＰＵをプロセス１０１に割り当てる。
【００４３】
（手順５）なお、検出部１０８は、受信パケットの振分先のＣＰＵが変更された場合には、管理部１０７で管理されている対応情報（パケットが属するフローと振分先ＣＰＵとの対応関係）を更新する。
【００４４】
このように、実施形態１によると、通信相手と通信するプロセス１０１に割り当てるＣＰＵが振分処理部１０４の振分処理によって決定されたＣＰＵになるように、設定部１０６がスケジューラ１０２に指示する。従って、実施形態１によれば、プロセスの実装を変更することなく（既存のソフトウェアに対する改変を加えることなく）、パケットの宛先プロセスが動作するＣＰＵをパケット振り分け先のＣＰＵに合わせることができる。
【００４５】
実施形態１によれば、背景技術で説明したＲＳＳや第１の方式の適用時における欠点（オーバヘッド発生による遅延や、パケットの順序逆転など）を回避することができる。また、実施形態１によれば、既存のソフトウェアに改変を加えないので、その適用範囲を特許文献１記載の技術に比べて広げることができる。
【００４６】
〔実施形態２〕
図３は、実施形態２に係るサーバ１（通信装置）の機能を模式的に示す図である。図３において、サーバ１は、図２に示したプロセス１０１，スケジューラ１０２，カーネルスレッド１０３，振分処理部１０４，判定部１０５，設定部１０６，管理部１０７，検出部１０８を含む。さらに、サーバ１は、サーバプロセス（接続待ちプロセス）１１１，接続待ちソケット１１２，通信用ソケット１１３，ＣＰＵ割当許可リスト１１４，パケット振分テーブル１１５を含む。
【００４７】
サーバプロセス１１１，接続待ちソケット１１２，通信用ソケット１１３は、ＣＰＵ１１Ａ又はＣＰＵ１１Ｂによって生成される。ＣＰＵ割当許可リスト１１４は、メモリ１４又はキャッシュメモリ１２上に生成される。パケット振分テーブル１１５は、ＮＩＣ１６が有するメモリ（記憶装置）に記憶されている。
【００４８】
サーバプロセス１１１は、通信相手（例えばクライアント２）からの接続要求を接続待ちソケット１１２を経由して受け付けたことを契機に、当該通信相手と通信を行うためのデータ通信用のソケット（通信用ソケット１１３）及び通信用プロセス１０１を生成する。
【００４９】
通信用プロセス１０１は、接続が確立した通信相手と通信用ソケット１１３を介してデータ通信を行う。カーネルスレッド１０３は、振分処理部１０４から受け取ったパケットに対するプロトコル処理を行う。このとき、カーネルスレッド１０３は、通信相手との接続（コネクション）が確立されていなければ、プロトコル処理済みのパケットを接続待ちソケット１１２に引き渡す。これに対し、カーネルスレッド１０３は、通信相手との接続（コネクション）が確立されていれば（通信用ソケット１１３が生成済であれば）、プロトコル処理済みのパケットを通信用ソケット１１３に受け渡す。
【００５０】
接続待ちソケット１１２は、通信相手からの接続を確立するためのパケット（例えば、ＴＣＰにおけるＳＹＮパケット）を受け付けるための専用のインタフェースである。接続待ちソケット１１２は、接続確立用のパケットが届いたときには、対応するサーバプロセス１１１に接続確立用のパケットの到着を通知する。
【００５１】
通信用ソケット１１３は、ＯＳのカーネルと通信用プロセス１０１の間でパケットを相互に受け渡すためのインタフェースを司る。ＮＩＣ１６は、サーバ１宛に送信されたパケットをネットワーク３から受信する。またサーバ１から送信されるパケットをネットワーク３に送出する。
【００５２】
振分処理部１０４は、ネットワーク３から受信されたパケットをパケット振分テーブル１１５が保持する振分けルールに従って各ＣＰＵ１１（ＣＰＵ１１Ａ又はＣＰＵ１１Ｂ）に振分ける。振分処理部１０４は、振分け先のＣＰＵ１１上で動作するカーネルスレッド１０３にパケットを引き渡す。
【００５３】
パケット振分テーブル１１５（以下、「テーブル１１５」とも表記する）は、パケットの振分け先のＣＰＵ１１を決定するための振り分けルールを保持する。振り分けルールは、例えば、パケットのヘッダ情報に基づいたハッシュ値とハッシュ値に対応する振り分け先のＣＰＵを示す情報とから成る。ヘッダ情報として、例えば、送信元ＩＰアドレス、送信元ポート番号、宛先ＩＰアドレス、送信先ポート番号の４情報を使用することができる。
【００５４】
管理部１０７は、受信されたパケットが属するフローと当該フローに属するパケットの振分先となるＣＰＵとの対応関係を示す対応情報を管理する。判定部１０５は、スケジューラ１０２がＣＰＵ１１を割り当てるプロセスが外部と通信を行うプロセス１０１であるか否かを判定する。具体的な方法の一例としては、プロセスの属性情報に通信用ソケット１１３に関する情報がリンクしているか否かで判定することができる。
【００５５】
設定部１０６は、判定部１０５によってプロセスが外部とデータ通信を行うプロセス１０１であると判定された場合に、対応情報を参照してプロセス１０１が処理するフローに対応するＣＰＵ１１を示す情報を取得する。設定部１０６は、ＣＰＵ割当許可リスト１１４の内容を取得したＣＰＵ１１を示す情報に変更する。
【００５６】
ＣＰＵ割当許可リスト１１４（以下、「リスト１１４」とも表記する）は、スケジューラ１０２が所定のプロセスに対して割り当てることができるＣＰＵ１１のリストである。リスト１１４はプロセスごとに存在する。所定のプロセスは、プロセス１０１を含む。
【００５７】
検出部１０８は、或るフローに対するパケットの振分先のＣＰＵ１１が変更されたことを検出する。例えば、検出部１０８は、振分先を変更する手段（例えば管理者（オペレータ）からのコマンド入力）を監視し、コマンド入力によって振分先が変更されたことを検出する。検出部１０８は、振分先の変更内容を管理部１０７に通知する。
【００５８】
スケジューラ１０２は、プロセスに対してＣＰＵ１１を割り当てる。スケジューラ１０２は、割り当て対象のＣＰＵ１１をリスト１１４に登録されたＣＰＵ１１の中から選択する。
【００５９】
＜動作例＞
次に、実施形態２に係る動作例について説明する。図４は、サーバ１がクライアント２から受信するパケット（フレーム）の一例を示す。図４に示すように、パケットＰは、クライアント２からサーバ１へ送信されるユーザデータ（データ：ペイロード）にＴＣＰヘッダ，ＩＰヘッダ，及びデータリンク（ＤＬ）層ヘッダが付与された構造を有する。
【００６０】
ＴＣＰヘッダは、送信元ポート番号及び宛先ポート番号を含む。ＩＰヘッダは、送信元ＩＰアドレス及び宛先ＩＰアドレスを含む。送信元ポート番号として、クライアント２における通信用ポート番号“port1”が設定される。また、宛先ポート番号として、サーバ
１における接続待ちポート番号“port0”が設定される。また、送信元ＩＰアドレスとし
てクライアント２のＩＰアドレス“ip1”が設定され、宛先アドレスとしてサーバ１のＩ
Ｐアドレス“ip0”が設定される。
【００６１】
サーバ１上で動作するサーバプロセス１１１（接続待ちプロセス）は、ソケット関数（socket関数）をコールすることで外部（クライアント２）からの接続要求を受け付けるための接続待ちソケット１１２を生成する。接続待ちソケット１１２の接続待ちＩＰアドレスはＩＰアドレス“ip0”であり、接続待ちポート番号はポート番号“port0”である（図４参照）。
【００６２】
さらに、サーバプロセス１１１は、接続待ちソケット１１２を引数としてリッスン関数（Listen関数）をコールすることで、接続待ＩＰアドレス“ip0”及び接続待ちポート番
号“port0”に対する接続要求を受付可能な状態となる。
【００６３】
ＮＩＣ１６の振分処理部１０４は、ＮＩＣ１６で受信されるパケットのヘッダに付与された宛先ＩＰアドレス，宛先ポート番号、送信元ＩＰアドレス、送信元ポート番号の４情報をフロー識別情報として抽出する。フロー識別情報は、「フローを示す情報」の一例である。振分処理部１０４は、フロー識別情報に基づいてハッシュ値を算出する。さらに、振分処理部１０４は、パケット振分テーブル１１５で保持される振り分けルールに従って受信されたパケットを各ＣＰＵ１１に振り分ける。
【００６４】
ハッシュ値を算出するアルゴリズムとして、例えば“Toeplitz Hash”と呼ばれるハッ
シュ関数を用いてハッシュ値を算出することができる。但し、算出アルゴリズム（ハッシュ関数）は、“Toeplitz Hash”に限定されず、これ以外の算出アルゴリズムを適用可能
である。
【００６５】
図５は、パケット振分テーブル１１５のデータ構造例（振分ルールの例）を示す。図５に示すように、テーブル１１５は、ハッシュ値に対応する振分先ＣＰＵを示す情報を記憶している。動作例では、一例として、ハッシュ値“０”のパケットの振分先ＣＰＵは、識別子“cpu0”で特定されるＣＰＵ１１Ａであり、ハッシュ値“１”のパケットの振分先ＣＰＵは、識別子“cpu1”で特定されるＣＰＵ１１Ｂである。
【００６６】
このように、図５の例では、ハッシュ値が偶数のパケットはcpu0（ＣＰＵ１１Ａ）に、奇数のパケットはcpu1（ＣＰＵ１１Ｂ）に振り分けられる。但し、振り分けルールの設定方法は、上記例に制限されず、他の振り分けルールが適用されても良い。なお、動作例では、振り分けルール（テーブル１１５の登録内容）は管理者（オペレータ）のコマンド入
力により予め設定されている。
【００６７】
クライアント２はサーバ１とのコネクションを確立するために、ＩＰアドレス“ip0”
及びポート番号“port0”を宛先とした接続の確立を要求するパケット（「接続確立要求
パケット」と呼ぶ）を送信する。接続確立要求パケットの構成（フォーマット）は、図４に示したパケットＰの構成を有している。
【００６８】
具体的には、ＩＰヘッダの宛先ＩＰアドレスにはＩＰアドレス“ip0”が設定され、宛
先ポート番号にはポート番号“port0”が設定される。また、送信元ＩＰアドレスにはク
ライアント２に割り当てられたＩＰアドレス“ip1”が設定され、送信元ポート番号には
クライアント２で未使用だったポート番号“port1”が設定される。また、ＴＣＰヘッダ
のフラグフィールドのＳＹＮビットは“１”に設定される。ＳＹＮビットが“１”に設定されることは、当該パケットが接続確立要求パケットであることを意味する。
【００６９】
ネットワーク３から接続確立要求パケットがＮＩＣ１６で受信されると、振分処理部１０４は、接続確立要求パケットのヘッダからフロー識別情報としての４情報を取得し、４情報に対するハッシュ値を計算する。４情報は、宛先ＩＰアドレス“ip0”，宛先ポート
番号“port0”，送信元ＩＰアドレス“ip1”及び送信元ポート番号“port1”である。
【００７０】
このとき、ハッシュ値の計算結果が“４”になったと仮定する。振分処理部１０４は、テーブル１１５の振分ルール（図５）に従って接続確立要求パケットをＣＰＵ１１Ａ（cpu0）に振り分ける。
【００７１】
ＣＰＵ１１Ａ（cpu0）で動作するカーネルスレッド１０３は、振分処理部１０４から接続確立要求パケットを受け取ると、３ウェイハンドシェイク（3way-handshake）と呼ばれる以下の手順に従ってクライアント２との接続（コネクション）を確立する。
【００７２】
（１）パケットのＴＣＰヘッダのＳＹＮビットが“１”に設定されていた場合には、当該パケットの宛先ＩＰアドレス及び宛先ポート番号で接続要求を受け付けているか（接続待ちソケット１１２があるか）をカーネルスレッド１０３はチェックする。このとき、接続要求を受け付けている（接続待ちソケット１１２がある）場合には、カーネルスレッド１０３は、クライアント２へいわゆる“ＳＹＮ＋ＡＣＫパケット”を返送する。
【００７３】
（２）カーネルスレッド１０３は、クライアント２から返送されたＳＹＮ＋ＡＣＫパケットに対する応答（ＡＣＫパケット）を受信する。以上のような３ウェイハンドシェイクによって、クライアント２との間で、上記４情報で特定されるパケットのフローについてのコネクションが確立される。すると、カーネルスレッド１０３は、クライアント２とのデータ通信用のソケット（通信用ソケット１１３）を生成し、接続待ちソケット１１２を介してサーバプロセス１１１（接続待ちプロセス）に引き渡す。
【００７４】
（３）サーバプロセス１１１（接続待ちプロセス）は、カーネルスレッド１０３から通信用ソケット１１３を受け取ると、通信用プロセス１０１を生成し、通信用ソケット１１３を通信用プロセス１０１に引き渡す。これ以降、クライアント２とのデータ通信は通信用ソケット１１３を介して通信用プロセス１０１が行う。すなわち、カーネルスレッド１０３で受信される当該フローのパケットは、通信用ソケット１１３に引き渡され、通信用プロセス１０１がパケットに対して所定の処理を行う。
【００７５】
管理部１０７は、パケットのフローとそのフローに属するパケットの振分先ＣＰＵとの対応関係を管理する。管理部１０７は、フロー／ＣＰＵ対応テーブル１０７Ａ（以下、「テーブル１０７Ａ」とも表記）を有する。
【００７６】
図６は、フロー／ＣＰＵ対応テーブル１０７Ａのデータ構造例を示す。図６において、テーブル１０７Ａは、フローの識別情報で特定されるフローに属するパケットの処理を行う通信用プロセス１０１の割り当て先のＣＰＵ１１を示す情報を記憶する。テーブル１０７Ａは、例えばメモリ１４に記憶される。
【００７７】
フローの識別情報の一例として、宛先ＩＰアドレス，宛先ポート番号，送信元ＩＰアドレス及び送信元ポート番号の４情報（“ip0”，“ip1”，“port0”，“port1”）が格納される。また、フローに属するパケットの処理を行う通信用プロセス１０１が動作するＣＰＵとしてＮＩＣ１６での振分先ＣＰＵと同じＣＰＵ１１の識別子（“cpu0”）が格納される。ＣＰＵ１１の識別子は、「プロセッサを示す情報」の一例である。
【００７８】
テーブル１０７Ａに登録される対応関係は、例えば、管理者からのコマンド入力によって予め設定することができる。例えば、ＮＩＣ１６に対する振分ルールの設定（テーブル１１５への登録）に合わせてテーブル１０７Ａに対応関係を登録する。但し、他の方法により設定がなされても良い。
【００７９】
スケジューラ１０２は、所定のタイミングでプロセススケジューリングを実行し、プロセスに対してＣＰＵ１１を割り当てる。判定部１０５は、割当対象のプロセスがデータ通信を行うプロセス（通信用プロセス１０１）か否かをチェックする。
【００８０】
例えば、チェックは、以下のようにして行うことができる。ＯＳが“Linux（登録商標
）”である場合を例に説明する。図７は、プロセス判定部１０５の動作例の説明図である。以下に説明する情報は、例えばメモリ１４に記憶されている。
【００８１】
（１）判定部１０５は、プロセスの情報を管理するプロセス情報(task_struct構造体)か
らプロセスがオープンしているファイル情報(files_struct構造体)を辿る。続いて、判定部１０５は、ファイル情報中のファイルディスクリプタ情報(file構造体)、ディスクリプタ情報中のディレクトリエントリ情報(dentry構造体)、ｉノード情報(inode構造体)へ辿
る。
【００８２】
（２）ｉノード情報には、モード情報（i_mode）が含まれている。モード情報の値がソケットファイルを示す値（0140000）である場合には、判定部１０５は、プロセスが通信用
プロセス１０１であると判定する。
【００８３】
（３）割当対象のプロセスが通信用プロセス１０１であると判定された場合には、判定部１０５は、以下の手順で通信用プロセス１０１が処理するフロー識別情報を取得する。すなわち、ｉノード情報からソケット情報（socket構造体）、ＩＮＥＴ情報（sock構造体）と辿る。ソケット情報は、ソケットコモン構造体を含んでいる。判定部１０５は、ソケットコモン構造体中の宛先ＩＰアドレス（skc_addrpairの上位４バイト）と、送信元ＩＰアドレス（skc_addrpairの下位４バイト）とを得る。さらに、判定部１０５は、宛先ポート番号（skc_portpairの上位４バイト）と送信元ポート番号（skc_portpairの下位４バイト）を取得する。
【００８４】
上記（１）及び（２）の手順で、判定部１０５は、スケジューラ１０２がＣＰＵ１１を割り当てるプロセスが通信用プロセス１０１であると判定し、（３）の手順で、フロー識別情報を取得し、管理部１０７に引き渡す。
【００８５】
管理部１０７は、フロー識別情報で特定されるフローに属するパケットの割当ＣＰＵの識別情報である“cpu0”をテーブル１０７Ａから読み出して設定部１０６に通知する。設
定部１０６は、以下のような処理を行う。図８は、ＣＰＵ割当設定部１０６の動作例の説明図である。
【００８６】
プロセス情報（task_struct構造体）は、ＣＰＵ割当許可リスト（cpu_allowd）を含ん
でいる。このＣＰＵ割当許可リストがリスト１１４である。リスト１１４は、３１ビットを有し、各ビットには、最下位ビットから順にＣＰＵ（“cpu0”〜“cpu31”）が割り当
てられる。なお、本実施形態では、実際に割り当て及び使用されるのは、サーバ１に搭載されたＣＰＵ１１Ａ（“cpu0”）及びＣＰＵ１１Ｂ（“cpu1”）である。
【００８７】
設定部１０６は、リスト１１４の“cpu0”を示す最下位ビットを“１”設定し、残りのビットを“０”に設定する。“１”は割り当てＯＫを示し、“０”は割り当てＮＧを示す。これによって、振分先ＣＰＵである“cpu0”のみが通信用プロセス１０１の割当先としてリスト１１４に登録された状態となる。
【００８８】
スケジューラ１０２は、プロセススケジューリングにおいて、リスト１１４を参照し、通信用プロセス１０１にＣＰＵ１１Ａ（cpu0）を割り当てる。このようにして、振分先ＣＰＵと、通信用プロセス１０１が動作するＣＰＵとの一致が図られる。
【００８９】
図９は、実施形態２に係るサーバ１の動作例を示すフローチャートである。０１の処理において、管理部１０７は、テーブル１０７Ａにフロー識別情報と振分先ＣＰＵ（割当ＣＰＵ）との対応関係を記憶する。
【００９０】
次の０２及び０３の処理では、スケジューラ１０２は、プロセスにＣＰＵ１１を割り当てるタイミングを待機する。プロセスにＣＰＵ１１を割り当てるタイミングになると（０２，Ｙ）、判定部１０５は、割当対象のプロセスが通信用ソケット１１３をオープンしているか否か（即ち、割当対象のプロセスが通信用プロセス１０１か否か）を判定する（０４）。このとき、プロセスが通信用プロセス１０１でなければ（０４，Ｎ）、処理が０８に進む。これに対し、プロセスが通信用プロセス１０１であれば（０４，Ｙ）、処理が０５に進む。
【００９１】
０５の処理では、判定部１０５は、ソケット情報（socket構造体）からフロー識別情報（宛先ＩＰアドレス，宛先ポート番号，送信元ＩＰアドレス，送信元ポート番号）を取得し、する。
【００９２】
次の０６の処理では、管理部１０７が判定部１０５から通知されたフロー識別情報に対応する割当ＣＰＵの情報をテーブル１０７Ａから読み出し、設定部１０６に渡す。次の０７の処理では、設定部１０６は、リスト１１４に割当ＣＰＵの設定を行う。
【００９３】
そして、０８の処理において、スケジューラ１０２は、リスト１１４に基づいて通信用プロセス１０１を割当ＣＰＵ（振分先ＣＰＵと同一のＣＰＵ）に割り当てる。以上のようにして、パケットの振分先ＣＰＵと、パケットの処理を行う通信用プロセス１０１が動作するＣＰＵとを同一のＣＰＵにすることができる。
【００９４】
以上の動作例において、サーバプロセス１１１及びカーネルスレッド１０３による通信用ソケット１１３及び通信用プロセス１０１は、既存の処理と同じである。また、ＯＳのスケジューラ１０２によるプロセススケジューリング動作にも改変はない。割当対象のプロセスが通信用プロセス１０１であるときに、通信用プロセス１０１の処理対象のフローに対応づけられたＣＰＵにリスト１１４の内容が書き換えられるだけである。よって、既存のＯＳ（スケジューラ１０２）を用いて振分先ＣＰＵと通信用プロセス１０１が割り当てられるＣＰＵとを一致させることができ、ＲＳＳで生じるオーバヘッドや、第１及び第
２の方式に関して述べたような問題の発生を回避することができる。
【００９５】
＜変形例１＞
実施形態２は、以下のように変形することができる。実施形態１では、テーブル１０７Ａへの情報登録は、コマンド入力によって行われていた。これに対し、管理部１０７がネットワーク３から受信されたパケットを分析してフローとＣＰＵとの対応関係を自律的に生成し、テーブル１０７Ａに登録するようにしても良い。
【００９６】
図１０は、実施形態２の変形例１に係るサーバ１の動作例を示すフローチャートである。１０１の処理ででは、管理部１０７は、パケットが受信されたか否かを判定する。このとき、パケットが受信されていなければ（１０１，Ｎ）、処理が０３に進む。これに対し、パケットが受信されていれば（１０１，Ｎ）、処理が１０２に進む。１０１の処理は、例えば、管理部１０７がカーネルスレッド１０３からパケットを受領したか否かを判定することで行うことができる。
【００９７】
次の１０２の処理では、管理部１０７は、受信されたパケットが属するフローのフロー識別情報として、パケットのヘッダから宛先ＩＰアドレス(“ip0”)，宛先ポート番号(“port0”)，送信元ＩＰアドレス(“ip1”)及び送信元ポート番号(“port1”)を取得する。
【００９８】
次の１０３の処理では、管理部１０７は、受信されたパケットを処理するカーネルスレッド１０３が動作するＣＰＵ１１を判別し、当該ＣＰＵ１１を受信パケットの振分先ＣＰＵと判定する。当該処理は、例えば、管理部１０７がカーネルスレッド１０３からパケットとともにカーネルスレッド１０３が動作するＣＰＵ（振分先ＣＰＵ）の識別子を受領することで行うことができる。或いは、管理部１０７がカーネルスレッド１０３にＣＰＵの問合せを行っても良い。
【００９９】
次の１０４では、管理部１０７は、振分先ＣＰＵの識別子とフロー識別情報との対応関係をテーブル１０７Ａに登録する。
【０１００】
図１０における０３〜０８の処理は、実施形態２（図９）の処理と同じであるので説明を省略する。なお、０３の処理において、スケジューラ１０２がＣＰＵを割り当てるタイミングでなければ（０３，Ｎ）、処理が１０１に戻る。
【０１０１】
変形例１によれば、自律的にテーブル１０７Ａが生成されるので、管理者の手間を省くことができる。なお、図１０の処理において、管理部１０７は、パケットが受信される毎にテーブル１０７Ａを更新する。但し、管理部１０７は、同一のフロー識別情報が既にテーブル１０７Ａに登録されている場合には、テーブル１０７Ａの更新を行わない構成を採用することもできる。
【０１０２】
＜変形例２＞
変形例１の動作は、サーバ１がクライアント２との間で接続（コネクション）を確立した後に受信されるパケットを用いて対応関係を登録する例である。これに対し、変形例２として、３ウェイハンドシェイクにおける接続確立用のパケット（ＳＹＮパケット）で対応関係を生成し、テーブル１０７Ａに登録するようにしても良い。
【０１０３】
図１１は、実施形態２の変形例２に係るサーバ１の動作例を示すフローチャートである。変形例２では、パケットが受信された場合に（１０１，Ｙ）、管理部１０７は、当該パケットのＴＣＰヘッダのＳＹＮビットが“１”か否かを判定する。このとき、ＳＹＮビットが“１”であれば（１０１Ａ，Ｙ）、処理が１０２に進み、ＳＹＮビットが“０”であれば（１０１Ａ，Ｎ）、処理が０３に進む。
【０１０４】
１０１Ａの処理を除き、図１１に示す処理は変形例１（図１０）と同じであるので説明を省略する。変形例２では、接続（コネクション）の確立に合わせてテーブル１０７Ａにフロー識別情報とＣＰＵとの対応関係を登録することができる。
【０１０５】
＜変形例３＞
管理部１０７は、ＮＩＣ１６が有するハッシュ値の算出アルゴリズム（「ハッシュ関数」と称する）と振分ルールとを用いて、フロー識別情報と割当ＣＰＵとの対応関係を得ることができる。ハッシュ関数及び振分ルールは、「振分ルールを示す情報」の一例である。
【０１０６】
図１２は、実施形態２の変形例３に係るサーバ１の動作例を示すフローチャートである。２０１の処理において、管理部１０７は、ＮＩＣ１６からハッシュ関数とパケット振分テーブル１１５の内容（振分ルール）を取得する。なお、コマンド入力のようなマニュアル操作を通じて、管理部１０７がハッシュ関数及び振分ルールを取得しても良い。
【０１０７】
その後、実施形態１と同様の０２〜０５の処理が行われ、判定部１０５が管理部１０７にパケットのフロー識別情報を通知する。管理部１０７は、ハッシュ関数とフロー識別情報とを用いてハッシュ値を計算する（２０２）。
【０１０８】
続いて、管理部１０７は、ハッシュ値及び振分ルールを用いてパケットの振分先ＣＰＵ（割当ＣＰＵ）を特定する（２０３）。その後は、実施形態１と同様の０７及び０８の処理が実行され、振分先ＣＰＵと同一のＣＰＵ１１に通信用プロセス１０１が割り当てられる。
【０１０９】
変形例３によれば、テーブル１０７Ａを有しなくても、管理部１０７が割当ＣＰＵを特定し、設定部１０６がリスト１１４上の通信用プロセス１０１を割当可能なＣＰＵを変更することができる。また、管理部１０７とカーネルスレッド１０３との間のパケットの授受が不要となる。もっとも、２０３の処理で特定したＣＰＵの識別子とフロー識別情報とをテーブル１０７Ａに登録し、ＣＰＵの識別子を設定部１０６に通知するようにしても良い。
【０１１０】
＜変形例４＞
実施形態２の変形例４として、上述した変形例３の変形例について説明する。図１３は、実施形態２の変形例４に係るサーバ１の動作例を示すフローチャートである。図１３の２０１の処理では、変形例３と同様に、管理部１０７は、ＮＩＣ１６からハッシュ関数とパケット振分テーブル１１５の内容（振分ルール）を取得する。
【０１１１】
次の２０２Ａの処理では、管理部１０７は、カーネルスレッド１０３からパケットを取得する。次の２０３Ａの処理では、管理部１０７は、パケットからフロー識別情報を抽出し、フロー識別情報及びハッシュ関数を用いてハッシュ値を算出する。さらに、管理部１０７は、振分ルールを用いてハッシュ値に対応するＣＰＵ１１の識別子を得る。そして、管理部１０７は、フロー識別情報とＣＰＵ１１の識別子とを対応づけてテーブル１０７Ａに登録する。
【０１１２】
その後、実施形態２と同様の０２〜０８の処理が実行される。このように、管理部１０７は、カーネルスレッド１０３から得られるパケットと、ハッシュ関数及び振分ルールを用いてテーブル１０７Ａの登録内容（対応関係）を生成することができる。
【０１１３】
なお、図１３の処理においても、図１２に示した２０２及び２０３の処理が実行され、
テーブル１０７Ａに登録されたＣＰＵ１１の識別子と２０３の処理によって得られたＣＰＵ１１の識別子とが一致することをチェックしても良い。この場合、チェックによってＣＰＵ１１の識別子の一致が確認された後に、設定部１０６にＣＰＵ１１の識別子が通知される。
【０１１４】
＜振分先変更の検出＞
実施形態２における検出部１０８の動作例について説明する。検出部１０８は、テーブル１１５の登録内容が変更されたことを検出し、検出した変更を管理部１０７が管理する対応関係に反映させる。
【０１１５】
例えば、動作例として、管理者が、振分ルールの変更コマンドを入力することによって、或るフローに対する通信用プロセスを割り当てるＣＰＵが変更される場合について説明する。
【０１１６】
例えば、宛先ＩＰアドレス“ip0”, 宛先ポート番号“port0”, 送信元ＩＰアドレス“ip1”,及び送信元ポート番号“port1”で識別されるフローの振分先ＣＰＵが“cpu1”（
ＣＰＵ１１Ｂ）に変更されると仮定する。
【０１１７】
図１４は、実施形態２における振分ルールの変更時における動作例を示すフローチャートである。図１４において、０１の処理のように、フロー識別情報とＣＰＵとの対応関係が管理部１０７にて管理されている、と仮定する。
【０１１８】
３０１の処理において、検出部１０８は、変更コマンドの入力（発行）を監視する。このとき、変更コマンドが発行されていなければ、処理が０３に進む。変更コマンドが発行された場合には（３０１，Ｙ）、検出部１０８は変更コマンドを得て処理を３０２に進める。
【０１１９】
３０２の処理では、検出部１０８は、変更コマンドに含まれる処理種別を示す情報を参照し、処理種別がテーブル１１５の内容の変更か否かを判定する。このとき、処理種別がテーブル１１５の内容変更であれば（３０２，Ｙ）、検出部１０８は、変更コマンドを解析し、変更コマンドに含まれたテーブル１１５の変更内容（変更後のフロー識別情報と振分先ＣＰＵの識別子）を取得する（３０３）。そして、次の３０４の処理では、検出部１０８は、変更内容を管理部１０７に通知する。管理部１０７は、変更内容に従ってテーブル１０７Ａの登録内容（すなわち、割当ＣＰＵの値）を“cpu1”に変更する。
【０１２０】
その後は、実施形態２と同様の０３〜０８の処理が実行される。このように、検出部１０８によれば、振分ルールの変更に合わせて管理部１０７の管理する対応関係を変更することができる。以上説明した実施形態は必要に応じて適宜組み合わせることができる。
【符号の説明】
【０１２１】
１・・・サーバ（通信装置）
２・・・クライアント
３・・・ネットワーク
１１・・・ＣＰＵ（プロセッサ）
１４・・・メモリ
１６・・・ネットワークインタフェースカード（ＮＩＣ）
１０１・・・通信用プロセス
１０２・・・プロセススケジューラ
１０３・・・カーネルスレッド
１０４・・・パケット振分処理部
１０５・・・プロセス判定部
１０６・・・ＣＰＵ割当設定部
１０７・・・フロー／ＣＰＵ対応管理部
１０８・・・振分先変更検出部
１１４・・・ＣＰＵ割当許可リスト
１１５・・・パケット振分テーブル
【図１】
2016162266.tif 000003
【図２】
2016162266.tif 000004
【図３】
2016162266.tif 000005
【図４】
2016162266.tif 000006
【図５】
2016162266.tif 000007
【図６】
2016162266.tif 000008
【図７】
2016162266.tif 000009
【図８】
2016162266.tif 000010
【図９】
2016162266.tif 000011
【図１０】
2016162266.tif 000012
【図１１】
2016162266.tif 000013
【図１２】
2016162266.tif 000014
【図１３】
2016162266.tif 000015
【図１４】
2016162266.tif 000016