사전 준비 사항

  • 솔라리스 네바다 빌드 81 혹은 솔라리스 익스프레스 개발자 에디션
  • Nemo-호환 네트워크 카드(bge, e1000g, xge, nxge, …)
  • bfu 와 acr 스크립트
  • 솔라리스 네트워크 가상화 bfu 어카이브

순서


네트워크 디바이스 가상화 하기

하나의 물리 네트워크 카드가 여러개의 가상 카드들로 표현 되고 이것들을 vnics 로 부릅니다.

vnic 는 다른 네트워크 디바이스와 마찬가지로 동작합니다. 이것은 고유의 MAC 주소를 가지고 있고IP 인터페이스가 vnic 위에 올라 감으로써 IPv4 혹은 IPv6 주소가 지정될 수 있습니다.

예제:

  • 시스템의 물리 링크들 보기:
# dladm show-link
bge0            type: non-vlan  mtu: 1500       device: bge0
ath0            type: non-vlan  mtu: 1500       device: ath0
  • bge0 의 가상 NIC 생성하기:
# dladm create-vnic -d bge0 1
# dladm show-vnic
LINK        OVER             SPEED  MACADDRESS         MACADDRTYPE
vnic1       bge0            0 Mbps  2:8:20:22:51:dc    random

VNIC 에는 랜덤한 MAC 주소가 자동으로 지정되었습니다. VNIC 와 그의 MAC 주소는 호스트가 재부팅되도 지속됩니다.

  • 새로운 데이타 링크가 생성 되었습니다:
# dladm show-link
bge0            type: non-vlan  mtu: 1500       device: bge0
ath0            type: non-vlan  mtu: 1500       device: ath0
vnic1           type: non-vlan  mtu: 1500       device: vnic1
  • vnic1 의 IP 인터페이스를 올립니다:
# ifconfig vnic1 plumb
# ifconfig vnic1 dhcp start
# ifconfig vnic1
vnic1: flags=201004843<UP,BROADCAST,RUNNING,MULTICAST,DHCP,IPv4,CoS>
    mtu 1500 index 4
    inet 129.146.109.26 netmask fffffe00 broadcast 129.146.109.255
    ether 2:8:20:22:51:dc

이제 가상 NIC 는 nestat(1M) 같은 모든 고전적인 네트워크 모니터링 툴에서 볼 수 있습니다:

    # netstat -ian
        Name  Mtu  Net/Dest      Address        Ipkts  Ierrs Opkts  Oerrs Collis Queue 
    lo0   8232 127.0.0.0     127.0.0.1      1624   0     1624   0     0      0
    lo0   8232 127.0.0.0     127.0.0.1      0      N/A   1618   N/A   N/A    0
    ath0  1500 10.192.0.0    10.192.11.51   19036  0     3857   0     0      0
    ath0  1500 10.192.0.0    10.192.11.51   17468  N/A   3805   N/A   N/A    0
    vnic1 1500 129.146.108.0 129.146.109.26 371    0     12     0     0      0
    vnic1 1500 129.146.108.0 129.146.109.26 10     N/A   3      N/A   N/A     0


대역폭(bandwidth) 관리

대역폭은 vnic 가 생성됐을때 maxbw 속성 (Mbps 로 표현됨)에 의해 지정된 값에 의해 전체 VNIC 가 제한을 받습니다:

# dladm create-vnic -d bge0 -p maxbw=15 3
# dladm show-vnic
LINK        OVER             SPEED  MACADDRESS         MACADDRTYPE
vnic1       bge0            0 Mbps  2:8:20:22:51:dc    random
vnic3       bge0            0 Mbps  2:8:20:41:c2:71    random
# dladm show-linkprop -p maxbw vnic3
LINK         PROPERTY        VALUE          DEFAULT        POSSIBLE
vnic3        maxbw           15             —             —

대역폭 제한은 또한 물리 NIC 혹은 현존하고 있는 VNIC 등과 같은 현존하는 데이타-링크에도 설정이 가능합니다:

# dladm set-linkprop -p maxbw=300 bge0
# dladm show-linkprop -p maxbw bge0
LINK         PROPERTY        VALUE          DEFAULT        POSSIBLE
bge0         maxbw           300            —             —

좀 더 상세한 제약은 어떠한 데이타 링크 상에서 transport 별로 혹은 protocol 별로 지정될 수 있습니다. 이것을 위해서 우리는 새로운 커맨드인 flowadm(1m) 을 이용해서 플로우(flow) 와 매치 되는 (transport, local_port 등등) 패킷들의 묘사를 정의함으로써 새로운 패킷의 플로우를 생성할 수 있습니다. 플로우에서 사용되는 대역폭 제한은 maxbw 플로우 속성을 사용해서 지정 가능합니다.

# flowadm add-flow -l vnic2 -a transport=tcp tcp_flow
# flowadm set-flowprop -p maxbw=100 tcp_flow
# flowadm show-flow
flow name      flow attributes                         policy attributes
tcp_flow v4:tcp (L) 100 Mbps

들어오고 나가는 TCP 패킷들은 최대 100Mbps 의 처리량(throughput) 을 준수할 것입니다. 다른 트래픽들은 vnic1 이 사용하고 남은 대역폭을 사용할 것입니다.

우리들은 tcp_flow 에 의해 사용되는 패킷의 누적 통계를 글로벌 존에서 kstat 을 실행함으로써 볼 수 있습니다:

    bash-3.00# kstat -n tcp_flow
    module: unix                            instance: 0
name: tcp_flow class: flow crtime 29.903360333 ierrors 0 ipackets 10177 obytes 0 oerrors 0 opackets 0 rbytes 550094 snaptime 17969.794047786

플로우당 대역폭 활용량은 netstat -K 를 실행함으로써 또한 모니터링 되어질 수 있습니다.

우리의 tcp_flow 예제를 통해서 얻은 실시간 결과물로써 vnic1 과 vnic2 를 사용하고 있는 두 존 간의 통계를 netperf 를 이용해서 얻은 것입니다:

    Flow           Link          iKb/s     oKb/s     iPk/s     oPk/s 
    vnic1          bge0      106236.18    534.43   9068.56   1266.79
    vnic2          bge0         534.89 106235.75   1267.78   9067.58
    vnic3          bge0           0.46      0.00      0.98      0.00 
    vnic4          bge0           0.46      0.00      0.98      0.00
    tcp_flow       vnic2        428.95      0.00   1016.77      0.00
    Totals                    13400.12  13346.27  11355.07  10334.38 


IP 인스턴스와 존

배타적인 IP 스택을 가지고 있는 존은 TCP.IP 스택 내에서 사용되는 고유의 글로벌 테이블과 변수들의 인스턴스를 가지고 있습니다. 이것은 존이 다른 존들과 어떠한 네트워크 상태나 정책을 공유하지 않고서도 분리된 LAN 혹은 VLAN 에 연결 될 수 있도록 합니다. 배타적인 IP 인스턴스를 가지고 있는 존은 고유의 IP 라우팅 테이블, ARP 테이블, IPsec 정책 그리고 보안 정책, IP 필터 규칙, TCP/IP ndd 튜닝 값 등을 가지고 있습니다.

배타적인 IP 인스턴스를 가진 존을 생성하기 위해서는 zonecfg(1M) 에서 ip-type=exclusive 을 설정 합니다.

배타적인 존이 그들의 ARP, IP 내부 구조에 대한 제어권을 가지고 있기 때문에 IP 주소는 더이상 글로벌 존의 관리자가 설정해 주어야 할 필요가 없습니다. 단순히 물리 인터페이스를 존에 지정하거나 dladm(1M) 을 이용해서 이전에 만들어줬던 VNIC 를 지정만 하면 됩니다.

