GPUを用いたSSLリバースプロキシの実装について

近年,汎用計算の高速化のためのアクセラレータとして注目されているGPUを,ネットワーク処理に適用する一環として,サーバサイドのSSL処理に注目した論文を読んだので,内容を軽く紹介します.

SSLShader: Cheap SSL acceleration with commodity processors Proceedings of the 8th USENIX conference on Networked systems design and implementation 2011

なお,評価に使われた実装の一部のソースコードが公開されています.

紹介

背景

SSL(Secure Socket Layer)ですがHTTP2.0のたたき台となっているSPDYなどではSSL(正確にはTLS)の使用が前提となっており,今後サーバサイドでのSSL対応の要求は高まってくると思います.
SSLの暗号処理部分はCPUバウンドな処理なので,CPU負荷の分散のために,高速なハードウェアアクセラレータを用いたり,複数の低速なソフトウェアアクセラレータを用意して,それらに対してロードバランサにより処理を並列分散したりします.

動機

しかし,ハードウェアアクセラレータの問題として価格コストが高い,新暗号アルゴリズムの対応など柔軟性に欠ける,ロジックがハードウェアで実装されているので,障害原因を突き止めにくい,ということがあります. さらに,ソフトウェアアクセラレータを複数台並べるには,これも複数台分のコストがかかりますし,システム構成も複雑になるので運用しづらいという問題があります.

提案手法

これらの問題点を解決するのが,論文の主題となっているSSLShaderです. SSLShaderは,暗号化部分を安価なGPUにオフロード機能を備えたSSLリバースプロキシであり,高負荷時に高スループット,低負荷時に低レイテンシとなるように設計されています.

GPUの一般の話は下記スライドが参考になると思います.

高負荷時に高スループット,低負荷時に低レイテンシというのが論文中で何度も繰り返されており,論文の重要なポイントとなっています. これをどのように達成するのかというアイデアをまとめると下記のようになります.

  • 高スループットを達成するためには数百個(最新世代では1000個以上)のGPUコア(単体コアの性能はCPUに劣る)を活用しなければならないため,並列化が重要
  • 各クライアントから発行されるSSLリクエストは独立しているため,各SSLリクエストは並列に処理可能.したがって,GPUに複数のリクエスト分の暗号処理をまとめてつっこむ.
  • 低負荷時(同時接続数が少ない)ときはGPUに渡すタスク量が小さすぎるためCPUのみのほうがスループットが高く,逆に高負荷時にGPUに渡すタスク量が多すぎてスループットがでないということがある.よって,CPU1コアのほうがスループットが高くなるような負荷であれば,CPUに任せる.一方,GPUに渡すタスク量が多過ぎないように,適当なところでGPUに渡すタスク量に上限を設ける.

上記のアイデアを実現するためのシステム構成として以下の図のようなシステムが提案・実装されています.

2013041715593

CPUコア数分のワーカスレッド(実験環境では12個)と,GPUの個数分のGPUインタフェーススレッドを用意します. 各ワーカスレッドは個別にInput queueをもち,GPUインタフェーススレッドはGPU queueをもちます. どちらのキューにもRSEやAESなどの暗号処理タスクが格納されます. ワーカスレッドは基本的に,I/Oイベントを処理(図のPushとPop)し,空いている時に暗号処理(図のProc)を実行します. さらに,キューに含まれるタスク数が多い時はGPU queueにInput queueの内容を移行させます. GPUインタフェーススレッドは,GPU queueを見て最も先頭にあるタスクの暗号アルゴリズムと同じ暗号アルゴリズムのタスクをまとめてGPUにオフロードします. (この辺,異なる暗号アルゴリズムであっても,GPUのリソースが余っていれば同時にGPUに処理させたりしないのか疑問.)

なお,キューに含まれるタスク数の多寡は,静的に設定した閾値により決定されます.値自体はベンチマークテスト時のconfigureで測定した上で設定されるようです.

