(19)【発行国】日本国特許庁(JP)
(12)【公報種別】公開特許公報(A)
(11)【公開番号】P2024180507
(43)【公開日】2024-12-26
(54)【発明の名称】サーバおよびプログラム
(51)【国際特許分類】
G06F 9/48 20060101AFI20241219BHJP
G06F 9/455 20180101ALI20241219BHJP
【FI】
G06F9/48 100Z
G06F9/455 150
【審査請求】有
【請求項の数】7
【出願形態】OL
(21)【出願番号】P 2024177790
(22)【出願日】2024-10-10
(62)【分割の表示】P 2023506646の分割
【原出願日】2021-03-18
(71)【出願人】
【識別番号】000004226
【氏名又は名称】日本電信電話株式会社
(74)【代理人】
【識別番号】110001807
【氏名又は名称】弁理士法人磯野国際特許商標事務所
(72)【発明者】
【氏名】藤本 圭
(72)【発明者】
【氏名】金子 雅志
(57)【要約】
【課題】消費電力の低減を図りつつ、APLを改変することなく、サーバ内の遅延を小さくしてパケット転送を行う。
【解決手段】OS70が、リングバッファ72と、ポールリスト186と、を有し、カーネル171内に、ポーリングモデルを用いてパケット到着を監視するthreadを立ち上げるサーバ内遅延制御装置100を備え、ポールリスト186を監視するパケット到着監視部110と、パケットが到着している場合は、リングバッファ72に保持したパケットを参照し、次に行う処理に基づいて該当するキューのエントリをリングバッファ72から削除する刈取りを実行するパケット刈取部120と、パケットが所定期間到着しない場合はスレッドをスリープさせ、かつ、パケット到着時はこのスレッドのハードウェア割込によりスリープ解除を行うsleep管理部130と、を備える。
【選択図】
図1
【特許請求の範囲】
【請求項1】
サーバ内遅延制御装置であって、
OSが、
カーネルと、
前記OSを備えるサーバ中のメモリ空間で、前記カーネルが管理するリングバッファと、
インターフェイス部からのハードウェア割込がどのデバイスのものであるかを示すネットデバイスの情報を登録するポールリストと、を有し、
前記カーネル内に、ポーリングモデルを用いてパケット到着を監視するスレッドを立ち上げる前記サーバ内遅延制御装置を備えており、
前記サーバ内遅延制御装置は、
前記ポールリストを監視するパケット到着監視部と、
パケットが到着している場合は、前記リングバッファに保持したパケットを参照し、次に行う処理に基づいて該当するキューのエントリを前記リングバッファから削除する刈取りを実行するパケット刈取部と、
パケットが所定期間到着しない場合は前記スレッドをスリープさせ、かつ、パケット到着時はハードウェア割込により当該スレッドのスリープ解除を行うスリープ管理部と、を備える
ことを特徴とするサーバ内遅延制御装置。
【請求項2】
サーバ内遅延制御装置であって、
仮想マシン内で動作するGuest OSが、
カーネルと、
前記Guest OSを備えるサーバ中のメモリ空間で、前記カーネルが管理するリングバッファと、
インターフェイス部からのハードウェア割込がどのデバイスのものであるかを示すネットデバイスの情報を登録するポールリストと、
刈取りが実行されたパケットのプロトコル処理を行うプロトコル処理部と、を有し、
前記カーネル内に、ポーリングモデルを用いてパケット到着を監視するスレッドを立ち上げる前記サーバ内遅延制御装置を備えており、
前記サーバ内遅延制御装置は、
前記ポールリストを監視するパケット到着監視部と、
パケットが到着している場合は、前記リングバッファに保持したパケットを参照し、次に行う処理に基づいて該当するキューのエントリを前記リングバッファから削除する前記刈取りを実行するパケット刈取部と、
パケットが所定期間到着しない場合は前記スレッドをスリープさせ、かつ、パケット到着時はハードウェア割込により当該スレッドのスリープ解除を行うスリープ管理部と、を備える
ことを特徴とするサーバ内遅延制御装置。
【請求項3】
サーバ内遅延制御装置であって、
仮想マシンおよび前記仮想マシン外に形成された外部プロセスが動作可能なHost OSが、
カーネルと、
前記Host OSを備えるサーバ中のメモリ空間で、前記カーネルが管理するリングバッファと、
インターフェイス部からのハードウェア割込がどのデバイスのものであるかを示すネットデバイスの情報を登録するポールリストと、
前記カーネルにより作成される仮想インターフェイスであるtapデバイスと、を備え、
前記カーネル内に、ポーリングモデルを用いてパケット到着を監視するスレッドを立ち上げる前記サーバ内遅延制御装置を備えており、
前記サーバ内遅延制御装置は、
前記ポールリストを監視するパケット到着監視部と、
パケットが到着している場合は、前記リングバッファに保持したパケットを参照し、次に行う処理に基づいて該当するキューのエントリを前記リングバッファから削除する刈取りを実行するパケット刈取部と、
パケットが所定期間到着しない場合は前記スレッドをスリープさせ、かつ、パケット到着時はハードウェア割込により当該スレッドのスリープ解除を行うスリープ管理部と、を備える
ことを特徴とするサーバ内遅延制御装置。
【請求項4】
前記スリープ中に、前記スレッドが使用するCPUコアのCPU動作周波数を低く設定するCPU周波数設定部を備える
ことを特徴とする請求項1乃至3のいずれか一項に記載のサーバ内遅延制御装置。
【請求項5】
前記スリープ中に、前記スレッドが使用するCPUコアのCPUアイドル状態を省電力モードに設定するCPUアイドル設定部を備える
ことを特徴とする請求項1乃至3のいずれか一項に記載のサーバ内遅延制御装置。
【請求項6】
前記カーネルは、当該カーネルを起動させたまま、処理動作を変更可能なパッチを有する
ことを特徴とする請求項1乃至3のいずれか一項に記載のサーバ内遅延制御装置。
【請求項7】
サーバ内遅延制御装置のサーバ内遅延制御方法であって、
OSが、
カーネルと、
前記OSを備えるサーバ中のメモリ空間で、前記カーネルが管理するリングバッファと、
インターフェイス部からのハードウェア割込がどのデバイスのものであるかを示すネットデバイスの情報を登録するポールリストと、を有し、
前記カーネル内に、ポーリングモデルを用いてパケット到着を監視するスレッドを立ち上げるサーバ内遅延制御装置を備えており、
前記サーバ内遅延制御装置は、
前記ポールリストを監視するステップと、
パケットが到着している場合は、前記リングバッファに保持したパケットを参照し、次に行う処理に基づいて該当するキューのエントリを前記リングバッファから削除する刈取りを実行するステップと、
パケットが所定期間到着しない場合は前記スレッドをスリープさせ、かつ、パケット到着時はハードウェア割込により当該スレッドのスリープ解除を行うステップと、を実行する
ことを特徴とするサーバ内遅延制御方法。
【請求項8】
OSが、
カーネルと、
前記OSを備えるサーバ中のメモリ空間で、前記カーネルが管理するリングバッファと、
インターフェイス部からのハードウェア割込がどのデバイスのものであるかを示すネットデバイスの情報を登録するポールリストと、を有し、
前記カーネル内に、ポーリングモデルを用いてパケット到着を監視するスレッドを立ち上げるサーバ内遅延制御装置を備えており、前記サーバ内遅延制御装置としてのコンピュータに、
前記ポールリストを監視するパケット到着監視手順、
パケットが到着している場合は、前記リングバッファに保持したパケットを参照し、次に行う処理に基づいて該当するキューのエントリを前記リングバッファから削除する刈取りを実行するパケット刈取手順、
パケットが所定期間到着しない場合は前記スレッドをスリープさせ、かつ、パケット到着時はハードウェア割込により当該スレッドのスリープ解除を行うスリープ管理手順、
を実行させるためのプログラム。
【発明の詳細な説明】
【技術分野】
【0001】
本発明は、サーバ内遅延制御装置、サーバ内遅延制御方法およびプログラムに関する。
【背景技術】
【0002】
NFV(Network Functions Virtualization:ネットワーク機能仮想化)による仮想化技術の進展などを背景に、サービス毎にシステムを構築して運用することが行われている。また、上記サービス毎にシステムを構築する形態から、サービス機能を再利用可能なモジュール単位に分割し、独立した仮想マシン(VM:Virtual Machineやコンテナなど)環境の上で動作させることで、部品のようにして必要に応じて利用し運用性を高めるといったSFC(Service Function Chaining)と呼ばれる形態が主流となりつつある。
【0003】
仮想マシンを構成する技術としてLinux(登録商標)とKVM(kernel-based virtual machine)で構成されたハイパーバイザー環境が知られている。この環境では、KVMモジュールが組み込まれたHost OS(物理サーバ上にインストールされたOSをHost OSと呼ぶ)がハイパーバイザーとしてカーネル空間と呼ばれるユーザ空間とは異なるメモリ領域で動作する。この環境においてユーザ空間にて仮想マシンが動作し、その仮想マシン内にGuest OS(仮想マシン上にインストールされたOSをGuest OSと呼ぶ)が動作する。
【0004】
Guest OSが動作する仮想マシンは、Host OSが動作する物理サーバとは異なり、(イーサーネットカードデバイスなどに代表される)ネットワークデバイスを含むすべてのHW(hardware)が、HWからGuest OSへの割込処理やGuest OSからハードウェアへの書き込みに必要なレジスタ制御となる。このようなレジスタ制御では、本来物理ハードウェアが実行すべき通知や処理がソフトウェアで擬似的に模倣されるため、性能がHost OS環境に比べ、低いことが一般的である。
【0005】
この性能劣化において、特にGuest OSから自仮想マシン外に存在するHost OSや外部プロセスに対して、HWの模倣を削減し、高速かつ統一的なインターフェイスにより通信の性能と汎用性を向上させる技術がある。この技術として、virtioというデバイスの抽象化技術、つまり準仮想化技術が開発されており、すでにLinux(登録商標)を始め、FreeBSD(登録商標)など多くの汎用OSに組み込まれ、現在利用されている。
【0006】
virtioでは、コンソール、ファイル入出力、ネットワーク通信といったデータ入出力に関して、転送データの単一方向の転送用トランスポートとして、リングバッファで設計されたキューによるデータ交換をキューのオペレーションにより定義している。そして、virtioのキューの仕様を利用して、それぞれのデバイスに適したキューの個数と大きさをGuest OS起動時に用意することにより、Guest OSと自仮想マシン外部との通信を、ハードウェアエミュレーションを実行せずにキューによるオペレーションだけで実現することができる。
【0007】
[割込モデルによるパケット転送(汎用VM構成の例)]
図9は、汎用Linux kernel(登録商標)およびVM構成のサーバ仮想化環境における、割込モデルによるパケット転送を説明する図である。
HW10は、NIC(Network Interface Card)11(物理NIC)(インターフェイス部)を有し、Host OS20、仮想マシンを構築するハイパーバイザーであるKVM30、仮想マシン(VM1,VM2)40、およびGuest OS50により構築された仮想通信路を経由してuser space(ユーザスペース)60上のパケット処理APL(Application)1との間でデータ送受信の通信を行う。以下の説明において、
図9の太矢印に示すように、パケット処理APL1が、HW10からのパケットを受け取るデータの流れをRx側受信と称し、パケット処理APL1が、HW10にパケットを送信するデータの流れをTx側送信と称する。
【0008】
Host OS20は、kernel21、Ring Buffer22、およびDriver23を有し、kernel21は、kernel threadであるvhost-netモジュール221と、tapデバイス222と、仮想スイッチ(br)223と、を有する。
【0009】
tapデバイス222は、仮想ネットワークのカーネルデバイスであり、ソフトウェアでサポートされている。仮想マシン(VM1)40は、仮想ブリッジ(bridge)に作成される仮想スイッチ(br)223を介してGuest OS50とHost OS20が通信できる。tapデバイス222は、この仮想ブリッジに作成されるGuest OS50の仮想NIC(vNIC)と繋がるデバイスである。
【0010】
Host OS20は、Guest OS50の仮想マシン内で構築された構成情報(共有バッファキューの大きさ、キューの数、識別子、リングバッファへアクセスするための先頭アドレス情報など)をvhost-netモジュール221にコピーし、仮想マシン側の端点の情報をHost OS20内部に構築する。このvhost-netモジュール221は、virtioネットワーキング用のカーネルレベルのバックエンドであり、virtioパケット処理タスクをユーザ領域(ユーザ空間)からkernel21のvhost-netモジュール221に移すことで仮想化のオーバーヘッドを低減できる。
【0011】
Guest OS50は、仮想マシン(VM1)上にインストールされたGuest OS(Guest1)と、仮想マシン(VM2)上にインストールされたGuest OS(Guest2)と、を有し、仮想マシン(VM1,VM2)40内でGuest OS50(Guest1,Guest2)が動作する。Guest OS50として、Guest1を例に採ると、Guest OS50(Guest1)は、kernel51、Ring Buffer52、およびDriver53を有し、Driver53は、virtio-driver531を備える。
【0012】
具体的には、PCI(Peripheral Component Interconnect)デバイスとして仮想マシン内にコンソール、ファイル入出力、ネットワーク通信それぞれに対しvirtioデバイスが存在し(コンソールはvirtio-console、ファイル入出力はvirtio-blk、ネットワークはvirtio-netと呼ばれるデバイスとそれに対応するOSが持つドライバがvirtioキューで定義されている)、Guest OS起動時に、Guest OSと相手側とのデータの受け渡し端点(送受信端点)を2つ作り、データ送受信の親子関係を構築する。多くの場合、親子関係は仮想マシン側(子側)とGuest OS(親側)で構成する。
【0013】
子側は仮想マシン内のデバイスの構成情報として存在し、それぞれのデータ領域のサイズと必要とする端点の組み合わせの個数、デバイスの種別を親側に要求する。親側は子側の要求に従い、必要な分のデータを貯蓄し受け渡すための共有バッファキューのためのメモリを割り当て確保し、子側がアクセスできるようにそのアドレス番地を子側に返す。データの受け渡しに必要とされる共有バッファキューのオペレーションについては、virtioではすべて共通であり、親側、子側両方合意済みとして実行される。さらに共有バッファキューの大きさも両方合意済みとする(つまりデバイスごとに決まっている)。これにより、子側にアドレスを伝えるだけで、親側、子側の双方が共有するキューを操作することが可能となる。
【0014】
virtioにおいて用意する共有バッファキューは単一方向用として用意されるため、例えば、virtio-netデバイスと呼ばれる仮想ネットワークデバイスでは送信用、受信用、コントロール用の3つのRing Buffer52で構成される。親と子の通信は、共有バッファキューへの書き込みとバッファ更新通知により実現し、Ring Buffer52に書き込んだ後、相手側に通知する。相手側は通知を受けると、どの共有バッファキューにどの程度新規のデータが入っているのかをvirtioの共通オペレーションを利用して確認し、新規のバッファ領域を取り出す。これにより、親から子または子から親へのデータの受け渡しが成立する。
【0015】
以上のように、親子でお互いデータ交換用のRing Buffer52とそれぞれのリングバッファ用のオペレーション方法(virtioで共通)を共有することにより、ハードウェアエミュレーションを必要としない、Guest OS50と外部との通信を実現する。これにより、従来のハードウェアエミュレーションに比べ、Guest OS50と外部とのデータの送受信を高速に実現することが可能である。
【0016】
仮想マシン内のGuest OS50が外部と通信する場合は、子側が外部と接続し、子側が外部と親側の中継役としてデータを送受信する必要がある。例えば、Guest OS50とHost OS20間の通信がその例の1つである。ここで、外部をHost OS20とした場合、既存の通信方法として2パターン存在する。
【0017】
第1の方法(以下、外部通信方式1と呼ぶ)は、仮想マシン内に子側の端点を構築し、Guest OS50と仮想マシン間の通信と、Host OS20が提供する通信端点(通常、tap/tunデバイスと呼ばれる)を、仮想マシン内で接続する。この接続により以下のとおりの接続を構築し、Guest OS50からHost OS20への通信を実現する。
【0018】
このとき、Guest OS50はtapドライバやHost OS20が動作するカーネル空間というメモリ領域とは異なる権限を持つユーザ空間であるメモリ領域で動作している。このため、Guest OS50からHost OS20への通信には最低1回メモリコピーが発生してしまう。
【0019】
第2の方法(以下、外部通信方式2と呼ぶ)は、これを解決する手段として、vhost-netという技術が存在する。vhost-netでは一度仮想マシン内で構築された親側の構成情報(共有バッファキューの大きさ、キューの数、識別子、リングバッファへアクセスするための先頭アドレス情報など)をHost OS20内部のvhost-netモジュール221にコピーし、子側の端点の情報をホスト内部に構築する。この構築により、共有バッファキューの操作をGuest OS50とHost OS20間で直接実施することを可能とする技術である。これにより、コピーは実質0回で済むようになり、virtio-netに比べ、コピー回数が1回少ない分、外部通信方式1と比較し、より高速にデータ転送が実現できる。
【0020】
このように、virtioで接続されたHost OS20とGuest OS50において、virtio-net関連のメモリコピー回数を減らすことにより、パケット転送処理を高速化することができる。
【0021】
なお、kernel v4.10(2017.2~)以降、tapインターフェイスの仕様変更があり、tapデバイスから挿入されたパケットは、tapデバイスへパケットコピーを行った処理と同一コンテキスト内で完結されるようになった。これにより、ソフトウェア割込(softIRQ)の発生がなくなった。
【0022】
[ポーリングモデルによるパケット転送(DPDKの例)]
複数の仮想マシンを接続、連携させる手法はInter-VM Communicationと呼ばれ、データセンタなどの大規模な環境では、VM間の接続に、仮想スイッチが標準的に利用されてきた。しかし、通信の遅延が大きい手法であることから、より高速な手法が新たに提案されている。例えば、SR-IOV(Single Root I/O Virtualization)と呼ばれる特別なハードウェアを用いる手法や、高速パケット処理ライブラリであるIntel DPDK(Intel Data Plane Development Kit)(以下、DPDKという)を用いたソフトウェアによる手法などが提案されている(非特許文献1参照)。
【0023】
DPDKは、従来Linux kernel(登録商標)が行っていたNIC(Network Interface Card)の制御をユーザ空間で行うためのフレームワークである。Linux kernelにおける処理との最大の違いは、PMD(Pull Mode Driver)と呼ばれるポーリングベースの受信機構を持つことである。通常、Linux kernelでは、NICへのデータの到達を受けて、割込が発生し、それを契機に受信処理が実行される。一方、PMDは、データ到達の確認や受信処理を専用のスレッドが継続的に行う。コンテキストスイッチや割込などのオーバーヘッドを排除することで高速なパケット処理を行うことができる。DPDKは、パケット処理のパフォーマンスとスループットを大幅に高めて、データプレーン・アプリケーション処理に多くの時間を確保することを可能にする。
【0024】
DPDKは、CPU(Central Processing Unit)やNICなどのコンピュータ資源を占有的に使用する。このため、SFCのようにモジュール単位で柔軟につなぎ替える用途には適用しづらい。これを緩和するためのアプリケーションであるSPP(Soft Patch Panel)がある。SPPは、VM間に共有メモリを用意し、各VMが同じメモリ空間を直接参照できる構成にすることで、仮想化層でのパケットコピーを省略する。また、物理NICと共有メモリ間のパケットのやり取りには、DPDKを用いて高速化を実現する。SPPは、各VMのメモリ交換の参照先を制御することで、パケットの入力先、出力先をソフトウェア的に変更することができる。この処理によって、SPPは、VM間やVMと物理NIC間の動的な接続切替を実現する。
【0025】
図10は、OvS-DPDK(Open vSwitch with DPDK)の構成における、ポーリングモデルによるパケット転送を説明する図である。
図9と同一構成部分には、同一符号を付して重複箇所の説明を省略する。
図10に示すように、Host OS20は、パケット処理のためのソフトウェアであるOvS-DPDK70を備え、OvS-DPDK70は、仮想マシン(ここではVM1)に接続するための機能部であるvhost-user71と、NIC(DPDK)11(物理NIC)に接続するための機能部であるdpdk(PMD)72と、を有する。
また、パケット処理APL1Aは、Guest OS50区間においてポーリングを行う機能部であるdpdk(PMD)2を具備する。すなわち、パケット処理APL1Aは、
図9のパケット処理APL1にdpdk(PMD)2を具備させて、パケット処理APL1を改変したAPLである。
【0026】
ポーリングモデルによるパケット転送は、DPDKの拡張として、共有メモリを介してゼロコピーでHost OS20とGuest OS50間、および、Guest OS50間のパケットコピーを高速に行うSPPにおいて、GUIにより経路操作を可能とする。
【0027】
[New API(NAPI)によるRx側パケット処理]
図11は、Linux kernel 2.5/2.6より実装されているNew API(NAPI)によるRx側パケット処理の概略図である(非特許文献2参照)。
図9と同一構成部分には、同一符号を付している。
図11に示すように、New API(NAPI)は、OS70(例えば、Host OS)を備えるサーバ上で、ユーザが使用可能なuser space60に配置されたパケット処理APL1を実行し、OS70に接続されたHW10のNIC11とパケット処理APL1との間でパケット転送を行う。
【0028】
OS70は、kernel71、Ring Buffer72、およびDriver73を有し、kernel71は、プロトコル処理部74を有する。
Kernel71は、OS70(例えば、Host OS)の基幹部分の機能であり、ハードウェアの監視やプログラムの実行状態をプロセス単位で管理する。ここでは、kernel71は、パケット処理APL1からの要求に応えるとともに、HW10からの要求をパケット処理APL1に伝える。Kernel71は、パケット処理APL1からの要求に対して、システムコール(「非特権モードで動作しているユーザプログラム」が「特権モードで動作しているカーネル」に処理を依頼)を介することで処理する。
Kernel71は、Socket75を介して、パケット処理APL1へパケットを伝達する。Kernel71は、Socket75を介してパケット処理APL1からパケットを受信する。
【0029】
Ring Buffer72は、Kernel71が管理し、サーバ中のメモリ空間にある。Ring Buffer72は、Kernel71が出力するメッセージをログとして格納する一定サイズのバッファであり、上限サイズを超過すると先頭から上書きされる。
【0030】
Driver73は、kernel71でハードウェアの監視を行うためデバイスドライバである。なお、Driver73は、kernel71に依存し、作成された(ビルドされた)カーネルソースが変われば、別物になる。この場合、該当ドライバ・ソースを入手し、ドライバを使用するOS上で再ビルドし、ドライバを作成することになる。
【0031】
プロトコル処理部74は、OSI(Open Systems Interconnection)参照モデルが定義するL2(データリンク層)/L3(ネットワーク層)/L4(トランスポート層)のプロトコル処理を行う。
【0032】
Socket75は、kernel71がプロセス間通信を行うためのインターフェイスである。Socket75は、ソケットバッファを有し、データのコピー処理を頻繁に発生させない。Socket75を介しての通信確立までの流れは、下記の通りである。1.サーバ側がクライアントを受け付けるソケットファイルを作成する。2.受付用ソケットファイルに名前をつける。3.ソケット・キューを作成する。4.ソケット・キューに入っているクライアントからの接続の最初の1つを受け付ける。5.クライアント側ではソケットファイルを作成する。6.クライアント側からサーバへ接続要求を出す。7.サーバ側で、受付用ソケットファイルとは別に、接続用ソケットファイルを作成する。通信確立の結果、パケット処理APL1は、kernel71に対してread()やwrite()などのシステムコールを呼び出せるようになる。
【0033】
以上の構成において、Kernel71は、NIC11からのパケット到着の知らせを、ハードウェア割込(hardIRQ)により受け取り、パケット処理のためのソフトウェア割込(softIRQ)をスケジューリングする。
上記、Linux kernel 2.5/2.6より実装されているNew API(NAPI)は、パケットが到着するとハードウェア割込(hardIRQ)の後、ソフトウェア割込(softIRQ)により、パケット処理を行う。
図11に示すように、割込モデルによるパケット転送は、割込処理(
図11の符号c参照)によりパケットの転送を行うため、割込処理の待ち合わせが発生し、パケット転送の遅延が大きくなる。
【0034】
以下、NAPI Rx側パケット処理概要について説明する。
[New API(NAPI)によるRx側パケット処理構成]
図12は、
図11の破線で囲んだ箇所におけるNew API(NAPI)によるRx側パケット処理の概要を説明する図である。
<Device driver>
図12に示すように、Device driverには、ネットワークインターフェースカードであるNIC11(物理NIC)、NIC11の処理要求の発生によって呼び出され要求された処理(ハードウェア割込)を実行するハンドラであるhardIRQ81、およびソフトウェア割込の処理機能部であるnetif_rx82が配置される。
【0035】
<Networking layer>
Networking layerには、netif_rx82の処理要求の発生によって呼び出され要求された処理(ソフトウェア割込)を実行するハンドラであるsoftIRQ83、ソフトウェア割込(softIRQ)の実体を行う制御機能部であるdo_softirq84が配置される。また、ソフトウェア割込(softIRQ)を受けて実行するパケット処理機能部であるnet_rx_action85、NIC11からのハードウェア割込がどのデバイスのものであるかを示すネットデバイス(net_device)の情報を登録するpoll_list86、sk_buff構造体(Kernel71が、パケットがどうなっているかを知覚できるようにするための構造体)を作成するnetif_receive_skb87、Ring Buffer72が配置される。
【0036】
<Protocol layer>
Protocol layerには、パケット処理機能部であるip_rcv88、arp_rcv89等が配置される。
【0037】
上記netif_rx82、do_softirq84、net_rx_action85、netif_receive_skb87、ip_rcv88、およびarp_rcv89は、Kernel71の中でパケット処理のために用いられるプログラムの部品(関数の名称)である。
【0038】
[New API(NAPI)によるRx側パケット処理動作]
図12の矢印(符号)d~oは、Rx側パケット処理の流れを示している。
NIC11のhardware機能部11a(以下、NIC11という)が、対向装置からフレーム内にパケット(またはフレーム)を受信すると、DMA(Direct Memory Access)転送によりCPUを使用せずに、Ring Buffer72へ到着したパケットをコピーする(
図12の符号d参照)。このRing Buffer72は、サーバの中にあるメモリ空間で、Kernel71(
図11参照)が管理している。
【0039】
しかし、NIC11が、Ring Buffer72へ到着したパケットをコピーしただけでは、Kernel71は、そのパケットを認知できない。そこで、NIC11は、パケットが到着すると、ハードウェア割込(hardIRQ)をhardIRQ81に上げ(
図12の符号e参照)、netif_rx82が下記の処理を実行することで、Kernel71は、当該パケットを認知する。なお、
図12の楕円で囲んで示すhardIRQ81は、機能部ではなくハンドラを表記する。
【0040】
netif_rx82は、実際に処理をする機能であり、hardIRQ81(ハンドラ)が立ち上がると(
図12の符号f参照)、poll_list86に、ハードウェア割込(hardIRQ)の中身の情報の1つである、NIC11からのハードウェア割込がどのデバイスのものであるかを示すネットデバイス(net_device)の情報を保存して、キューの刈取り(バッファに溜まっているパケットの中身を参照して、そのパケットの処理を、次に行う処理を考慮してバッファから該当するキューのエントリを削除する)を登録する(
図12の符号g参照)。具体的には、netif_rx82は、Ring Buffer72にパケットが詰め込まれたことを受けて、NIC11のドライバを使って、以後のキューの刈取りをpoll_list86に登録する(
図12の符号g参照)。これにより、poll_list86には、Ring Buffer72にパケットが詰め込まれたことによる、キューの刈取り情報が登録される。
【0041】
このように、
図12の<Device driver>において、NIC11は、パケットを受信すると、DMA転送によりRing Buffer72へ到着したパケットをコピーする。また、NIC11は、hardIRQ81(ハンドラ)を上げ、netif_rx82は、poll_list86にnet_deviceを登録し、ソフトウェア割込(softIRQ)をスケジューリングする。
ここまでで、
図12の<Device driver>におけるハードウェア割込の処理は停止する。
【0042】
その後、netif_rx82は、poll_list86に積まれているキューに入っている情報(具体的にはポインタ)を用いて、Ring Buffer72に格納されているデータを刈取ることを、ソフトウェア割込(softIRQ)でsoftIRQ83(ハンドラ)に上げ(
図12の符号h参照)、ソフトウェア割込の制御機能部であるdo_softirq84に通知する(
図12の符号i参照)。
【0043】
do_softirq84は、ソフトウェア割込制御機能部であり、ソフトウェア割込の各機能を定義(パケット処理は各種あり、割込処理はそのうちの一つ。割込処理を定義する)している。do_softirq84fは、この定義をもとに、実際にソフトウェア割込処理を行うnet_rx_action85に、今回の(該当の)ソフトウェア割込の依頼を通知する(
図12の符号j参照)。
【0044】
net_rx_action85は、softIRQの順番がまわってくると、poll_list86に登録されたnet_deviceをもとに(
図12の符号k参照)、Ring Buffer72からパケットを刈取るためのポーリングルーチンを呼び出し、パケットを刈取る(
図12の符号l参照)。このとき、net_rx_action85は、poll_list86が空になるまで刈取りを続ける。
その後、net_rx_action85は、netif_receive_skb87に通達をする(
図12の符号m参照)。
【0045】
netif_receive_skb87は、sk_buff構造体を作り、パケットの内容を解析し、タイプ毎に後段のプロトコル処理部74(
図11参照)へ処理をまわす。すなわち、netif_receive_skb87は、パケットの中身を解析し、パケットの中身に応じて処理をする場合には、<Protocol layer>のip_rcv88に処理を回し(
図12の符号n)、また、例えばL2であればarp_rcv89に処理をまわす(
図12の符号o)。
【0046】
非特許文献3には、サーバ内ネットワーク遅延制御装置(KBP:Kernel Busy Poll)が記載されている。KBPは、kernel内でpollingモデルによりパケット到着を常時監視する。これにより、softIRQを抑止し、低遅延なパケット処理を実現する。
【先行技術文献】
【非特許文献】
【0047】
【非特許文献1】“Developer Quick Start Guide Learn How To Get Involved With DPDK,” Intel, [online],[令和3年3月5日検索],インターネット 〈 URL : https://www.dpdk.org/〉
【非特許文献2】New API(NAPI), [online],[令和3年3月5日検索],インターネット 〈 URL : http:// http://lwn.net/2002/0321/a/napi-howto.php3〉
【非特許文献3】Kei Fujimoto, Kenichi Matsui, Masayuki Akutsu, “KBP: Kernel Enhancements for Low-Latency Networking without Application Customization in Virtual Server”, IEEE CCNC 2021.
【発明の概要】
【発明が解決しようとする課題】
【0048】
しかしながら、割込モデルとポーリングモデルによるパケット転送のいずれについても下記課題がある。
割込モデルは、HWからイベント(ハードウェア割込)を受けたkernelがパケット加工を行うためのソフトウェア割込処理によってパケット転送を行う。このため、割込モデルは、割込(ソフトウェア割込)処理によりパケット転送を行うので、他の割込との競合や、割込先CPUがより優先度の高いプロセスに使用されていると待ち合わせが発生し、パケット転送の遅延が大きくなるといった課題がある。この場合、割込処理が混雑すると、更に待ち合わせ遅延は大きくなる。
例えば、
図9に示すように、割込モデルによるパケット転送は、割込処理(
図9の符号a,b参照)によりパケットの転送を行うため、割込処理の待ち合わせが発生し、パケット転送の遅延が大きくなる。
【0049】
割込モデルにおいて、遅延が発生するメカニズムについて補足する。
一般的なkernelは、パケット転送処理はハードウェア割込処理の後、ソフトウェア割込処理にて伝達される。
パケット転送処理のソフトウェア割込が発生した際に、下記条件(1)~(3)においては、前記ソフトウェア割込処理を即時に実行することができない。このため、ksoftirqd(CPU毎のカーネルスレッドであり、ソフトウェア割込の負荷が高くなったときに実行される)等のスケジューラにより調停され、割込処理がスケジューリングされることにより、msオーダの待ち合わせが発生する。
(1)他のハードウェア割込処理と競合した場合
(2)他のソフトウェア割込処理と競合した場合
(3)優先度の高い他プロセスやkernel thread(migration thread等)、割込先CPUが使用されている場合
上記条件では、前記ソフトウェア割込処理を即時に実行することができない。
【0050】
また、New API(NAPI)によるパケット処理についても同様に、
図12の破線囲みpに示すように、割込処理(softIRQ)の競合に起因し、msオーダのNW遅延が発生する。
【0051】
一方、ポーリングモデルは、CPUを占有して通信キューをポーリングし、パケット到着時に即時刈取る。ポーリングモデルは、転送遅延を小さくすることが可能であるものの、APLにポーリング機能を具備させる必要が生じるので、APLに改変が必要である。
例えば、
図10に示すように、ポーリングモデルによるパケット転送は、パケット処理APL1にGuest OS50区間においてポーリングを行う機能部であるdpdk(PMD)72を具備させる必要があり、パケット処理APL1の改変が必要となる。
【0052】
また、非特許文献3に記載のKBPは、kernel内でpollingモデルによりパケット到着を常時監視することで、softIRQを抑止し、低遅延なパケット処理を実現することができる。
しかし、パケット到着を常時監視するkernel threadがCPUコアを専有し、常にCPUタイムを使用するため、消費電力が高くなる課題がある。
図13および
図14を参照して、ワークロードとCPU使用率の関係について説明する。
【0053】
図13は、映像(30FPS)のデータ転送例である。
図13に示すワークロードは、転送レート350Mbpsで、30msごとに間欠的にデータ転送を行っている。
【0054】
図14は、非特許文献3に記載のKBPにおける、busy poll threadが使用するCPU使用率を示す図である。
図14に示すように、KBPでは、kernel threadはbusy pollを行うために、CPUコアを専有する。
図13に示す間欠的なパケット受信であっても、KBPでは、パケット到着有無に関わらず常にCPUを使用するため、消費電力が大きくなる課題がある。
【0055】
このような背景を鑑みて本発明がなされたのであり、本発明は、消費電力の低減を図りつつ、APLを改変することなく、サーバ内の遅延を小さくしてパケット転送を行うことを課題とする。
【課題を解決するための手段】
【0056】
前記した課題を解決するため、サーバ内遅延制御装置であって、OSが、カーネルと、前記OSを備えるサーバ中のメモリ空間で、前記カーネルが管理するリングバッファと、インターフェイス部からのハードウェア割込がどのデバイスのものであるかを示すネットデバイスの情報を登録するポールリストと、を有し、前記カーネル内に、ポーリングモデルを用いてパケット到着を監視するスレッドを立ち上げる前記サーバ内遅延制御装置を備えており、前記サーバ内遅延制御装置は、前記ポールリストを監視するパケット到着監視部と、パケットが到着している場合は、前記リングバッファに保持したパケットを参照し、次に行う処理に基づいて該当するキューのエントリを前記リングバッファから削除する刈取りを実行するパケット刈取部と、パケットが所定期間到着しない場合は前記スレッドをスリープさせ、かつ、パケット到着時はハードウェア割込により当該スレッドのスリープ解除を行うスリープ管理部と、を備えることを特徴とするサーバ内遅延制御装置とした。
【発明の効果】
【0057】
本発明によれば、消費電力の低減を図りつつ、APLを改変することなく、サーバ内の遅延を小さくしてパケット転送を行うことができる。
【図面の簡単な説明】
【0058】
【
図1】本発明の実施形態に係るサーバ内遅延制御システムの概略構成図である。
【
図2】本発明の実施形態に係るサーバ内遅延制御システムのNew API(NAPI)によるRx側パケット処理の詳細を説明する図である。
【
図3】本発明の実施形態に係るサーバ内遅延制御システムのpolling thread動作例を示す図である。
【
図4】本発明の実施形態に係るサーバ内遅延制御システムのサーバ内遅延制御装置のRx側動作および省電力化のための管理処理を示すフローチャートである。
【
図5】本発明の実施形態に係るサーバ内遅延制御システムのサーバ内遅延制御装置の省電力化のためのCPU周波数/CPU idle設定処理を示すフローチャートである。
【
図6】本発明の実施形態に係るサーバ内遅延制御システムのサーバ内遅延制御装置の機能を実現するコンピュータの一例を示すハードウェア構成図である。
【
図7】汎用Linux kernelおよびVM構成のサーバ仮想化環境における、割込モデルに、サーバ内遅延制御システムを適用した例を示す図である。
【
図8】コンテナ構成のサーバ仮想化環境における、割込モデルに、サーバ内遅延制御システムを適用した例を示す図である。
【
図9】汎用Linux kernelおよびVM構成のサーバ仮想化環境における、割込モデルによるパケット転送を説明する図である。
【
図10】OvS-DPDKの構成における、ポーリングモデルによるパケット転送を説明する図である。
【
図11】Linux kernel 2.5/2.6より実装されているNew API(NAPI)によるRx側パケット処理の概略図である。
【
図12】
図11の破線で囲んだ箇所におけるNew API(NAPI)によるRx側パケット処理の概要を説明する図である。
【
図13】映像(30FPS)のデータ転送例を示す図である。
【
図14】非特許文献3に記載のKBPにおける、busy poll threadが使用するCPU使用率を示す図である。
【発明を実施するための形態】
【0059】
以下、図面を参照して本発明を実施するための形態(以下、「本実施形態」という)におけるサーバ内遅延制御システム等について説明する。
[概要]
図1は、本発明の実施形態に係るサーバ内遅延制御システムの概略構成図である。本実施形態は、Linux kernel 2.5/2.6より実装されているNew API(NAPI)によるRx側パケット処理に適用した例である。
図11と同一構成部分には、同一符号を付している。
図1に示すように、サーバ内遅延制御システム1000は、OS70(例えば、Host OS)を備えるサーバ上で、ユーザが使用可能なuser space60に配置されたパケット処理APL1を実行し、OS70に接続されたHW10のNIC11とパケット処理APL1との間でパケット転送を行う。
【0060】
OS70は、kernel171、Ring Buffer72、およびDriver73を有し、kernel171は、サーバ内遅延制御装置100およびプロトコル処理部74を有する。
【0061】
本実施形態では、kernel171が、サーバ内遅延制御装置100を備える関係で、
図11に示すkernel71と区別して新たな番号を付している。kernel171は、サーバ内遅延制御装置100が設置されている以外は、
図11に示すkernel71と同一機能である。ただし、kernel171は、livepatch(後記)を用いることで、既存のkernel71(
図11参照)を改造(新しくビルド)することなく、実現が可能である。
【0062】
kernel171は、OS70(例えば、Host OS)の基幹部分の機能であり、ハードウェアの監視やプログラムの実行状態をプロセス単位で管理する。ここでは、kernel171は、パケット処理APL1からの要求に応えるとともに、HW10からの要求をパケット処理APL1に伝える。kernel171は、パケット処理APL1からの要求に対して、システムコールを介することで処理する。
kernel171は、Socket75を介して、パケット処理APL1へパケットを送信する。Kernel71は、Socket75を介してパケット処理APL1からパケットを受信する。
【0063】
Ring Buffer72は、サーバの中にあるメモリ空間においてkernel171が管理する。Ring Buffer72は、kernel171が出力するメッセージをログとして格納する一定サイズのバッファであり、上限サイズを超過すると先頭から上書きされる。
【0064】
Driver73は、kernel171でハードウェアの監視を行うためデバイスドライバである。
【0065】
プロトコル処理部74は、OSI参照モデルが定義するL2/L3/L4のプロトコル処理を行う。
【0066】
Socket75は、kernel171がプロセス間通信を行うためのインターフェイスである。Socket75は、ソケットバッファを有し、データのコピー処理を頻繁に発生させない。
【0067】
<サーバ内遅延制御装置>
サーバ内遅延制御装置100は、パケット到着監視部110と、パケット刈取部120と、sleep管理部130と、CPU周波数/CPU idle設定部140(CPU周波数設定部,CPUアイドル設定部)と、を備える。
【0068】
パケット到着監視部110は、パケットが到着していないかを監視するためのthreadである。パケット到着監視部110は、poll_list186(
図2参照)を監視(polling)する。
【0069】
パケット到着監視部110は、poll_list186からRing_Buffer72(
図2参照)にパケットが存在するポインタ情報と、net_device情報とを取得し、パケット刈取部120へ当該情報(ポインタ情報およびnet_device情報)を伝達する。ここで、poll_list186に複数パケット情報が存在する場合は、複数分当該情報を伝達する。
【0070】
パケット刈取部120は、パケットが到着している場合は、Ring Buffer72に保持したパケットを参照し、次に行う処理に基づいて該当するキューのエントリをRing Buffer72から削除する刈取りを実行する(以下、単にRing Buffer72からパケットを刈取るという場合がある)。パケット刈取部120は、受信した情報をもとにRing_Buffer72からパケットを取り出し、netif_receive_skb87へパケットを伝達する。
【0071】
sleep管理部130は、パケットが所定期間到着しない場合はスレッド(polling thread)をスリープ(sleep)させ、かつ、パケット到着時はこのスレッド(polling thread)のハードウェア割込(hardIRQ)によりスリープ解除を行う(詳細後記)。
【0072】
CPU周波数/CPU idle設定部140は、スリープ中に、スレッド(polling thread)が使用するCPUコアのCPU動作周波数を低く設定する。CPU周波数/CPU idle設定部140は、スリープ中に、このスレッド(polling thread)が使用するCPUコアのCPUアイドル(CPU idle)状態を省電力モードに設定する(詳細後記)。
【0073】
図2は、
図1のサーバ内遅延制御システム1000のNew API(NAPI)によるRx側パケット処理の詳細を説明する図である。
図1および
図12と同一構成部分には、同一符号を付している。
<Device driver>
図2に示すように、Device driverには、ネットワークインターフェースカードであるNIC11、NIC11の処理要求の発生によって呼び出され要求された処理(ハードウェア割込)を実行するハンドラであるhardIRQ81、およびソフトウェア割込の処理機能部であるnetif_rx182が配置される。
【0074】
<Networking layer>
Networking layerには、NIC11からのハードウェア割込がどのデバイスのものであるかを示すネットデバイス(net_device)の情報を登録するpoll_list186、パケット到着監視部110、キューを刈取ったパケットを、割込の発生しないソケット通信のためのsk_buff構造体(kernel171が、パケットの状態を示す構造体)を作成するnetif_receive_skb87、およびRing Buffer72が配置される。
【0075】
<Protocol layer>
Protocol layerには、パケット処理機能部であるip_rcv88、arp_rcv89等が配置される。なお、プロトコル処理は、ip_rcv88、arp_rcv89以外にもある。
【0076】
上記netif_rx182、netif_receive_skb87、ip_rcv88、およびarp_rcv89は、Kernel171の中でパケット処理のために呼ばれるプログラムの部品(関数の名称)である。
【0077】
以下、サーバ内遅延制御システム1000の動作を説明する。
[本発明によるRx側パケット処理動作]
図2の矢印(符号)d~g,k~oは、Rx側パケット処理の流れを示している。
NIC11が、対向装置からフレーム内にパケット(またはフレーム)を受信すると、DMA転送によりCPUを使用せずに、Ring Buffer72へ到着したパケットをコピーする(
図2の符号d参照)。このRing Buffer72は、サーバ中のメモリ空間で、Kernel171(
図1参照)が管理している。
【0078】
NIC11は、パケットが到着すると、ハードウェア割込(hardIRQ)をhardIRQ81(ハンドラ)に立ち上げ(
図2の符号e参照)、netif_rx182が下記の処理を実行することで、Kernel171は、当該パケットを認知する。
【0079】
netif_rx182は、hardwire81(ハンドラ)が立ち上がると(
図2の符号f参照)、poll_list186に、ハードウェア割込(hardIRQ)の中身の情報の1つである、NIC11からのハードウェア割込がどのデバイスのものであるかを示すネットデバイス(net_device)の情報を保存して、キューの刈取り情報を登録する(
図2の符号g参照)。具体的には、netif_rx182は、Ring Buffer72にパケットが詰め込まれたことを受けて、NIC11のドライバを使って、以後のキューの刈取りをpoll_list186に登録する(
図2の符号g参照)。これにより、poll_list186には、Ring Buffer72にパケットが詰め込まれたことによる、キューの刈取りが登録される。
【0080】
netif_rx182は、poll_list186にnet_deviceを登録するが、
図12のnetif_rx82とは異なり、ソフトウェア割込(softIRQ)のスケジューリングは行わない。すなわち、netif_rx182は、ソフトウェア割込(softIRQ)のスケジューリングは行わない点で、
図12のnetif_rx82とは異なる。
【0081】
また、netif_rx182は、sleepしているpolling threadを呼び起こすsleep解除を行う(
図2の符号p参照)。本実施形態は、非特許文献3に記載のKBPに対し、このpolling threadの呼び起こし処理(sleep解除)を追加している。
ここまでで、
図2の<Device driver>におけるハードウェア割込の処理は停止する。
【0082】
本実施形態では、
図12に示す<Networking layer>において、softIRQ83およびdo_softirq84が削除され、これに伴い、
図12に示すnetif_rx82が、softIRQ83(ハンドラ)を立ち上げる通知(
図12の符号h参照)も行わない。
【0083】
本実施形態では、サーバ内遅延制御システム1000は、
図12に示すsoftIRQ83およびdo_softirq84を削除し、代わりに
図2に示す<Networking layer>のサーバの中にあるメモリ空間に、サーバ内遅延制御装置100を設ける。
【0084】
図2に示す<Networking layer>において、サーバ内遅延制御装置100のパケット到着監視部110は、poll_list186を監視(polling)し(
図2の符号k参照)、パケット到着有無を確認する。
【0085】
パケット到着監視部110は、poll_list186から、Ring_Buffer72にパケットが存在するポインタ情報と、net_device情報とを取得し、パケット刈取部120へ当該情報(ポインタ情報およびnet_device情報)を伝達する(
図2の符号q参照)。ここで、poll_list186に複数パケット情報が存在する場合は、複数分当該情報を伝達する。
【0086】
サーバ内遅延制御装置100のパケット刈取部120は、パケットが到着している場合は、Ring Buffer72からパケットを刈取る(
図2の符号l参照)。
パケット刈取部120は、受信した情報をもとにRing_Buffer72からパケットを取り出し、netif_receive_skb87へパケットを伝達する(
図2の符号m参照)。
【0087】
このように、サーバ内遅延制御システム1000は、NW遅延発生の主要因であるパケット処理のsoftIRQを停止し、サーバ内遅延制御装置100のパケット到着監視部110がパケット到着を監視するpolling threadを実行する。そして、パケット刈取部120が、パケット到着時に、pollingモデル(softIRQなし)によりパケット処理を行う。
【0088】
すなわち、サーバ内遅延制御装置100におけるpolling threadは、kernel threadとして動作し、pollingモードでパケット到着を監視する。パケット到着監視部110は、poll_list186を監視する。パケット刈取部120は、パケット到着時にRing Buffer72からパケットを取り出し、netif_receive_skb87へパケットを転送する。
【0089】
パケット到着時は、ハード割込ハンドラでpolling threadを起こすことで、softIRQ競合を回避して、即時にパケット転送処理が可能となる。言い換えれば、kernel threadとしてパケット到着監視機能を待機させておき、ハード割込で起こすことで、NAPI等のソフト割込によるパケット転送処理よりも低遅延化が可能になる。
【0090】
パケット到着を監視するkernel threadは、パケット到着がない間はsleep可能とする。
上記polling threadは、パケット到着有無に応じてsleepし、パケット到着時はhardIRQ81によりsleep解除を行う。具体的には、サーバ内遅延制御装置100のsleep管理部130は、パケット到着有無に応じて、すなわち一定期間パケットの到着がないと、polling threadをsleepさせる。sleep管理部130は、パケット到着時はhardIRQ81によりsleep解除を行う。これにより、softIRQ競合を回避して、低遅延化を実現する。
【0091】
サーバ内遅延制御装置100のCPU周波数/CPU idle設定部140は、パケット到着有無に応じてCPU動作周波数やidle設定を変更する。具体的には、CPU周波数/CPU idle設定部140は、sleep時はCPU周波数を下げ、再度起動時はCPU周波数を高める(CPU動作周波数をもとに戻す)。また、CPU周波数/CPU idle設定部140は、sleep時はCPU idle設定を省電力に変更する。sleep時にCPU動作周波数を低く変更する、また、CPU idle設定を省電力に変更することで省電力化も達成する。
【0092】
netif_receive_skb87は、sk_buff構造体を作り、パケットの内容を解析し、タイプ毎に後段のプロトコル処理部74(
図11参照)へ処理をまわす。すなわち、netif_receive_skb87は、パケットの中身を解析し、パケットの中身に応じて処理をする場合には、<Protocol layer>のip_rcv88に処理を回し、また、例えばL2であればarp_rcv89に処理をまわす。
【0093】
図3は、サーバ内遅延制御装置100のpolling thread動作例を示す図である。縦軸は、polling threadが使用するCPUコアのCPU使用率[%]を示し、横軸は、時間を示す。なお、
図3は、
図13に示す間欠的にパケットが受信される映像(30FPS)のデータ転送例に対応するパケット到着によるpolling thread動作例を示している。
図3に示すように、サーバ内遅延制御装置100のsleep管理部130は、一定期間パケットの到着がない場合(より詳細には、あるパケット到着してから、保守・運用者があらかじめ定めた固定値(一定期間)を経過しても次のパケット到着がない場合)に、polling threadをsleepさせる(
図3の符号s参照)。そして、sleep管理部130は、パケット到着のhardIRQ81でpolling threadを起動させる(
図3の符号t参照)。
なお、sleep 時には、kernelthreadがCPUコアを専有していないため、polling threadが使用する以外にも、システム安定動作のためのタイマの割込みが該当CPUコアに入ったり、エラー処理等のためのmigration threadが該当CPUコアに入ったりすることで、polling threadが使用するCPUコアのCPU使用率が変動する場合がある(
図3の符号u参照)。
【0094】
[live patchによる登録動作]
次に、live patchによる登録動作について説明する。
サーバ内遅延制御システム1000(
図1参照)は、
図1に示すOS70のkernel171が、サーバ内遅延制御装置100を備える。kernel171は、livepatchを用いることで、既存のkernel71(
図11参照)を改造(新しくビルド)することなく、実現が可能になる。以下、kernel171に適用されるlivepatchについて説明する。
【0095】
livepatchは、Linux(登録商標)kernelに適用されるカーネルパッチ機能である。livepatchを使うことで、システムを再起動することなくカーネル空間に即座に修正を適用することができる。すなわち、
(1)livepatchは、netif_rx182(
図2参照)のsoftIRQスケジューリング機能を抑制する。
【0096】
(2)livepatchは、パケット到着監視を行うthread(パケット到着監視部110、具体的にはisol_net_rx)を起動する。起動する際、他プロセスやkernel threadにbusy poll(
図2の符号k参照)の邪魔をされないように、thread(パケット到着監視部110)は、CPUコアを専有する。そのために、当該threadはリアルタイムプロセス等の高優先設定を割り当てる。トラヒックフロー数(または、トラヒック量)に応じて、複数CPUコア上でthreadを起動し、監視するpoll_list186(
図2参照)を割り当てる。これにより、トラヒックフロー(トラヒック量)に応じたスケールアウトが可能になる。
以降、
図2に示すパケット処理の動作が実行される。
【0097】
[サーバ内遅延制御装置100のRx側パケット処理動作フロー]
図4は、サーバ内遅延制御装置100(
図2参照)のRx側動作および省電力化のための管理処理を示すフローチャートである。
図2を参照してRx側動作を説明する。
polling threadが起動している間は、本動作フローをループして実行する。
ステップS1では、サーバ内遅延制御装置100のパケット到着監視部110(
図2参照)は、poll_list186(
図2参照)をCPUを専有して監視(poll)し(
図2の符号k参照)、パケット到着有無を確認する。
【0098】
ステップS2では、パケット到着監視部110(
図2参照)は、poll list186にパケット到着を意味するポインタ情報があるか否かを判別する。
poll list186にパケット到着を意味するポインタ情報がある場合(S2:Yes)、ステップS3に進み、poll list186にパケット到着を意味するポインタ情報がない場合(S2:No)、ステップS1の処理に戻る。
【0099】
ステップS3では、パケット到着監視部110は、poll_list186からRing_Buffer72(
図2参照)にパケットが存在するポインタ情報と、NET_DEVICE情報とを取得し、パケット刈取部120へ当該情報(ポインタ情報およびNET_DEVICE情報)を伝達する(
図2の符号q参照)。ここで、poll_list186に複数パケット情報が存在する場合は、複数分当該情報を伝達する。
【0100】
ステップS4では、サーバ内遅延制御装置100のパケット刈取部120(
図2参照)は、パケットが到着している場合は、Ring Buffer72に保持したパケットを参照し、次に行う処理に基づいて該当するキューのエントリをRing Buffer72から削除する刈取りを実行する(
図2の符号l参照)。
【0101】
ステップS5では、パケット刈取部120は、受信した情報をもとにRing_Buffer72からパケットを取り出し、netif_receive_skb87へパケットを伝達する(
図2の符号m参照)。
【0102】
ステップS6では、サーバ内遅延制御装置100のsleep管理部130は、一定期間を経過してもpoll_list186にパケットの格納がない(パケット到着がない)ことを判別する。
一定期間を経過してもpoll_list186にパケットの格納がない場合(S6:Yes)、ステップS7でsleep管理部130は、polling threadをsleepに落とす(スリープさせる)。poll_list186にパケットの格納がある場合(S6:No)、ステップS1に戻る。
【0103】
ステップS8では、CPU周波数/CPU idle設定部140は、polling threadが使用するCPUコアの動作周波数を低く設定して本フローの処理を終える。CPU周波数/CPU idle設定部140は、CPU idle設定もできる場合は、有効化する。
【0104】
図5は、サーバ内遅延制御装置100の省電力化のためのCPU周波数/CPU idle設定処理を示すフローチャートである。
ステップS11において、パケット到着時に起動されるハード割込処理部(
図2のnetif_rx182)は、パケット到着時にpolling thread(
図2のサーバ内遅延制御装置100)を起動する。既にpolling threadが起動している場合はそのまま継続する。sleep管理部130は、パケット到着時のhardIRQによりsleep解除を行う。
【0105】
ステップS12において、CPU周波数/CPU idle設定部140は、polling threadが使用するCPUコアの動作周波数を高く(CPUコアの動作周波数をもとに戻す)設定して本フローの処理を終了する。ここで、CPU周波数/CPU idle設定部140は、CPU idel設定も変更している場合はもとに戻す。
【0106】
<付加機能>
poll_list186からのパケット刈り取り漏れを防ぐために、polling threadを定期的に起動し、poll_list186のパケット到着有無を確認してもよい。
このようにすることで、NIC11によるパケット到着と、polling threadのsleepが同時に発生する等のタイミング問題があった場合に、poll_list186にパケットが残ることを防止することができる。
【0107】
[本実施形態と既存技術との差異]
次に、本実施形態と既存技術(
図12参照)との差異について説明する。
【0108】
<背景>
一般に、ハードウェア割込(hardIRQ)は、優先度が高く、該当CPUの処理を中断し、hardIRQの処理を最優先で処理する必要がある。このため、オーバーヘッドが大きい。そのため、hardIRQでは、パケット到着を知らせるのみとし、パケット処理は、softIRQで処理する設計思想となっている(「kernelの原則」という)。ここで、softIRQは、他のsoftIRQと競合し、待たされる事象が発生する(遅延発生の要因となる)。
従来技術が割込モデルにしている理由は、かつてはCPUリソースが限られていた(または、Raspberry PiのようなSingle board ComputerのようにCPUコアが少ないデバイスでも動作させる)ために、1つのCPUコアを他の処理と共有して使用する設計思想になっていたためである。この場合、通常の処理や割込処理等でCPUタイムを切り替えながら処理を行う。上記割込処理であっても、softIRQは競合することになり、待ち時間が発生する。
なお、softIRQのスケジューリングを行うスケジューラであるksoftirqdは、softIRQの種別に応じて優先度を付与する機能を具備しておらず、この競合による遅延発生は抑制できない。
【0109】
<既存技術(
図12参照)>
図12に示すように、kernel71(
図11)は、NIC11からのパケット到着の知らせを、hardIRQ81により受け取り(
図12の符号h参照)、パケット処理のためのsoftIRQ83をスケジューリングする(
図12の破線囲みp参照)。この際、他の割込処理と競合すると待合せが発生し、msオーダのNW遅延が発生する。
【0110】
<サーバ内遅延制御システム1000(
図2参照)>
・パケット到着監視部110およびパケット刈取部120の実装
図2に示すように、サーバ内遅延制御システム1000は、<Networking layer>において、netif_rx182は、poll_list186にnet_deviceを登録するが、既存技術(
図12参照)のnetif_rx82とは異なり、ソフトウェア割込(softIRQ)のスケジューリングは行わない(「変更点1」)。
【0111】
図2に示すように、サーバ内遅延制御システム1000は、<Networking layer>のサーバの中にあるメモリ空間に、サーバ内遅延制御装置100を設ける(「変更点2」)。
サーバ内遅延制御装置100のパケット到着監視部110は、poll_list186を常に監視(busy poll)し(
図2の符号k参照)、パケット到着有無を確認する。
【0112】
パケット到着監視部110は、poll_list186からRing_Buffer72にパケットが存在するポインタ情報と、NET_DEVICE情報とを取得し、パケット刈取部120へ当該情報(ポインタ情報およびNET_DEVICE情報)を伝達する(
図2の符号q参照)。
【0113】
サーバ内遅延制御装置100のパケット刈取部120は、パケットが到着している場合は、Ring Buffer72からパケットを刈取る(
図2の符号l参照)。
【0114】
パケット刈取部120は、受信した情報をもとにRing_Buffer72からパケットを取り出し、netif_receive_skb87へパケットを伝達する(
図2の符号m参照)。
【0115】
上記「変更点1」による作用効果は、下記の通りである。
まず、本実施形態では、ハードウェア割込(hardIRQ)によるパケット到着の通知については、NAPIを踏襲する。softIRQは、CPUリソースを有効活用する点では便利であるが、パケットの即時転送の観点では適さない。そのため、本実施形態では、softIRQの機能を停止し、kernelの中でpollingモデルを実現する点が新しい。具体的には、
図2に示すnetif_rx182が、
図12に示すnetif_rx82のように、softIRQ83(ハンドラ)を立ち上げる通知(
図12の符号h参照)を行わないことに示されている。
【0116】
なお、pollingモデルについては、ユーザスペースからpollingを行うDPDKが既存技術としてある(
図10参照)。しかしながら、DPDKは、APLからpollingを行うため、APLに改変が必要である。
【0117】
上記「変更点2」による作用効果は、下記の通りである。
本実施形態は、
図1に示すkernel171の中でpolling専用のthread(サーバ内遅延制御装置100のパケット到着監視部110)を起動し、サーバ内遅延制御装置100のパケット刈取部120が、パケット到着時に、pollingモデル(softIRQなし)によりパケット処理を行う。これにより、APL改変不要になる、換言すれば、既存のPOSIX socket APIを利用することが可能になる。
【0118】
また、前述threadが他のsoftIRQなどにCPUタイムを奪われないようにするために、上記[live patchによる登録]で述べたように、thread起動時にCPUコアを専有し、高優先設定を行うことで、pollingの邪魔をさせない。
【0119】
以上、サーバ内遅延制御装置100は、パケット到着監視部110およびパケット刈取部120を備えることで、低遅延なパケット転送を実現する。すなわち、パケット到着時のソフトウェア割込(softIRQ)を停止し、kernel内でpollingモデルを実現する。パケット到着を監視するkernel threadを新たに作り、poll_list186へのパケット到着を監視する。これにより、パケット到着時は、待合せなく即時に刈り取られるため、低遅延なパケット処理を実現できる。
【0120】
・sleep管理部130およびCPU周波数/CPU idle設定部140の実装
サーバ内遅延制御装置100は、さらに、sleep管理部130およびCPU周波数/CPU idle設定部140を備えることで、上述した低遅延なパケット処理に加え、省電力を図る。すなわち、パケット到着を監視するkernel threadは、パケット到着がない間はsleep可能とする。sleep中のthreadは、パケット到着時のhardIRQハンドラで起こすことで、softIRQ競合を回避しながら即時起動する。CPU動作周波数やCPU idle状態を、上記sleepに合わせて調整することで更に低消費電力化を図る。
【0121】
< sleep管理部130およびCPU周波数/CPU idle設定部140の詳細動作(
図2参照)>
図2に示すnetif_rx182は、パケット到着時にpolling threadがsleepしている場合に起動する(
図2の符号p参照)。既にpolling threadが起動している場合は、特に何も動作せずにハードウェア割込ハンドラを終了する。
【0122】
ハードウェア割込ハンドラにより起動されたpolling thread(サーバ内遅延制御装置100)のCPU周波数/CPU idle設定部140は、polling threadが使用するCPUコアのCPU動作周波数を高く(CPUコアの動作周波数をもとに戻す)設定する。
ここで、kernelは、CPUコアの動作周波数をgovernor設定により変更が可能であり、CPU周波数/CPU idle設定部140は、governor設定等を利用して、CPU動作周波数を高く設定することができる。ただし、CPU idle設定は、CPU機種依存するものである。なお、CPUコアがCPU idle設定を有効化している場合は、解除することも可能である。
【0123】
パケット到着監視部110は、poll_list186にパケットのポインタが格納されているかを確認する。ポインタが格納されている場合は、パケット刈取部120へ、該当ポインタ情報とdevice driver情報を伝達する。
【0124】
polling threadが起動している間は、ここまでの動作をループして実行する。また、このループによるパケット到着確認間隔を、パケット到着の頻度に応じて、増減させてもよい。例えば、単一時間T当たりのパケット到着数Nをカウントし、確認頻度をN/T[回/秒]以上に設定する等である。この増減により、CPU使用率をさらに低減することが可能になる。
【0125】
パケット刈取部120は、受信したポインタ情報とdevice driver情報をもとに、Ring Buffer72からパケットを刈り取る。その後、
図2に示すnetif_receive_skb87(パケット構造体管理部)へ該当データを伝達する。
netif_receive_skb87は、受信したデータからパケット処理に必要な構造体(sk_buff構造体等)を作成する。なお、以降は、kernelによるプロトコル処理へつづく。
【0126】
sleep管理部130は、上記poll_list186のパケットのポインタ確認において、poll_list186のパケット到着有無情報をパケット到着監視部110から受け取る。sleep管理部130は、このパケット到着有無情報をもと、一定期間にパケット到着がないと判断した場合は、CPU周波数/CPU idle設定部140へパケット到着が一定期間ない旨を伝達する。
【0127】
CPU周波数/CPU idle設定部140は、パケット到着が一定期間ない場合に、sleep管理部130からの通知を受け、polling threadが使用するCPUコアのCPU動作周波数を低く設定する。この時、CPU周波数/CPU idle設定部140は、CPU idle設定を有効化できる場合は、有効化する(ただしCPU機種依存がある)。
【0128】
sleep管理部130は、CPU周波数/CPU idle設定部140による設定が終了した後に、polling threadをsleep状態に落とす(スリープさせる)。
なお、CPU周波数設定を低くする処理と、このsleep状態に落とす処理は、同時に実行してもよい。また、パケット転送処理が完了していることを確認してからsleepしてもよい。
【0129】
[ハードウェア構成]
本実施形態に係るサーバ内遅延制御装置100は、例えば
図6に示すような構成のコンピュータ900によって実現される。
図6は、サーバ内遅延制御装置100の機能を実現するコンピュータ900の一例を示すハードウェア構成図である。
コンピュータ900は、CPU901、ROM902、RAM903、HDD904、通信インターフェイス(I/F:Interface)906、入出力インターフェイス(I/F)905、およびメディアインターフェイス(I/F)907を有する。
【0130】
CPU901は、ROM902またはHDD904に格納されたプログラムに基づいて動作し、
図1に示すサーバ内遅延制御装置100の各部の制御を行う。ROM902は、コンピュータ900の起動時にCPU901によって実行されるブートプログラムや、コンピュータ900のハードウェアに依存するプログラム等を格納する。
【0131】
CPU901は、入出力I/F905を介して、マウスやキーボード等の入力装置910、および、ディスプレイ等の出力装置911を制御する。CPU901は、入出力I/F905を介して、入力装置910からデータを取得するともに、生成したデータを出力装置911へ出力する。なお、プロセッサとしてCPU901とともに、GPU(Graphics Processing Unit)等を用いてもよい。
【0132】
HDD904は、CPU901により実行されるプログラムおよび当該プログラムによって使用されるデータ等を記憶する。通信I/F906は、通信網(例えば、NW(Network)920)を介して他の装置からデータを受信してCPU901へ出力し、また、CPU901が生成したデータを、通信網を介して他の装置へ送信する。
【0133】
メディアI/F907は、記録媒体912に格納されたプログラムまたはデータを読み取り、RAM903を介してCPU901へ出力する。CPU901は、目的の処理に係るプログラムを、メディアI/F907を介して記録媒体912からRAM903上にロードし、ロードしたプログラムを実行する。記録媒体912は、DVD(Digital Versatile Disc)、PD(Phase change rewritable Disk)等の光学記録媒体、MO(Magneto Optical disk)等の光磁気記録媒体、磁気記録媒体、導体メモリテープ媒体又は半導体メモリ等である。
【0134】
例えば、コンピュータ900が本実施形態に係る一装置として構成されるサーバ内遅延制御装置100として機能する場合、コンピュータ900のCPU901は、RAM903上にロードされたプログラムを実行することによりサーバ内遅延制御装置100の機能を実現する。また、HDD904には、RAM903内のデータが記憶される。CPU901は、目的の処理に係るプログラムを記録媒体912から読み取って実行する。この他、CPU901は、他の装置から通信網(NW920)を介して目的の処理に係るプログラムを読み込んでもよい。
【0135】
[適用例]
サーバ内遅延制御装置100は、Kernel内に、ポーリングモデルを用いてパケット到着を監視するスレッドを立ち上げるサーバ内遅延制御装置であればよく、OSは限定されない。また、サーバ仮想化環境下であることも限定されない。したがって、サーバ内遅延制御システム1000は、
図7および
図8に示す各構成に適用が可能である。
【0136】
<VM構成への適用例>
図7は、汎用Linux kernel(登録商標)およびVM構成のサーバ仮想化環境における、割込モデルに、サーバ内遅延制御システム1000Aを適用した例を示す図である。
図1および
図9と同一構成部分には、同一符号を付している。
図7に示すように、サーバ内遅延制御システム1000Aは、Guest OS70のKernel171内にサーバ内遅延制御装置100が配置され、Host OS90のKernel91内にサーバ内遅延制御装置100が配置される。
【0137】
詳細には、サーバは、仮想マシンおよび仮想マシン外に形成された外部プロセスが動作可能なHost OS90と、仮想マシン内で動作するGuest OS70と、を備える。
HostOS90は、Kernel91と、HostOS90を備えるサーバ中のメモリ空間で、Kernel91が管理するRing Buffer22と、NIC11からのハードウェア割込(hardIRQ)がどのデバイスのものであるかを示すネットデバイスの情報を登録するpoll_list186(
図2)と、kernel threadであるvhost-netモジュール221と、Kernel91により作成される仮想インターフェイスであるtapデバイス222と、仮想スイッチ(br)223と、を有する。
【0138】
Kernel91は、サーバ内遅延制御装置100を備える。
Kernel91は、tapデバイス222を介して、仮想マシン30へパケットを伝達する。
【0139】
一方、GuestOS70は、Kernel171と、GuestOS70を備えるサーバ中のメモリ空間で、Kernel171が管理するRing Buffer52と、NIC11からのハードウェア割込(hardIRQ)がどのデバイスのものであるかを示すネットデバイスの情報を登録するpoll_list186 (
図2)と、Kernel171が、プロセス間通信を行うためのインターフェイスであるSocket75と、を備える。
【0140】
Kernel171は、サーバ内遅延制御装置100と、刈取りが実行されたパケットのプロトコル処理を行うプロトコル処理部74と、を備える。
Kernel171は、プロトコル処理部74を介して、パケット処理APL1へパケットを伝達する。
【0141】
このようにすることにより、VMの仮想サーバ構成のシステムにおいて、HostOS90とGuestOS70とのいずれのOSにおいても、APLを改変することなく、サーバ内の遅延を小さくしてパケット転送を行うことができる。
【0142】
<コンテナ構成への適用例>
図8は、コンテナ構成のサーバ仮想化環境における、割込モデルに、サーバ内遅延制御システム1000Bを適用した例を示す図である。
図1と同一構成部分には、同一符号を付している。
図8に示すように、サーバ内遅延制御システム1000Bは、Guest OS180と、OSをContainer210に代えた、コンテナ構成を備える。Container210は、vNIC(仮想NIC)211を有する。Guest OS180のKernel181内にサーバ内遅延制御装置100が配置される。
【0143】
コンテナなどの仮想サーバ構成のシステムにおいて、APLを改変することなく、サーバ内の遅延を小さくしてパケット転送を行うことができる。
【0144】
<ペアメタル構成(非仮想化構成)への適用例>
本発明は、ペアメタル構成のように非仮想化構成のシステムに適用できる。非仮想化構成のシステムにおいて、APL3を改変することなく、サーバ内の遅延を小さくしてパケット転送を行うことができる。
【0145】
<拡張技術>
本発明は、トラヒックフロー数が増えた場合に、インバウンドのネットワークトラフィックを複数CPUで処理可能なRSS(Receive-Side Scaling)と連携して、パケット到着監視threadに割り当てるCPU数を増やすことで、ネットワーク負荷に対するスケールアウトが可能になる。
【0146】
[効果]
以上説明したように、OS(OS70)が、カーネル(Kernel171)と、OSを備えるサーバ中のメモリ空間で、カーネルが管理するリングバッファ(Ring Buffer72)と、インターフェイス部(NIC11)からのハードウェア割込(hardIRQ)がどのデバイスのものであるかを示すネットデバイスの情報を登録するポールリスト(poll_list186)と、を有し、カーネル内に、ポーリングモデルを用いてパケット到着を監視するスレッド(thread)を立ち上げるサーバ内遅延制御装置100を備えており、サーバ内遅延制御装置100は、ポールリストを監視(polling)するパケット到着監視部110と、パケットが到着している場合は、リングバッファに保持したパケットを参照し、次に行う処理に基づいて該当するキューのエントリをリングバッファから削除する刈取りを実行するパケット刈取部120と、パケットが所定期間到着しない場合はスレッド(polling thread)をスリープ(sleep)させ、かつ、パケット到着時はこのスレッド(polling thread)のハードウェア割込(hardIRQ)によりスリープ解除を行うsleep管理部130と、を備える。
【0147】
このようにすることで、サーバ内遅延制御装置100は、NW遅延発生の主要因であるパケット処理のソフトウェア割込(softIRQ)を停止し、サーバ内遅延制御装置100のパケット到着監視部110がパケット到着を監視するthreadを実行し、パケット刈取部120が、パケット到着時に、pollingモデル(softIRQなし)によりパケット処理を行う。そして、sleep管理部130が、パケットが所定期間到着しない場合はスレッド(polling thread)をスリープ(sleep)させることで、スレッド(polling thread)はパケット未到着時にsleepする。sleep管理部130は、パケット到着時はハードウェア割込(hardIRQ)によりスリープ解除を行う。
これにより、下記(1)~(4)の効果を奏する。
【0148】
(1)遅延発生の原因となるパケット到着時のソフトウェア割込(softIRQ)を停止し、カーネル(Kernel171)内でpollingモデルを実現する。すなわち、サーバ内遅延制御システム1000は、既存技術のNAPIと異なり、NW遅延の主要因となる割込モデルではなく、pollingモデルを実現する。パケット到着時は、待合せなく即時に刈り取られるため、低遅延なパケット処理を実現することができる。
【0149】
(2)サーバ内遅延制御装置100におけるpolling threadは、kernel threadとして動作し、pollingモードでパケット到着を監視している。パケット到着を監視するkernel thread(polling thread)は、パケット到着がない間はsleepする。パケット到着がない場合は、sleepによってCPUを使用しないので、省電力の効果を得ることができる。
【0150】
そして、パケット到着時には、sleep中のpolling threadは、パケット到着時のhardIRQハンドラで起こされる(sleep解除される)。hardIRQハンドラでsleep解除されることで、softIRQ競合を回避しながら、polling threadを即時起動させることができる。ここで、sleep解除は、タイマを持っていてこのタイマにより起こすものではなく、hardIRQハンドラで起こす点に特徴がある。なお、あらかじめトラヒックロードが分かっている場合、例えば
図13に示すワークロード転送レートのように30mssleepが分かっている場合は、このタイミング合わせてhardIRQハンドラで起こすようにしてもよい。
【0151】
このように、サーバ内遅延制御装置100は、パケット転送処理を行うpolling threadのsleep管理を行うことで、低遅延と省電力を両立させることができる。
【0152】
(3)APLにパケット高速転送のための機能を具備させる必要がなく、APLはカーネル(Kernel171)が持つ既存POSIX socket APIとのインタワークを行うだけでよい。すなわち、サーバ内遅延制御システム1000は、既存技術のDPDKと異なり、kernel内でpollingモデルを実現するため、APLに改変が不要である。具体的には、
図10に示すように、パケット高速転送のための機能(
図10のdpdk(PMD)2参照)を、パケット処理APL1A(
図10参照)具備させる必要がなく、本サーバ内遅延制御システム1000のパケット処理APL1(
図1参照)は、kernelが持つ既存POSIX socket APIとのインタワークを行うだけでよい(kernelのプロトコルスタックに手を加えない)。このため、APLを改変することなく、実現が可能である。
【0153】
(4)同様の理由で、独自のkernelを作る必要がなく、実現が可能である。
【0154】
また、仮想マシン内で動作するGuest OS(GuestOS70)が、カーネル(Kernel171)と、Guest OSを備えるサーバ中のメモリ空間で、カーネルが管理するリングバッファ(Ring Buffer72)と、インターフェイス部(NIC11)からのハードウェア割込(hardIRQ)がどのデバイスのものであるかを示すネットデバイスの情報を登録するポールリスト(poll_list186)と、刈取りが実行されたパケットのプロトコル処理を行うプロトコル処理部74と、を有し、カーネル内に、ポーリングモデルを用いてパケット到着を監視するスレッド(thread)を立ち上げるサーバ内遅延制御装置100を備えており、サーバ内遅延制御装置100は、ポールリストを監視(polling)するパケット到着監視部110と、パケットが到着している場合は、リングバッファに保持したパケットを参照し、次に行う処理に基づいて該当するキューのエントリをリングバッファから削除する刈取りを実行するパケット刈取部120と、パケットが所定期間到着しない場合はスレッド(polling thread)をスリープ(sleep)させ、かつ、パケット到着時はこのスレッド(polling thread)のハードウェア割込(hardIRQ)によりスリープ解除を行うsleep管理部130と、を備えることを特徴とする。
【0155】
このようにすることにより、VMの仮想サーバ構成のシステムにおいて、Guest OS(GuestOS70)を備えるサーバについて、消費電力の低減を図りつつ、APLを改変することなく、サーバ内の遅延を小さくしてパケット転送を行うことができる。
【0156】
また、仮想マシンおよび仮想マシン外に形成された外部プロセスが動作可能なHost OS(HostOS90)が、カーネル(Kernel91)と、Host OSを備えるサーバ中のメモリ空間で、カーネルが管理するリングバッファ(Ring Buffer22)と、インターフェイス部(NIC11)からのハードウェア割込(hardIRQ)がどのデバイスのものであるかを示すネットデバイスの情報を登録するポールリスト(poll_list186)と、カーネル(Kernel91)により作成される仮想インターフェイスであるtapデバイス222と、を備え、カーネル内に、ポーリングモデルを用いてパケット到着を監視するスレッド(thread)を立ち上げるサーバ内遅延制御装置100を備えており、サーバ内遅延制御装置100は、ポールリストを監視(polling)するパケット到着監視部110と、パケットが到着している場合は、リングバッファ(Ring Buffer72)に保持したパケットを参照し、次に行う処理に基づいて該当するキューのエントリをリングバッファ(Ring Buffer72)から削除する刈取りを実行するパケット刈取部120と、パケットが所定期間到着しない場合はスレッド(polling thread)をスリープ(sleep)させ、かつ、パケット到着時はこのスレッド(polling thread)のハードウェア割込(hardIRQ)によりスリープ解除を行うsleep管理部130と、を備えることを特徴とする。
【0157】
このようにすることにより、VMの仮想サーバ構成のシステムにおいて、カーネル(Kernel171)とHost OS(HostOS90)とを備えるサーバについて、消費電力の低減を図りつつ、APLを改変することなく、サーバ内の遅延を小さくしてパケット転送を行うことができる。
【0158】
サーバ内遅延制御装置100において、スリープ中に、スレッドが使用するCPUコアのCPU動作周波数を低く設定するCPU周波数設定部(CPU周波数/CPU idle設定部140)を備えることを特徴とする。
【0159】
このように、サーバ内遅延制御装置100は、CPU動作周波数をトラヒックに合わせて動的に変動させる、すなわち、スリープによりCPUを使わないのであれば、スリープ中におけるCPU動作周波数を低く設定することで、より省電力の効果を高めることができる。
【0160】
サーバ内遅延制御装置100において、スリープ中に、スレッドが使用するCPUコアのCPUアイドル状態を省電力モードに設定するCPUアイドル設定部(CPU周波数/CPU idle設定部140)を備えることを特徴とする。
【0161】
このようにすることにより、サーバ内遅延制御装置100は、CPU idle状態(動作電圧を変更するなど、CPU機種に応じた省電力機能)をトラヒックに合わせて動的に変動させることで、より省電力の効果を高めることができる。
【0162】
サーバ内遅延制御装置100において、カーネル(Kernel171)は、当該カーネル(Kernel171)を起動させたまま、処理動作を変更可能なパッチ(livepatch)を有することを特徴とする。
【0163】
このようにすることにより、サーバ内遅延制御装置100は、livepatchを用いて、(Kernel171)を起動させたまま、処理動作が変更可能になるので、kernelの改造が不要である。このため、サーバ内遅延制御装置100は、例えばkernelのセキュリティアップデートの度に、開発し直す必要がなく、関連するkernel機能に変更があった場合のみ、処理動作を変更すればよい。
【0164】
なお、上記実施形態において説明した各処理のうち、自動的に行われるものとして説明した処理の全部又は一部を手動的に行うこともでき、あるいは、手動的に行われるものとして説明した処理の全部又は一部を公知の方法で自動的に行うこともできる。この他、上述文書中や図面中に示した処理手順、制御手順、具体的名称、各種のデータやパラメータを含む情報については、特記する場合を除いて任意に変更することができる。
また、図示した各装置の各構成要素は機能概念的なものであり、必ずしも物理的に図示の如く構成されていることを要しない。すなわち、各装置の分散・統合の具体的形態は図示のものに限られず、その全部又は一部を、各種の負荷や使用状況などに応じて、任意の単位で機能的又は物理的に分散・統合して構成することができる。
【0165】
また、上記の各構成、機能、処理部、処理手段等は、それらの一部又は全部を、例えば集積回路で設計する等によりハードウェアで実現してもよい。また、上記の各構成、機能等は、プロセッサがそれぞれの機能を実現するプログラムを解釈し、実行するためのソフトウェアで実現してもよい。各機能を実現するプログラム、テーブル、ファイル等の情報は、メモリや、ハードディスク、SSD(Solid State Drive)等の記録装置、または、IC(Integrated Circuit)カード、SD(Secure Digital)カード、光ディスク等の記録媒体に保持することができる。
【符号の説明】
【0166】
1 パケット処理APL(アプリケーション)
10 HW
11 NIC(物理NIC)(インターフェイス部)
70 OS
74 プロトコル処理部
60 user space(ユーザスペース)
72 Ring Buffer(リングバッファ)
90 Host OS(OS)
91,171,181 Kernel(カーネル)
100 サーバ内遅延制御装置(polling thread)
110 パケット到着監視部
120 パケット刈取部
130 sleep管理部
140 CPU周波数/CPU idle設定部(CPU周波数設定部,CPUアイドル設定部)
180 Guest OS(OS)
186 poll_list(ポールリスト)
210 Container
1000,1000A,1000B サーバ内遅延制御システム
【手続補正書】
【提出日】2024-11-07
【手続補正1】
【補正対象書類名】特許請求の範囲
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【特許請求の範囲】
【請求項1】
カーネル内にてポーリングを含むパケット処理を行うサーバであって、
前記サーバは、
パケットの到着を監視するパケット到着監視部と、
スレッドをスリープさせるスリープ管理部と、を備え、
前記スリープ管理部は、パケットが所定期間到着しない場合に、前記スレッドをスリープさせること
を特徴とするサーバ。
【請求項2】
前記スリープ中に、前記スレッドが使用するCPUコアのCPU動作周波数を低く設定するCPU周波数設定部を備える
ことを特徴とする請求項1に記載のサーバ。
【請求項3】
前記スリープ中に、前記スレッドが使用するCPUコアのCPUアイドル状態を省電力モードに設定するCPUアイドル設定部を備える
ことを特徴とする請求項1に記載のサーバ。
【請求項4】
カーネル内にてポーリングを含むパケット処理を行うサーバであって、
前記サーバは、
パケットの到着を監視するパケット到着監視部と、
前記ポーリングにおけるスレッドがスリープ状態である場合において、前記パケット到着監視部がパケットの到着を確認したとき、ハードウェア割込により前記スリープ状態を解除するスリープ管理部と、を備える
ことを特徴とするサーバ。
【請求項5】
前記スリープ状態が解除された場合に、前記スレッドが使用するCPUコアのCPU動作周波数を、前記スリープ状態でのCPU動作周波数よりも高く設定するCPU周波数設定部を備える
ことを特徴とする請求項4に記載のサーバ。
【請求項6】
前記スリープ状態が解除された場合に、前記スレッドが使用するCPUコアのCPUアイドル状態として設定された省電力モードを解除するCPUアイドル設定部を備える
ことを特徴とする請求項4に記載のサーバ。
【請求項7】
コンピュータを、請求項1乃至請求項6のいずれか一項に記載のサーバとして機能させるためのプログラム。
【手続補正3】
【補正対象書類名】明細書
【補正対象項目名】0001
【補正方法】変更
【補正の内容】
【0001】
本発明は、サーバおよびプログラムに関する。
【手続補正4】
【補正対象書類名】明細書
【補正対象項目名】0056
【補正方法】変更
【補正の内容】
【0056】
前記した課題を解決するため、カーネル内にてポーリングを含むパケット処理を行うサーバであって、前記サーバは、パケットの到着を監視するパケット到着監視部と、スレッドをスリープさせるスリープ管理部と、を備え、前記スリープ管理部は、パケットが所定期間到着しない場合に、前記スレッドをスリープさせることを特徴とするサーバとした。