X

Oracle Solaris, Oarcle ハードウェア製品に関する情報

  • Sun |
    August 20, 2009

CrossbowのVirtual NICとQoS制御を試してみる

以前より前評判の高かった Project Crossbow ですが、OpenSolaris 2009.06
の目玉機能として晴れて標準機能となり、誰でも簡単に使えるようになりま
した。簡単に説明しますと、Project Crossbow とはネットワークの仮想化、
つまり仮想インターフェースの作成やネットワーク帯域分割、優先制御と
いった機能を、可能であれば NICデバイスのハードウェアアシストも利用
しながら高速かつ低負荷に実現するものです。これを使えば、例えばサーバー
仮想化とあわせて、10本の GbE ケーブルを、お互いの帯域に干渉すること
なく1本の 10GbEケーブルに統合するなど、管理性を向上させかつ複雑性を
排除することが可能です。例えば次のようなシチュエーションにも絶大な
効果を発揮するはずです。

  1. ある金融サービス会社がオンラインで無料情報提供サービスを開始
    した。人気は上々だが、有料会員のサービスがスローダウンし、お客が
    離れていった。。。
  2. ホスティングサービス会社がCPUコア数やメモリ量による価格体系を
    用意したが、どのコースでもネットワーク帯域は使い放題。。。
  3. バックアップデータ転送中のため、重要な処理がネットワークタイム
    アウトしてしまった。。。

Virtual NIC の作成

では早速試してみましょう。必要なものは、OpenSolaris の動作する
PC1台とインターネット接続だけです。まず、まだ PC に OpenSolaris
を入れてない方は今すぐインストールしましょう。OpenSolaris は
Live CD 形式になっているので、とりあえず手持ちのPCで動作確認した
後にボタン一発でインストールできるので、とても手軽です。

Crossbow では図のように、仮想インターフェース (VNIC: Virtual NIC)
を物理インターフェース経由で直接外部ネットワークに接続することも
出来ますし、etherstub という仮想 HUB / Switch を使ってプライベート
な Virtual Network を作ることも可能です。





今回は、後者の構成でプライベート・ヴァーチャル・ネットワークを
作成し、NAT 経由でインターネットと通信できるようにしてみます。

手順としては、まず、Virtual Network の要となる etherstub を作成し、
その上に Virtual NIC (vnic0, 1, 2) を作成します。vnic0 は Private Address 192.168.10.10 で up させます。

# dladm create-etherstub etherstub0   … etherstub を作成
#
# dladm show-link
LINK CLASS MTU STATE OVER
bfe0 phys 1500 down --
etherstub0 etherstub 9000 unknown --
#
# dladm create-vnic -l etherstub0 vnic0 … etherstub0上にvnic0を作成
# dladm create-vnic -l etherstub0 vnic1 … etherstub0上にvnic1,2を作成
# dladm create-vnic -l etherstub0 vnic2
#
# dladm show-link
LINK CLASS MTU STATE OVER
bfe0 phys 1500 down --
etherstub0 etherstub 9000 unknown --
vnic0 vnic 9000 up etherstub0
vnic1 vnic 9000 up etherstub0
vnic2 vnic 9000 up etherstub0
#
# ifconfig vnic0 plumb ... VNIC の設定&リンクアップ
# ifconfig vnic0 192.168.10.10 up

NAT のセットアップ

vnic1 と vnic2 が、この後作成するコンテナ(zone)に与えられるのですが、
zoneを作る前に、NAT サービスを起動しておきましょう。