以上のようなパイプライン処理で,高スループット低レイテンシを達成されています.

評価

SSLShaderの比較対象として,lighttpd with OpenSSLが使われています. クライアント7台からabコマンドを叩いて対象のSSLプロキシに負荷をかけています.

まず,スループットの評価ですが,クライアントからの同時接続数を変化させたときのSSL transactions / s (TPS) を測定したものになっています. RSA 1024bitで,SSLShaderがlighttpdの2〜2.5倍速く,RSA 2048bitで,約4〜6倍速くなっています.

20130417155633

次に,レイテンシ(レスポンスタイム)の評価です. 負荷が高いケースと低いケースで提案手法の効果をCDFで評価しています. 例えば,80%のときはコネクション100本のうちの80本はレイテンシ◯msで返せるということがわかります. 凡例の括弧内は(コネクション数,TPS)となっています.TPSはabコマンドに手を入れて一定のTPSでリクエストを投げられるようになっています.

低負荷時は両方とも,90%程度のコネクションが数ms程度程度で返せています. 高負荷時はSSLShaderのほうがレイテンシは小さくなっています.

20130417155634

以上より,特に高負荷時においてはSSLShaderの優位性が確認されています.

スライド

研究室の輪講用につくったスライドです.細かすぎると感じた内容についてはいつかとばしています. 読み違い・誤解などが含まれている可能性があります. 特にSSLの認証周りはサッパリなので結構適当です.

関連研究

GPUをネットワーク処理に応用するという研究として,ルータのルーティンやIPSecの暗号化処理をGPUで高速化するというものがあります. SSLShaderと同じ研究チームのようです.

PacketShader - GPU-accelerated Software Router

研究室ニートの読みたい論文リスト (TCP and GPU)

研究科や研究室という組織についてはあんまりよく思ってはいないけど,研究自体は嫌いではないので,最近徐々に論文読みたい感じになってきている.

TCPまたはGPU関連で読みたい論文リストのメモ.

TCP

2002

WebサーバにおけるTCP処理をNICにオフロードするための設計と実装と評価.
SMP環境において専用のネットワークプロセッサを用いるアーキテクチャとクラスタ環境において専用のノードを用いるアーキテクチャの両方を評価

2005

前半部分は読んだ.
CUBICは高速ネットワーク環境に適したTCP輻輳制御アルゴリズムであり,BIC-TCPを改良したものである.
CUBICはBICのウィンドウサイズ制御を簡素化し,既存のTCPとの公平性およびRTT(Round Trip Time)公平性を改善している.
Linux2.6.19以降でデフォルトの輻輳制御アルゴリズムとして採用された.[該当コミット] (http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=597811ec167fa01c926a0957a91d9e39baa30e64)

LinuxのTCP/IPスタック処理におけるsocket, TCP/UDP, IP and Ethernetの各レイヤーごとのパフォーマンス解析.
異なるシチュエーションにおけるそれぞれの性能ボトルネックを明らかにする.

TCP Offload Engineを有効にしたChelsio T110 10-Gigabitイーサネットアダプタのパフォーマンス評価.
-- ソケット層のマイクロベンチマークパフォーマンス評価
-- ソケットインタフェース上のMPI層のパフォーマンス評価
-- Apacheサーバを用いたアプリケーションレベルのパフォーマンス評価
10Gbpsのうち7.6Gbpsの性能.
(TCP Offload EngineとはTCPの一部ないし全ての処理のNIC(上記のイーサネットアダプタなど)にオフロードする仕組みのこと)

I/Oバス経由のデータアクセスやキャッシュミス,割り込みのオーバヘッドなどの処理はCPUコアの増加によるネットワークやI/Oバスの帯域幅のスケーラビリティを低下させる.
これらの処理に関わる命令を削減するために,TCP Offload Engineを採用した新しいホスト/NIC間のインタフェースを設計し,プロトタイプを実装した.

