사전 준비 사항
- 솔라리스 네바다 빌드 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 유저 그룹의 프리젠테이션 Group 과 IP 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
에서 보실 수 있습니다.
"오픈솔라리스" 카테고리의 다른 글
- 오픈솔라리스에 썬 웹 스택 설치하기 (댓글 0개 / 트랙백 0개) 2008/10/21
- 오픈솔라리스의 빌드와 설치 (Part 2) (댓글 1개 / 트랙백 0개) 2006/03/23
- VMWare를 이용하여 오픈솔라리스 시작하기 (댓글 1개 / 트랙백 0개) 2006/06/23
- 향상된 리소스 관리 및 존 통합 (댓글 0개 / 트랙백 0개) 2008/06/16
- FAQ: Common Development and Distribution Licens... (댓글 13개 / 트랙백 1개) 2007/08/20
- Indiana 란 무엇이고 어떻게 참여할 수 있나요? (댓글 0개 / 트랙백 0개) 2008/04/17
- 오픈 솔라리스를 위한 무선 네트워킹 (댓글 1개 / 트랙백 0개) 2006/01/23
- 오픈 소프트웨어에 대한 발상의 전환이 필요하다. (댓글 0개 / 트랙백 0개) 2007/12/05
- OpenSolaris 코드 브라우저를 이용하여 코드베이스 탐색하기 (댓글 1개 / 트랙백 1개) 2005/09/23
- Inside OpenSolaris: Introduction to Solaris Dri... (댓글 1개 / 트랙백 0개) 2005/10/23
댓글을 달아 주세요