# routeadm
Configuration Current Current
Option Configuration System State
---------------------------------------------------------------
IPv4 routing enabled enabled
IPv6 routing disabled disabled
IPv4 forwarding disabled disabled
IPv6 forwarding disabled disabled
Routing services "route:default ripng:default"
Routing daemons:
STATE FMRI
online svc:/network/routing/ndp:default
online svc:/network/routing/route:default
disabled svc:/network/routing/rdisc:default
disabled svc:/network/routing/legacy-routing:ipv4
disabled svc:/network/routing/legacy-routing:ipv6
disabled svc:/network/routing/ripng:default
#
#
# routeadm -u -e ipv4-forwarding … ipv4-fowardingを活性化
# routeadm -u -d ipv4-routing … ipv4-routingを非活性化
#
# routeadm
Configuration Current Current
Option Configuration System State
---------------------------------------------------------------
IPv4 routing disabled disabled
IPv6 routing disabled disabled
IPv4 forwarding enabled enabled
IPv6 forwarding disabled disabled
Routing services "route:default ripng:default"
Routing daemons:
STATE FMRI
online svc:/network/routing/ndp:default
disabled svc:/network/routing/route:default
disabled svc:/network/routing/rdisc:default
disabled svc:/network/routing/legacy-routing:ipv4
disabled svc:/network/routing/legacy-routing:ipv6
disabled svc:/network/routing/ripng:default
#
#
# cd /etc/ipf … ipfilter / ipnat の設定
#
# cat ipnat.conf
map bfe0 192.168.10.0/24 -> 0/32 portmap tcp/udp auto
map bfe0 192.168.10.0/24 -> 0/32
#
#
# svcadm enable network/ipfilter … ipfilterサービスの起動
# svcs network/ipfilter
STATE STIME FMRI
online 12:16:34 svc:/network/ipfilter:default
#
#
# ipnat -l
List of active MAP/Redirect filters:
map bfe0 192.168.10.0/24 -> 0.0.0.0/32 portmap tcp/udp auto
map bfe0 192.168.10.0/24 -> 0.0.0.0/32
List of active sessions:
#

これで 192.168.10.0/24 プライベートネットワークからインターネット
へ出られるようになりました。

Zone と Virtual Network の作成

では zone を作りましょう。VNIC を占有するので ip-type は Exclusive
IP Zone となります。

