ページの先頭です


ページ内移動用のリンクです

  1. ホーム
  2. IIJの技術
  3. セキュリティ・技術レポート
  4. Internet Infrastructure Review(IIR)
  5. Vol.25
  6. 3.クラウドコンピューティングテクノロジー

Internet Infrastructure Review(IIR)Vol.25
2014年11月25日発行
RSS

目次

3.5 ソフトウェアスイッチのボトルネック

3.5.1 受信割り込み、送信完了割り込み処理

CPUが様々な処理を実行している最中に、ネットワークインタフェースカード(NIC)がパケットの受信を検知すると、NICはパケットのバイト列をバッファメモリに格納した上で、CPUに対して割り込みを発行します。CPUはNICからの割り込みを検知すると、処理中の状況(コンテキスト)を一時的に退避して、割り込み処理に移ります。割り込み処理では、バッファメモリに格納されたパケットの情報を取り込み、ネットワークスタックの受信キューに詰めるなど最低限の処理が実行され、処理が完了すると退避していたコンテキストを復帰させ、割り込みがかかる前の処理を続行します。このコンテキストの切り替わりのことをコンテキストスイッチと呼ぶのですが、高速なパケット転送をする上ではこれが大きな負荷となります。1パケットずつ割り込みを発生させていたのでは性能に著しい影響があるため、NICの機能としてある程度まとまったタイミングで割り込みを発生させるといった負荷を軽減する工夫があります。

3.5.2 パケットのメモリコピー

また、受信したパケットはまずOSのカーネル空間で管理されるメモリに記録されますが、通常これを直接ユーザスペースのプログラムから読み書きすることはできません。システムコールread(2)あるいはrecv(2)は、ユーザプログラム側であらかじめ確保したメモリ空間に、受信したパケットの内容をコピーします。逆に、システムコールwrite(2)あるいはsend(2)は、ユーザプログラムが用意した内容をカーネル内のメモリ空間にコピーします。10GbEワイヤーレートであれば1秒間に14.88Mフレームを送受信することになりますので、64バイトのパケットであれば秒間14.88M×64×2=1.9GBのメモリコピーが発生することになります。DDR3-1600のメモリ転送速度の理論値は12.8GB/秒ですので、単純に当てはめたとしてもメモリコピーだけで全体時間の約15%を消費することになります。

3.5.3 OSによるプロセススケジューリング

OSのユーザスペースで動作しているプロセスは複数ありますが、psコマンドなどで見れば分かるとおりマルチコア全盛の現在においても搭載されているCPUのコア数で賄える数にとどまることはありません。そのため、OSは適宜動作させるプロセスを切り替えて、見た目上同時に動いているように見せています。ミリ秒単位で切り替わっていくため通常人間が触っている限りでは気付かないほど高速ではあるのですが、ソフトウェアスイッチの動作中にこのようなOSによるプロセススケジューリングが発生すれば、当然ながら性能に大きく影響します。

3.5.4 メモリブロックの確保と解放、ページフォルト

読み書きをする際に使用するメモリブロックについては、受信のたびに確保し、送信完了のたびに解放するのは効率的ではなく、すぐにまた次のパケットを受信するということを考えると領域を再利用することにより性能の低下を軽減できます。しかし、ユーザスペースにあるメモリはすべてが実際のメモリ上に置かれているとは限りません。OSは必要に応じてユーザスペースのメモリと実際のメモリをマッピングします。必要に応じてというのは、プログラムがそのメモリにアクセスしようとした瞬間です。この仕組みをオンデマンドページングと呼びますが、処理としてはプログラムがメモリにアクセスしようとした瞬間に例外が発生し、例外処理の中でメモリのマッピングを実行し、復帰後プログラムは何事もなかったかのように処理を実行し続けます。この例外をページフォルトと呼びます。ページフォルトが発生してメモリのマッピング処理が実行される場合と、既にメモリがマッピング済みである場合とで、処理時間に大きな差があることは自明です。

3.5.5 リソースへの排他アクセス

OpenFlowではフローテーブルを参照してパケット処理を実行することは説明しましたが、当然ながらパケット処理中にもフローテーブルへのエントリの追加・変更・削除が可能です。しかし、受信したパケットにマッチし今まさに参照しているフローエントリが削除されることがあってはなりません。そのため、パケット処理とフローテーブルへのエントリ追加・変更・削除は互いに排他的に実行できなければなりません。排他アクセスが必要なリソースはフローテーブルのみではなく、例えばLANポートのカウンタ情報などがあります。通常このような用途にはリーダ・ライタロックと呼ばれる仕組みを使うのですが、ロックは比較的重い処理で、1パケットごとにロック・アンロックを繰り返していては転送性能に大きな影響が出ます。

3.クラウドコンピューティングテクノロジー

ページの終わりです

ページの先頭へ戻る