다음은 zonecfg 입력의 결과 입니다:

    create -b
    set zonepath=/export/home/Zones/z3
    set autoboot=false
    set ip-type=exclusive
    add inherit-pkg-dir
    set dir=/lib
    end
    add inherit-pkg-dir
    set dir=/platform
    end
    add inherit-pkg-dir
    set dir=/sbin
    end
    add inherit-pkg-dir
    set dir=/usr
    end
    add inherit-pkg-dir
    set dir=/opt
    end
    add inherit-pkg-dir
    set dir=/etc/crypto
    end
    add net
    set physical=vnic3
    end

이것을 파일에 복사 합니다 (예: /var/tmp/zcfg.in).

그다음에 실행 합니다:

# zonecfg -z z3 -f /var/tmp/zcfg.in

(참고: 다음의 출력은 정상 입니다)

z3: No such zone configured Use 'create' to begin configuring a new zone.

zoneadm 은 이제 새로 생성된 존 'z3' 를 configured 상태로 보여 줄 것입니다:

    # zoneadm list  -cv
      ID NAME             STATUS     PATH                           BRAND    IP
0 global running / native shared 1 z1 running /export/home/Zones/z1 native excl
2 z2 running /export/home/Zones/z2 native excl
- z3 configured /export/home/Zones/z3 native excl

참고로'IP' 컬럼 밑에 'excl' 는 존 z3 가 배타적인 IP 인스턴스를 가지고 있음을 의미 합니다.

존을 설치 합니다:

    bash-3.00# zoneadm -z z3 install

참고: CPU 속도에 따라 설치가 10분 정도 걸릴 수 있습니다.

    bash-3.00# zoneadm list -cv
      ID NAME             STATUS     PATH                           BRAND    IP
0 global running / native shared 1 z1 running /export/home/Zones/z1 native excl
2 z2 running /export/home/Zones/z2 native excl
- z3 installed /export/home/Zones/z3 native excl

존을 부팅 합니다:

       bash-3.00# zoneadm -z z3 boot

그리고 존의 콘솔을 zlogin -C z3 를 이용해서 접속하고 네이밍 서비스를 초기화 합니다. 여러분은 일반적인 포스트 설치 과정, 호스트 이름 설정 (존의 이름), 타임존 설정, 존의 루트 패스워드 설정등의 과정들을 진행하게 될 것입니다.

이제 존은 준비 되었습니다. 존의 네트워크를 올려 줍니다:

    z3 console login: root
    Password: 
    Feb 15 10:43:55 z3 login: ROOT LOGIN /dev/console
    Sun Microsystems Inc.   SunOS 5.11      snv_55  October 2007
    #
    # zonename
    z3
    #
    # ifconfig -a plumb
    # ifconfig -a
    lo0: flags=2001000849<UP,LOOPBACK,RUNNING,MULTICAST,IPv4,VIRTUAL> mtu 8232 index 1
            inet 127.0.0.1 netmask ff000000 
    vnic3: flags=201000842<BROADCAST,RUNNING,MULTICAST,IPv4,CoS> mtu 1500 index 2
            inet 0.0.0.0 netmask 0 
            ether 2:8:20:41:c2:71

참고: dladm show-link 는 아직 논 글로벌 존에서 실행되지 않습니다. 그러나 ifconfig -a 는 글로벌 존 관리자에 의해 존에 지정되었었던 모든 비 루프백 인터페이스들을 plumb 시켜 줄 것입니다.

    # ifconfig vnic3 1.1.1.3/24 up
    # ifconfig -a
    lo0: flags=2001000849<UP,LOOPBACK,RUNNING,MULTICAST,IPv4,VIRTUAL> mtu 8232 index 1
            inet 127.0.0.1 netmask ff000000 
    vnic3: flags=201000843<UP,BROADCAST,RUNNING,MULTICAST,IPv4,CoS> mtu 1500 index 2
            inet 1.1.1.3 netmask ffffff00 broadcast 1.1.1.255
            ether 2:8:20:41:c2:71
    # netstat -rn
    Routing Table: IPv4
      Destination           Gateway           Flags  Ref     Use     Interface 