# zonecfg -z zone1                … zone1を作成 (vnic1をアタッチ)
zone1: No such zone configured
Use 'create' to begin configuring a new zone.
zonecfg:zone1> create
zonecfg:zone1> set zonepath=/export/home/zone1
zonecfg:zone1> set autoboot=true
zonecfg:zone1> set ip-type=exclusive
zonecfg:zone1> add net
zonecfg:zone1:net> set physical=vnic1
zonecfg:zone1:net> end
zonecfg:zone1> verify
zonecfg:zone1> commit
zonecfg:zone1> exit
#
# zoneadm -z zone1 verify ... 作成した zone 構成の検証
WARNING: /export/home/zone1 does not exist, so it could not be verified.
When 'zoneadm install' is run, 'install' will try to create
/export/home/zone1, and 'verify' will be tried again,
but the 'verify' may fail if:
the parent directory of /export/home/zone1 is group- or other-writable
or
/export/home/zone1 overlaps with any other installed zones.
#
#
# zoneadm -z zone1 install ... zone1 のインストール
WARNING: skipping network interface 'vnic1' which is used in the global zone.
A ZFS file system has been created for this zone.
Publisher: Using opensolaris.org (http://pkg.opensolaris.org/release/).
Image: Preparing at /export/home/zone1/root.
Sanity Check: Looking for 'entire' incorporation.
Installing: Core System (output follows)
...
# zoneadm list -iv ... インストールの確認
ID NAME STATUS PATH BRAND IP
0 global running / native shared
- zone1 installed /export/home/zone1 ipkg excl
#
# zoneadm -z zone1 boot
#
# zlogin -C zone1 ... Zone の初期設定
Host name: zone1
IP address: 192.168.10.11
System part of a subnet: Yes
Netmask: 255.255.255.0
Enable IPv6: No
Default Route: Specify one
Router IP Address: 192.168.10.10

vnic1 を持った zone1 が完成しました。global zone の vnic0 とつな
がっているか確認してみましょう。

zone1# ping 192.168.10.10       … global zoneの vnic0と通信できた
192.168.10.10 is alive

次に clone 機能を使ってもう1つの zone を作ります。先に zone1 を shutdown しておいてください。

# zoneadm list -iv  ........ zone1 は停止している
ID NAME STATUS PATH BRAND IP
0 global running / native shared
- zone1 installed /export/home/zone1 ipkg excl
# zonecfg -z zone2 ... zone2 を作成する
zone2: No such zone configured
Use 'create' to begin configuring a new zone.
zonecfg:zone2> create
zonecfg:zone2> set zonepath=/export/home/zone2
zonecfg:zone2> set autoboot=true
zonecfg:zone2> set ip-type=exclusive
zonecfg:zone2> add net
zonecfg:zone2:net> set physical=vnic2
zonecfg:zone2:net> end
zonecfg:zone2> verify
zonecfg:zone2> commit
zonecfg:zone2> exit
# zoneadm -z zone2 clone zone1 ... zone1 を基に clone を実行
sys-unconfig started 2009年07月15日 15時52分03秒
rm: /export/home/zone2/root/etc/vfstab.sys-u: No such file or directory
sys-unconfig completed Wed Jul 15 15:52:04 2009
#
# zoneadm list -iv
ID NAME STATUS PATH BRAND IP
0 global running / native shared
- zone1 installed /export/home/zone1 ipkg excl
- zone2 installed /export/home/zone2 ipkg excl

zone1 と zone2 をそれぞれ起動します。zone2 は初回起動なので、パラ
メータを与えます。

# zoneadm -z zone1 boot
# zoneadm -z zone2 boot ... zone2 を起動
Host name: zone2
IP address: 192.168.10.12
System part of a subnet: Yes
Netmask: 255.255.255.0
Enable IPv6: No
Default Route: Specify one
Router IP Address: 192.168.10.10

これで Virtual Network が完成しました。
ネットワーク構成は次のようになっているはずです。それぞれお互いに
接続可能か ping コマンドなどで試してみましょう。

global zone   vnic0   192.168.10.10
zone1 vnic1 192.168.10.11
zone2 vnic2 192.168.10.12

etherstub に対して snoop コマンドも使えます。

# snoop -d etherstub0


Flow Control (Network QoS) を設定する

Project Crossbow の Flow Control では帯域制御と優先制御が可能ですが、
今回は帯域制御により HTTP コンテンツダウンロードの速度を制限して
みましょう。global zone 上で Apache2 Web Server を立ち上げ、zone1
のクライアントがコンテンツをリクエストします。

まず global zone に Apache2 をインストールします。パッケージ
マネージャを使えば簡単です。

\* Apache2 を global zone へインストールする
- Package Manager GUI を利用し Apache2.2 をインストール
- /etc/apache2/2.2/httpd.conf はデフォルトのまま
# svcadm enable apache22 ... Apache2 を起動
# svcs apache22
STATE STIME FMRI
online 11:15:27 svc:/network/http:apache22

DocumentRoot は /var/apache2/2.2/htdocs なので、ここに大きめのファイルを置くこととします。何でも良いのですが、手元にあった OpenSolaris 2009.06 の ISO イメージを使ってみました。

次に zone1 へログインし wget をインストールします。
パッケージマネージャが外部のサーバへアクセスするので DNS の設定をして置いてください。

zone1# pkg install SUNWwget     … wgetのインストール
DOWNLOAD PKGS FILES XFER (MB)
Completed 1/1 41/41 0.60/0.60
PHASE ACTIONS
Install Phase 132/132
zone1# which wget
/usr/bin/wget

できました。とりあえずダウンロードしてみます。

zone1# wget http://192.168.10.10/osol-0906-x86.iso   ... global zone からデータ取得
--11:33:42-- http://192.168.10.10/osol-0906-x86.iso
=> `osol-0906-x86.iso'
Connecting to 192.168.10.10:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 709,871,616 (677M) [application/octet-stream]
100%[====================================>] 709,871,616 76.01M/s ETA 00:00
11:33:51 (73.18 MB/s) - `osol-0906-x86.iso' saved [709871616/709871616]

73.18 MB/s ほどの転送速度がでています。ちなみにリアルタイムの I/O
statistics を見るには、以下のように dladm コマンドを使います (global
zone で実行してください)。

(global zone)
# dladm show-link -s -i3 vnic0 ... トラフィック監視コマンド
LINK IPACKETS RBYTES IERRORS OPACKETS OBYTES OERRORS
vnic0 127454 7726611 0 182076 1469324223 0
vnic0 0 0 0 0 0 0
vnic0 0 0 0 0 0 0
vnic0 0 0 0 0 0 0
vnic0 8 816 0 16 1248 0
vnic0 5339 289972 0 9863 81142533 0
vnic0 15542 841460 0 29119 239992394 0
vnic0 15484 837928 0 29291 241410706 0
vnic0 9836 532824 0 18448 152009568 0
vnic0 0 0 0 0 0 0
vnic0 0 0 0 0 0 0

では、vnic0 に http port 番号で帯域制限をかけてみましょう。

(global zone)
(vnic0_httpflow の作成)
# flowadm add-flow -l vnic0 -a transport=tcp,local_port=80 vnic0_httpflow
# flowadm show-flow
FLOW LINK IPADDR PROTO PORT DSFLD
vnic0_httpflow vnic0 -- tcp 80 --
(flow に帯域制限を設定)
# flowadm set-flowprop -p maxbw=100 vnic0_httpflow
#
# flowadm show-flowprop
FLOW PROPERTY VALUE DEFAULT POSSIBLE
vnic0_httpflow maxbw 100 -- 100
vnic0_httpflow priority -- --

もう一度 wget でダウンロードしてみます。

(zone1)
zone1# wget http://192.168.10.10/osol-0906-x86.iso
--12:15:53-- http://192.168.10.10/osol-0906-x86.iso
=> `osol-0906-x86.iso.1'
Connecting to 192.168.10.10:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 709,871,616 (677M) [application/octet-stream]
100%[====================================>] 709,871,616 12.41M/s ETA 00:00
12:16:47 (12.47 MB/s) - `osol-0906-x86.iso.1' saved [709871616/709871616]

確かに 12.47 MB/s (100Mbps) に帯域制限されています。

ではもう一度、今度は remote_ip で帯域制限を掛けてみます。
zone1(192.168.10.11) からのパケットを flow として切り出し、この帯域を50Mbpsに制限します。

(global zone)
# flowadm add-flow -l vnic0 -a remote_ip=192.168.10.11 zone1flow
(zone1 の IP-address は 192.168.10.11)
# flowadm show-flow
FLOW LINK IPADDR PROTO PORT DSFLD
zone1flow vnic0 RMT:192.168.10.11/32 -- -- --
# flowadm set-flowprop -p maxbw=50 zone1flow
# flowadm show-flowprop
FLOW PROPERTY VALUE DEFAULT POSSIBLE
zone1flow maxbw 50 -- 50
zone1flow priority -- --

zone1 にて wget を実行します。

zone1# wget http://192.168.10.10/osol-0906-x86.iso
--12:42:32-- http://192.168.10.10/osol-0906-x86.iso
=> `osol-0906-x86.iso.3'
Connecting to 192.168.10.10:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 709,871,616 (677M) [application/octet-stream]
100%[====================================>] 709,871,616 5.96M/s ETA 00:00
12:44:50 (4.92 MB/s) - `osol-0906-x86.iso.3' saved [709871616/709871616]

4.92 MB/s (50Mbps) に帯域制限されています。この時の I/O statistics
は次の通りです。

(global zone でtrafficを確認)
# dladm show-link -s -i3 vnic0
LINK IPACKETS RBYTES IERRORS OPACKETS OBYTES OERRORS
vnic0 315631 18038505 0 541417 4421741359 0
vnic0 0 0 0 0 0 0
vnic0 0 0 0 0 0 0
vnic0 0 0 0 0 0 0
vnic0 0 0 0 0 0 0
vnic0 0 0 0 0 0 0
vnic0 835 47092 0 1625 13252705 0
vnic0 1036 57864 0 2035 16657730 0
vnic0 935 52282 0 1821 14901278 0
vnic0 1012 56712 0 1969 16113494 0
vnic0 1064 59392 0 2075 16995762 0
vnic0 1004 56136 0 1958 16030980 0
vnic0 985 54982 0 1924 15742424 0
vnic0 899 50338 0 1751 14332250 0
vnic0 959 53450 0 1882 15404284 0
....


以上、いかがだったでしょうか?Crossbow / Zone 共に高機能かつ軽量な
最強コンビです。仮想化統合の定番として是非ご活用ください。





Be the first to comment

Comments ( 0 )
Please enter your name.Please provide a valid email address.Please enter a comment.CAPTCHA challenge response provided was incorrect. Please try again.Captcha
Oracle

Integrated Cloud Applications & Platform Services