仮想化環境ではNIC(network interface card)などを含めたハードウエアの機能をソフトウエアで実現するため,可用性を高めやすくなるなどのメリットがある。その一方で,ソフトウエア処理そのものは増え,膨大なトラフィックをさばくサーバーでは,そのオーバーヘッドを無視できなくなる。
宮下 徹/奈良 昌紀
ネットワンシステムズ応用技術本部 第5応用技術部
DCエンジニアリングチーム
仮想化技術を使ったシステムの処理性能を考えるとき,大抵は1台のサーバー・ハードウエアで何台分の仮想マシンを動かすか,あるいは各仮想マシンにどの程度のメモリー容量を割り当てるかといった点を気にするだろう。
ただ,それだけでは十分とは言えない。仮想化環境では,ネットワーク関連の処理の一部もサーバー上でソフトウエア的に実現されるため,従来のサーバーに比べて,オーバーヘッドとなる処理が多くなる。
そこで,ネットワーク性能を高めるための,仮想化環境特有の工夫が求められるようになる。今回は,仮想化環境でネットワークの応答性能を高めるためのアプローチを紹介しよう。
アプローチは大別して3通り
仮想化環境でネットワークの性能を高めるためのアプローチは,オーバーヘッドの発生場所により3通り考えられる。(1)アプリケーション処理,(2)ハイパーバイザでのTCP/IP処理,(3)仮想化レイヤーの処理である(図1)。
(1)は複数サーバーへの負荷分散やSSL(secure sockets layer)の暗号化/復号処理オフロードなど,物理環境と同じアプローチである。ロードバランサなどのネットワーク・アプライアンス(最近はアプリケーション・デリバリ・コントローラと呼ばれることが増えている)を使うことで,仮想化環境のサーバー負荷を軽減し,ネットワークの応答性能を高める方法だ(図2)。仮想マシン自体の処理を物理ホストの外にオフロードすれば,ホストの負荷を下げられる。物理環境でも仮想化環境でも適用できる点もメリットである。
サーバーの負荷を抑える例の一つは,TCPコネクションの集約である。外部からサーバーへの接続をアプリケーション・デリバリ・コントローラで受け付け,いったんTCPコネクションを終端,コントローラからサーバーに別のコネクションを確立する仕組みだ。こうすると,サーバー側のコネクションを複数のユーザーで兼用でき,サーバーで維持するコネクション数を抑えられる。
例えばApacheなどのWebサーバーは,設定によってはユーザーからのリクエストごとにTCPのコネクションを確立してしまう。こうなると,コネクション確立のやり取りにCPU負荷がかかるほか,コネクションの状態を管理するためにメモリー領域を多く消費する。一つひとつのコネクション確立の負荷は決して大きくはないが,数万ユーザーが同時にアクセスしてくるWebサイトなどでは,トータルの負荷は無視できないほど大きくなる。
このような場合にアプリケーション・デリバリ・コントローラのTCPコネクション集約機能とApacheのKeepAliveを有効にすると,サーバー側で保持するTCPコネクションを最小限に抑え,複数のクライアントからの要求をさばけるようになる。