1.1.1.0 1.1.1.3 U 1 1 vnic3
224.0.0.0 127.0.0.1 U 1 0 lo0
127.0.0.1 127.0.0.1 UH 1 36 lo0

존은 이제 네트워크의 다른 호스트들과 통신할 수 있습니다.

    # ping 1.1.1.1
    1.1.1.1 is alive

참고: 단일 존 시스템과 같이 존의 재부팅시에 정적인 혹은 동적인 IP 주소 할당을 위해서 /etc/hostname.vnic3 혹은 /etc/dhcp.vnic3 을 사용할 수 있습니다.

글로벌 존으로 돌아 갑니다:

    bash-3.00# ifconfig -a
    lo0: flags=2001000849<UP,LOOPBACK,RUNNING,MULTICAST,IPv4,VIRTUAL> mtu 8232 index 1
            inet 127.0.0.1 netmask ff000000 
    ath0: flags=201004843<UP,BROADCAST,RUNNING,MULTICAST,DHCP,IPv4,CoS> mtu 1500 index 3
            inet 192.168.1.132 netmask ffffff00 broadcast 192.168.1.255
            ether 0:b:6b:4d:b1:4 
    bash-3.00# 
    bash-3.00# netstat -rn
    Routing Table: IPv4
      Destination           Gateway           Flags  Ref     Use     Interface 

default 192.168.1.1 UG 1 45 ath0
192.168.1.0 192.168.1.132 U 1 4 ath0
224.0.0.0 192.168.1.132 U 1 0 ath0
127.0.0.1 127.0.0.1 UH 2 68 lo0

IP 인터페이스 'vnic3' 은 글로벌 존이나 혹은 다른 존들에 노출 되지 않습니다.

IP 인스턴스에 대한 좀 더 자세한 정보는 OpenSolaris 유저 그룹의 프리젠테이션 GroupIP instances Architecture 에서 확인하실 수 있습니다.


네트워크 가상화와 CPU 자원들

NIC 와 VNIC 들은 시스템의 사용 가능한 프로세서들의 서브셋과 연관되어 있습니다. 이러한 바인딩이 만들어지면 대부분의 패킷 처리는 바운드된 CPU 에서 처리 됩니다.

이 기능은 특히 존과 컨테이너들 간에 좀 더 심화된 CPU 자원분리를 위해 매우 유용 합니다. 이 기능은 존에서의 네트워크 서브시스템에서 CPU 사이클 소비가 익명으로 이루어짐을 보장하게 됩니다.

아래의 예제는 이 기능이 사용되었을때 각기 다른 CPU 사용률을 보여 줍니다.

NIC 는 현재 가상화 컨트롤내에 있지 않은 시스템 정의 CPU 들을 인터럽트 하고 있습니다. 그러나 들어오는 패킷들은 재빠르게 존의 프로세서 셋에 지정된 CPU 로 디스패치 되고 있습니다.

T-10000 멀티 코어 시스템에서 4 개의 CPU 자원풀을 생성하는 방법은 여기에 자세히 나와 있습니다.

work1zone 을 배타적인 IP 스택을 가지도록 설정하고 이것을 vnic1 에 연결 합니다. (이 예제에서 우리는 bge1 의 vnic1 를 사용할 것이고 이것은 CPU 8 을 인터럽트 하도록 지정 되었습니다)

work1-pool 풀을 work1zone 에 지정합니다:

    # zonecfg -z work1zone set pool=work1-pool

work1zone 을 재부팅 해서 이것을 새로운 풀에 바인드 합니다:

    # zlogin work1zone init 6