2006

Linux2.4および2.6におけるTCP/IPスタックをSMP環境で性能評価.
(SMPはSymmetric Multiprocessingの略で各コアに対称的に処理を割り振る.つまり,普通のマルチコア環境)
1TCPコネクションあたり1プロセッサのアーキテクチャが優位性を示す.
Linux2.4と2.6ではCPUのコストは大差ないが,2.6はカーネルのスケジューリングとロック機構が改良されているので,スケーラビリティに優れている.

NS2におけるTCP輻輳制御アルゴリズムの設計,実装および評価.
輻輳制御アルゴリズムの実装はLinux2.6と似ている.
NS2は有名なネットワークシミュレータでC++で実装されている.
次期バージョンであるNS3はPythonで実装されているらしいけど,ドキュメントが整ってなくて厳しい感じらしい.

これもLinux2.6のTCPスタックのパフォーマンスを数学モデルにより解析.
カーネルのプリエンプションがネットワーキングシステムに相互に悪影響があることに気づいた.
ボトルネックを解決するためのソリューションを提案する.

Red Hat社の中の人の論文.C10K問題 で有名な人でもある.
NICからアプリケーションレベルへデータをコピーするときに一旦カーネルにコピーしてからアプリケーションにコピーする問題のいくつかのソリューションを説明する.

2007

高エネルギー物理学の計算のようなグリッドコンピューティングにおいて,ペタバイトレベルのデータを転送する必要がある.
NICからアプリケーションに渡されるまでのLinuxのパケット受信の特性を解析するための数学モデルを開発.

2008

TCPの受信側に着目したパフォーマンス改善手法の提案.
もともと主要なボトルネックと言われていたデータコピーやチェックサム計算のような"1バイトあたりの処理"コストから,現在のプロセッサにおけるコネクション管理構造体へのメモリアクセスのような"1パケットあたりの処理"コストにボトルネックがシフトしている.
"1パケットあたりの処理"コストを削減するためにACKパケットの送信とパケットの結合をオフロードする.
ハードウェアへのオフロードはせずにソフトウェアのみによるパフォーマンス改善.
ネイティブのLinuxで45-67%の性能向上,Xenで仮想化されたゲストOSとしてのLinuxで86%の性能向上.

不明