iperf 를 실행해서 work1zone 컨테이너와 외부 호스트 간의 통신을 모니터링 합니다. 이것은 실제로 프로세서 4-7이 주로 사용되고 있음을 보여줄 것입니다. 셋에 포함되지 않은 대부분의 CPU들은 종종 5% 혹은 그 이하로 사용되고 있습니다. 이것들은 내부 로드로 간주해야 합니다. 이것은 기대했던 대로 입니다. 왜냐하면 어플리케이션(그리고 모든 시스템 콜들) 이 실제로 컨테이너에 의해 소유 되고 있기 때문입니다.

    CPU minf mjf xcal  intr ithr  csw icsw migr smtx  srw syscl  usr sys  wt idl
      0    0   0  106   277  175    0    0    0    2    0     0    0   1   0  99
      1    0   0    0     1    0    0    0    0    0    0     0    0   0   0 100
      2    0   0    0     1    0    0    0    0    0    0     0    0   0   0 100
      3    0   0    0     1    0    0    0    0    0    0     0    0   0   0 100
      4    0   0    0  3765    0 7496    7   76  355    0  4556    2  19   0  79
      5    0   0    0  3590    0 7175    7   77  336    0  4310    2  19   0  80
      6    0   0    0  1504    0 3009    3   15  137    0  1912    1   8   0  92
      7    0   0    0  1108    8 2196    1    6   91    0  1394    1   6   0  94
      8    0   0 7247  7711 7706    9    0    0  860    0     0    0  56   0  44
    …
     22    0   0 9114  6688    0 13659    0    0 1176    0     0    0  64   0  36
     23    0   0    0     3    0    5    0    0    0    0     1    0   0   0 100

CPU # 22 는 64% 의 시스템 사용률을 보여 주었습니다. 이것은 work1zone 을 위한 들어오는 패킷의 처리 비용 입니다. 이 비용은 컨테이너에 지정된 프로세서 셋이 아닌 CPU 에 부과 됩니다.

work1zone 인바운드 트래픽에 의해 유발되는 불공평한 CPU 자원 소비를 최소화 하기 위해서, vnic1 또한 불합리한 work1-pset 의 CPU 들에 "바운드" 되어야 합니다:

글로벌 존에서 아래 명령을 실행 합니다:

    # dladm set-linkprop -p cpus=4,5,6,7 vnic1

두번째 실험에서 iperf 는 다음과 같은 결과를 보여 줍니다:

    CPU minf mjf xcal  intr ithr  csw icsw migr smtx  srw syscl  usr sys  wt idl
      0    0   0  118   270  168    0    0    0    1    0     0    0   0   0 100
      1    0   0    0     1    0    0    0    0    0    0     0    0   0   0 100
      2    0   0    0     1    0    0    0    0    0    0     0    0   0   0 100
      3    0   0    0     1    0    0    0    0    0    0     0    0   0   0 100
      4    0   0 2370  4477    0 9045   30   95  623    0  2799    1  33   0  66
      5    0   0 2702  4630    0 9366   26   88  608    0  2331    1  32   0  67
      6    0   0 2995  4459    0 9017   27   83  737    0  1778    1  34   0  65
      7    0   0    0  3225    5 6491    3   51  167    0  4494    2  20   0  79
      8    0   0 7574  7587 7574   26    0    1 2767    0     5    0  51   0  49
    …
     22    0   0 1243  1088    0 2175    0    0  344    0     4    0   2   0  98
     23    0   0    2     8    0   15    0    0    1    0     0    0   0   0 100

특히 눈여겨 보실 점은: . CPU 4-7 의 idle 시간이 줄어 들었고 sys 타임은 증가 했는데 이것은 work1zone 의 패킷을 다루고 있기 때문 입니다. CPU #22 는 이전 64% 대신에 거의 2% 정도로 활용되고 있습니다.


이 글의 영문 원본은
Getting Started With Crossbow
에서 보실 수 있습니다.

"오픈솔라리스" 카테고리의 다른 글

2008/08/12 09:43 2008/08/12 09:43

TRACKBACK :: http://blog.sdnkorea.com/blog/trackback/640

댓글을 달아 주세요

[로그인][오픈아이디란?]

◀ Prev 1  ... 51 52 53 54 55 56 57 58 59  ... 641  Next ▶