多分2002年ぐらい.
本来カーネルで実装されているTCP/IPスタックをアプリケーション側で実装.
ソースコードはGitHubにあった.(https://github.com/jamesbw/tcp-daytona)

GPU

2009

テキスト検索アルゴリズムをGPUで高速化.

2010

ストレージシステムにおけるハッシュの計算をGPUにオフロードする話.
最近のストレージは,データの重複を排除するために,データをブロックに分割し,各ブロックに対してハッシュ値を計算しておき,ハッシュ値を比較することにより,データの重複を検出する.

GPU使えばCPUの100倍の性能でるよとか言ってるけど,CPU実装をちゃんと最適化すれば数倍の差程度でしかないよ,みたいな感じ.
GTX280とCorei7 970との比較.

単一または複数GPU構成のシステムにおけるタスクの負荷分散.
CUDA APIレベルよりももっと抽象的なAPIを用いていいかんじにタスクを分散する.
CUDAのスケジューラの改良的な感じ.

2011

OSのカーネルのいくつかの機能をGPUにより高速化できる.
OSのカーネルの補助的なプロセッサとしてGPUを使用するためのフレームワークを提案し,Linuxにおけるプロトタイプを示す.

2012

RDBMSにおけるクエリをCPUとGPUの両方で実行できるデータベースフレームワークの実装.
GPUメモリでのキャッシュが効くようにメモリマッピングを工夫して,GPUメモリの容量を超えるデータに対しても高速化できることを示す.
マルチコアCPUと比較して4倍から8倍の性能.



TCPとGPUの論文を輪講してると,カーネルという言葉がOSのカーネルなのかGPUプログラムの実行単位のことなのかを他人に説明するのがめんどくさくなってくる.

TCP Performance Re-Visitedを読んだ

2003年の論文.Linux2.4のTCPスタック実装についてのパフォーマンス測定と解析. LinuxのTCP実装に関するちゃんとした測定はまだ誰もやってなくて,我々がちゃんとした測定をする,みたいな感じの一文が5箇所くらいあって,意識高い感じだった.

Abstract

現行のネットワークアダプタとプロセッサにおけるLinux2.4のTCPスタック実装のパフォーマンスについて詳細な測定と解析を行う. 我々は,TCPパフォーマンスにおけるCPUスケーリングとメモリバスの影響について記述する. CPUの速度とメモリの帯域幅が増加するにつれて,TCPのパフォーマンスに関して一般的に受け入れられている見解があてにならなくなってきている. 以前より抱かれていたTCPパフォーマンス信仰の詳細な検査と説明が提供されており,我々はこれらの憶説と経験説が現行の実装にはあてはまらないケースを明らかにする. アーキテクチャの主要な変更が採用されない限り,1GHz/1Gbpsの経験則に頼り続けるのは困難であると我々は結論づけた.

Slide

Reference

  • Annie P. Foong, Thomas R. Huff , Herbert H. Hum , Jaidev P. Patwardhan,Greg J. Regnier, ISPASS '03 Proceedings of the 2003 IEEE International Symposium on Performance Analysis of Systems and Software.

TCP Offload through Connection Handoffを読んだ

最近,TCP Offload Engine周りの論文を読んでる.

Abstract

本論文ではOSとNIC間のコネクションハンドオフ・インタフェースを提案する. このインタフェースを使用することにより,一部のTCPコネクションをホストCPUで処理しつつ,残りのTCPコネクションをNICに対してオフロードできる. オフローディングにより,ホストCPU上におけるパケット処理のために必要な計算資源とメモリバンド幅を削減できる. しかし,フルTCPオフローディングを使用するならば,NICの計算資源およびメモリ資源が有限であるため,パケット処理の量とコネクションの個数が制限される. ハンドオフを使用することにより,OSはNICをオーバーロードすることなくNICを最適化するために,オフロードするコネクション数を制限する. ハンドオフはアプリケーションに対して透明であり,OSはNICにコネクションをオフロードするかまたはそれらをNICから取り戻すかどうかをいつでも選択できる. 修正版FreeBSDベースのプロトタイプによると,ハンドオフがホストCPUの命令数とキャッシュミスを削減することがわかった. 結果として,パケット処理に消費されるCPUサイクル数が16%(84%まで)削減した. シミュレーションの結果,短命なコネクションにもかかわらず,ハンドオフがWebサーバのスループトットを15%削減した.

Slide

Reference

  • Hyong-youb Kim and Scott Rixner Rice University, "TCP Offload through Connection Handoff", In Proceedings of EuroSys 2006.

PacketShader: A GPU-Accelerated Software Routerを読んだ

論文のPDFはPacketShader: A GPU-Accelerated Software Router

ホームページは PacketShader - GPU-accelerated Software Router


ソフトウェアルータの処理をGPUにやらせるという話.
IPv4とかIPv6のルーティング,IPSecやOpenFlowの暗号化処理などをGPUで高速化したらしい.
さらに,LinuxカーネルのTCPスタック処理において,パケットが到着する度に毎回バッファを確保したりして効率が悪いので.その辺を解決した独自のパケットI/O Engineを実装しててすごい.
GPUにはあまり向いていないとされている分野に対して,なんとかして高速化したよというのがこの研究の貢献な感じがする.

詳しくは以下.

CUDA5とかKepler2とかを見る限り,NVIDIAのGPUはどんどん汎用化していく感じなので,今まで「それ、GPUにやらせるの?」みたいな分野にGPUを使っていくのが使っていくのが今後流行るのかもしれない.