2008/06/13

Solaris의 버추얼 머신 : 버추얼박스(virtualbox)의 성능

썬에서는 얼마전에 독일계의 이노텍(innotek)이란 회사를 인수한 적이 있다. 이노텍이란 회사는 가상머쉰의 일종인 '버추얼박스(virtualbox)'라는 오픈 소스 소프트웨어를 제작 공급하던 업체이다.

썬은 버추얼 박스를 인수한 이후 솔라리스에서도 아주 잘 동작하도록 꽤 수고를 드린 것 같다. 최신 버젼으로 제공된 1.62 버젼은 솔라리스상에서 설치되어서 오픈솔라리스, 솔라리스10(u5+)은 물론 윈도우즈 계열과 리눅스 계열의 게스트 운영체제를 지원할 뿐 아니라 해당 게스트 운영체제들의 성능을 향상시켜주는 게스크 에디션을 제공하면서 게스트로 솔라리스, 윈도우즈,리눅스, FreeBSD, OS/2를 가장 퍼펙트하게 제공하는 최초의 솔라리스용 버추얼 버신이라고 할 수 있겠다.

버추얼 벅스는 Type2 (Hosted VM)기반의 버추얼 머신으로 다른 운영체제위에서 동작하며 호스트 운영체제도 가장 많은 운영체제를 지원한다.(솔라리스, 리눅스, MacOSX, 윈도우즈)

위키에 있는 버추얼 머신 비교를 보면 쉽게 이해가 간다.
이노텍의 버추얼박스는 흥미로운 탄생 역사를 가지고 있는데, 버추얼박스 소스의 초기 코드(오픈소스가 되기 이전)가 마이크로소프사에 라이센스되었는데, 이로 인해서 마이크로소프트의 Virtual PC 2007과 거의 흡사하다고 할 수 있겠다. 유일하게 다르다면 VirtualPC 2007은 호스트운영체제로 윈도우즈만 지원하는 반면 VirtualBox는 주요 데스크탑운영체제 대부분을 지원한다는 것이 다르다면 다르겠다.


버추얼 박스 1.62에서 WindowsXP를 돌리는 모습니다. vbox guest edition을 설치한 이후에 화면 크기의 조절이라던가 마우스 모드의 자동전환, 성능등이 획기적으로 개선되어 있다.



vbox 1.62/Solaris 상에서 PC Wizard 2008을 다운받아서 시스템 정보를 확인하는 스샷이다. 흥미로운 것은 CPU를 부정확하게 잡아내고 있는데 이유는 확실하지 않다. 감지하는 코어의 개수(운영체제 입장에서 CPU)는 한개만 나온다. 이것은 버추얼 박스가 한 CPU만 지원하기 때문에 그런 것으로 보인다. (맨 끝 PC Wizard 결과 화면 참고)

솔라리스에서는

vaio-solaris:~ 499

$kstat cpu_info:1:cpu_info1:brand
module: cpu_info instance: 1
name: cpu_info1 class: misc
brand Intel(r) Core(tm)2 Duo CPU T7500 @ 2.20GHz


로 나오는 반면

버추얼 박스내의 PC Wizard에서는 Core2 Duo E4500@2200Mhz CPU로 감지했다. Core2 Duo면 두개의 코어인데 하나만 나오는 것도 다소 흥미롭다.

그렇다면 성능은 어떨까 ?


정말 흥미로운 성능 결과가 아닐 수 없다. 위 결과화면에서 보이는 두개의 선중 노란선이 버추얼박스의 성능 결과인 반면 파란색 선은 참고용 시스템의 결과이다. 참고용 시스템이라는 것이 보이는 데로, Core2 Duo E6600@2.4Ghz 시스템인데, 이 시스템과 비교해서 프로세서 스피드가 훨씬 뛰어나다.
메모리는 훨씬 성능이 좋다. 메모리 캐쉬는 같은 것으로 나오고. 믿을 만한 데이타인가 ? 살짝 호기심이 발동한다. Core2 Duo T7500의 native 성능 결과를 추후 올리겠다.

비디오는 당연히 느릴 것으로 예상했었고 상당히 느린 것으로 나왔다.
우측 위 태스크 관리자의 부분 이미지가 보인다. CPU가 하나만 보이는 것이 인상적이다. Core2 Duo인데, 반코어만 보인다는 얘기다. 웃긴다.

PC wizard를 수행하게 되면, 버추얼박스는 최대의 부하를 사용하게 되는데, 이와중의 솔라리스 상황을 살펴보았다.


VirtualBox가 거의 하나의 코어를 다 쓰는 것을 볼 수 있다. 49% 정도로 나오는 것은 CPU 두개짜리 박스에서 하나를 다 쓰게 되어서 나타나는 평균값이다. 그 다음에 나오는 프로세스는 Xorg인데, 3D 데스크탑을 쓰면서 버추얼 박스에서 Video Test를 하는 와중에 캡쳐한 것이라 다소 높게 나왔다. 비데오 테스트가 아닌 경우에는 이렇게 높게 나오지는 않았다. Direct3D 테스트는 실패한 것으로 보인다.

버추얼 박스는 흥미롭게 하나의 코어만을 게스트 운영체제에 보여주면서, 자신은 여러개의 스레드를 통하여 시스템의 모든 프로세스를 나름 공평하게 사용하는 것을 볼 수 있다.그렇지만, 전용 스레드 하나가 주로 사용되는 것은 어쩔 수 없다.

솔라리스에서 버추얼박스를 사용하면서 게스트 운영체제에 과부하를 걸게 되면 호스트 운영체제인 솔라리스가 뛰엄 뛰엄 실행되는 모습이 일부 보이는데, 이런 현상을 없애기 위해서 윈도우즈에서는 할 수 없는
프로세서 전용 할당과 같은 자원 분배기능을 할 수가 있다.

Core 2 Duo T7500 은 두개으 코어를 가지고 있는데 하나의 코어에서만 VirtualBox관련 프로세스들이 실행되게 하면, 나머지 프로세스에서 솔라리스가 실행되므로 매우 안정적으로 운영할 수 있다.


이렇게 하기 위해서는 프로세서 셋을 다음과 같이 구성한다.
#psrset -c 1 1
; 1번 프로세서 셋을 구성하면서 해당 셋에 1번 코어를 할당한다. 기본적으로 0번, 1번 두개의 코어가 있다.

vaio-solaris:~ 503
$psrinfo -v
Status of virtual processor 0 as of: 06/12/2008 18:03:09
온라인(06/11/2008 09:05:27 이후).
The i386 processor operates at 2200 MHz,
and has an i387 compatible floating point processor.
Status of virtual processor 1 as of: 06/12/2008 18:03:09
온라인(06/11/2008 09:05:33 이후).
The i386 processor operates at 2200 MHz,
and has an i387 compatible floating point processor.
vaio-solaris:~ 504
$psrinfo
0 온라인 06/11/2008 09:05:27 이후
1 온라인 06/11/2008 09:05:33 이후

다음은 버추얼박스가 실행하고 있는 중의 mpstat 결과이다.
$mpstat 1
CPU minf mjf xcal intr ithr csw icsw migr smtx srw syscl usr sys wt idl
0 16 0 2 466 190 709 79 36 24 0 13563 19 2 0 79
1 13 0 5 249 194 567 73 36 27 0 12633 18 4 0 78
CPU minf mjf xcal intr ithr csw icsw migr smtx srw syscl usr sys wt idl
0 0 0 1 563 210 1388 317 118 163 0 58609 30 18 0 52
1 7 1 0 573 154 1326 354 107 159 0 71542 27 26 0 48
CPU minf mjf xcal intr ithr csw icsw migr smtx srw syscl usr sys wt idl
0 2 0 0 557 200 1530 387 141 71 0 62210 27 17 0 56
1 0 0 14 583 181 1579 365 153 95 0 85893 32 22 0 45
CPU minf mjf xcal intr ithr csw icsw migr smtx srw syscl usr sys wt idl
0 0 0 0 608 206 1969 487 159 28 0 55857 25 15 0 60
1 2 0 0 625 214 1394 305 151 35 0 83667 28 21 0 51
CPU minf mjf xcal intr ithr csw icsw migr smtx srw syscl usr sys wt idl
0 0 4 0 555 214 1378 307 176 74 0 73979 25 18 0 57
1 1 1 0 572 198 1381 313 177 66 0 70269 24 18 0 58
CPU minf mjf xcal intr ithr csw icsw migr smtx srw syscl usr sys wt idl
0 0 13 0 663 303 1376 241 160 59 0 36496 20 14 0 66
1 0 6 8 550 168 1366 357 150 53 0 90470 27 30 0 44

두개의 CPU(core)가 나름 골고루 사용되고 있음을 볼 수 있다.

앞서 만든 processor set을 이용해서 1번 코어에 버추얼 박스를 바인딩 시킨 결과이다.

#psrset -b 1 `pgrep -d" " VirtualBox`
process id 4565: was not bound, now 1
process id 4560: was not bound, now 1


$mpstat 1
CPU minf mjf xcal intr ithr csw icsw migr smtx srw syscl usr sys wt idl
0 16 0 2 466 190 710 80 36 24 0 13761 19 2 0 79
1 13 0 5 250 194 568 73 36 27 0 13141 18 4 0 78
CPU minf mjf xcal intr ithr csw icsw migr smtx srw syscl usr sys wt idl
0 7 0 0 427 204 874 22 0 5 0 2141 4 1 0 95
1 0 0 14 371 108 324 65 0 6 0 165138 35 24 0 40
CPU minf mjf xcal intr ithr csw icsw migr smtx srw syscl usr sys wt idl
0 0 0 0 402 198 800 21 0 0 0 2220 6 2 0 92
1 0 0 0 367 102 321 71 0 0 0 162599 36 25 0 40
CPU minf mjf xcal intr ithr csw icsw migr smtx srw syscl usr sys wt idl
0 0 0 0 425 212 987 131 0 0 0 19995 8 2 0 90
1 0 0 0 370 99 313 74 0 1 0 160760 35 27 0 38
CPU minf mjf xcal intr ithr csw icsw migr smtx srw syscl usr sys wt idl
0 0 0 1 416 200 843 18 0 4 0 1895 4 2 0 94
1 0 0 14 382 112 313 71 0 6 0 167351 36 25 0 38
CPU minf mjf xcal intr ithr csw icsw migr smtx srw syscl usr sys wt idl
0 0 0 0 404 204 770 20 0 0 0 2015 6 3 0 91
1 0 0 0 362 101 318 67 0 0 0 161251 36 24 0 41
CPU minf mjf xcal intr ithr csw icsw migr smtx srw syscl usr sys wt idl
0 0 0 0 409 204 910 20 0 0 0 2333 5 1 0 94
1 0 0 0 379 106 320 76 0 0 0 165813 36 25 0 39



psrset으로 프로세서 관리를 한 이후에는 CPU 하나만 주로 쓰이고 있음을 알 수 있다. 이때에 버추얼 박스에서는 부하가 거의 걸려있지 않은 상태이고 아래 상태는 인터넷 익스플로러 하나에서 네이버 초기 화면을 열었을 때의 현상이다. 1번 코어가 거의 모두 사용되고 있음을 알 수 있다. 네이버는 '플래쉬'로 상당한 부하를 끊임없이 만들어 내고 있기 때문에 위와 같은 결과가 보임을 알 수 있다. 이때 0번 코어도 상당한 사용율 보이는 데 이 이유는 인터넷을 접근할때 발생하는 네트웍 트래픽의 처리를 0번 코아에서만 하기 때문에 접속 초기시 0번 코어를 상당히 사용하는 모습을 보여준다. psrset으로 cpu를 운영체제 기본 풀에서 분리해내면 그 프로세서서는 운영체제가 사용하지 않기 때문이다.


$mpstat 1
CPU minf mjf xcal intr ithr csw icsw migr smtx srw syscl usr sys wt idl
0 16 0 2 466 190 711 80 36 24 0 13753 19 2 0 79
1 13 0 5 251 193 567 73 36 27 0 13322 18 4 0 78
CPU minf mjf xcal intr ithr csw icsw migr smtx srw syscl usr sys wt idl
0 7 0 4 480 238 2132 540 0 153 0 7480 31 9 0 60
1 0 7 5 746 241 1065 497 0 219 0 55495 26 63 0 11
CPU minf mjf xcal intr ithr csw icsw migr smtx srw syscl usr sys wt idl
0 0 0 4 637 310 2125 544 0 196 0 7388 31 10 0 59
1 1 26 8 827 339 1149 529 0 245 0 31525 18 74 0 8
CPU minf mjf xcal intr ithr csw icsw migr smtx srw syscl usr sys wt idl
0 0 0 1 526 248 2628 736 0 382 0 8992 40 13 0 46
1 0 9 14 866 300 1186 576 0 491 0 18527 18 82 0 0
CPU minf mjf xcal intr ithr csw icsw migr smtx srw syscl usr sys wt idl
0 27 24 4 616 329 2632 699 0 261 0 8153 36 13 0 51
1 0 6 0 786 182 1078 522 0 376 0 42941 25 75 0 0
CPU minf mjf xcal intr ithr csw icsw migr smtx srw syscl usr sys wt idl
0 0 0 0 501 234 2258 695 0 390 0 8409 35 12 0 53
1 0 4 0 691 142 1052 497 0 508 0 44347 23 74 0 3
CPU minf mjf xcal intr ithr csw icsw migr smtx srw syscl usr sys wt idl
0 1 1 0 477 226 2151 554 0 287 0 7807 28 9 0 63
1 0 2 14 632 152 955 419 0 424 0 62805 27 63 0 10

2008/06/11

솔라리스10 (Solaris Community Edition)에서 MySQL 사용하기

솔라리스10에는 MySQL이 이미 들어있습니다. 굳이 다운받아서 컴파일하고 할 필요가 없다는 뜻이죠.
솔라리스 10에서는 MySQL을 활성화하기 위해서는 다음과 같이 하면 됩니다.

일단 mysql의 그룹과 사용자를 만듭니다. 이렇게 하기 위해서는 수퍼유저나 혹은 사용자 생성 권한을 가지고 있어야 합니다.

1. 그룹의 생성
#/usr/sbin/groupadd mysql
2. 사용자의 생성
#/usr/sbin/useradd -g mysql -d /var/mysql mysql
;여기서 -d /var/mysql 옵션에 유념해야 합니다. -d 옵션은 사용자 디렉토리를 설정하기 위해서 필요한 옵션인데 mysql man 페이지에는 이 부분이 빠져 있는데, 이 옵션이 빠져 있으면 후에 서비스를 활성화할때(svcadm 이용) 오류가 발생합니다.
3.MySQL 데이타베이스 디렉토리의 소유권한을 설정합니다.
#chown -R mysql:mysql /var/mysql
4.서비스를 구동합니다.
#svcadm enable mysql:version_50
혹은
#svcadm enable mysql
5.구동된 서비스가 정상적으로 작동하는 지 확인합니다.
#svcs -xv mysql
svc:/application/database/mysql:version_50 (MySQL RDBMS)
상태: online(2008년 6월 11일 수요일 오후 05시 48분 06초 이후)
참조: man -M /usr/share/man -s 1 MySQL 5.0.45
참조: http://dev.mysql.com/docs
참조: /var/svc/log/application-database-mysql:version_50.log
영향: 없음
6. mysql 클라이언트로 접속해봅니다.
#mysql -u root
mysql> show databases;

이렇게 해서 성공적으로 솔라리스에서 MySQL을 활성화했습니다. 쉽죠? ^__^

이후에는 MySQL 설정을 해야 합니다.
MySQL root 패스워드도 설정해야 하고, 필요한 데이타 베이스를 생성해야 합니다.
이 부분은 MySQL 관리자 영역이므로 여기서는 언급하지 않습니다.

개발자를 위한 선택 : 솔라리스

예전에 마이크로소프트웨어에 기고했던 글입니다.

:+: 하늘을 닮은 호수 :+: » Open Solaris 1

2008/06/10

솔라리스에서 사용자 패스워드 변경 자동화(expect 이용)

예전에는 CGI를 이용하여 웹 프로그래밍을 할 때에는 사용자 암호를 웹 인터페이스로 받아서 변경해야 하는 경우가 있었습니다.
지금의 웹 인터페이스에서는 JavaScript나 python등 고수준 스크립팅으로 백엔드 인증 서비스와 연결하는 방법을 대부분 사용합니다만 예전에는 /usr/bin/passwd라는 유틸리티를 이용하여 /etc/passwd 화일을 기반으로 패스워드를 변경해야 했습니다.

오늘날에는 필요하지 않을 듯 하고, 실제로 보안상의 이유로 권고되지 않습니다만, 간혹 시스템 마이그레이션이나 자동 업데이트를 배치로 처리하기 위해서 대량의 사용자의 암호를 임의로 변경하기 위해서는 여전히 이러한 스크립트를 통한 passwd 변경이 필요하게 됩니다.

이러한 목적으로 패스워드를 변경하기 위해서 예전에는 쉘스크립트의 표준 입출력을 조정하여 스크립트했습니다만, 솔라리스10에서는 이렇게는 안되는 것 같습니다(방법이 있는 지는 좀더 확인해봐야겠습니다)

어쨌든 오픈솔라리스에는 (솔라리스 Community Edition 03/2008. Opensolaris 05/08과는 다름)에는 expect라는 스탠다드 입출력을 전환하는 유명한 오픈 소스가 들어있습니다. 이 툴을 이용하여 패스워드 변경을 스크립팅할 수 있습니다.
다음은 mkpasswd라는 간단한 expect 스크립트 입니다. 사용방법은 다음과 같습니다.
#mkpasswd user1 oldpasswd newpasswd

#!/usr/bin/expect
#
# mkpasswd by Bonghwan Kim
#

spawn passwd [lindex $argv 0]
set new [lindex $argv 1]

expect "New Password:"
send "$new\r"
expect "Re-enter new Password:"
send "$new\r"
expect eof


mkpasswd를 실행할때 실행 아큐먼트로 구 패스워드와 새 패스워드를 주고 실행하면, 한번에 변경이 가능합니다.
여기서 두가지 중요한 것은 이 스크립트는 root 권한을 가지고 실행이 되어야 하며, 이 스크립트가 실행될때의 locale이 반드시 POSIX 'C' 이어여 합니다. 즉, 터미널에서 실행할때에는 LC_ALL=C;export LC_ALL 혹은 그에 준하는 명령어로 쉘의 로케일을 C로 전환합니다. 그 이유는 로케일이 달라지면 expect가 기대하는 문자열의 값이 로컬라이즈화 되어 스트링이 달라집니다. 예를 들어, ko 혹은 kr_KR.UTF-8으로 되어 있으면 "New Password:"라고 나오지 않고 "새 암호:" 와 같이 물어보기 때문입니다.


일반 사용자가 위와 같은 패스워드를 사용해야 하는 경우에는 위의 스크립트를 사용할 수 없습니다. 일반 사용자 특히 이미 패스워드가 설정되어 있는 경우에는 기존의 패스워드를 물어보는 과정이 추가되기 때문입니다. 일반 사용자가 자기의 패스워드를 자동으로 변경하고자 하는 경우에는 위의 스크립트를 약간 변경하여 다음과 같이 작성하면 작동합니다.

사용법은 LC_ALL=C mkpasswd jac0001 abc123 qwer123 와 같이 실행하면 됩니다.
#!/usr/bin/expect
spawn passwd [lindex $argv 0]
set old [lindex $argv 1]
set new [lindex $argv 2]

expect "Enter existing login password:"
send "$old\r"
expect "New Password:"
send "$new\r"
expect "Re-enter new Password:"
send "$new\r"
expect eof

참고로 실행하고 테스트된 플랫폼은 다음과 같습니다.
solaris:~ 522
$cat /etc/release
Solaris Express Community Edition snv_86 X86
Copyright 2008 Sun Microsystems, Inc. All Rights Reserved.
Use is subject to license terms.
Assembled 27 March 2008
solaris:~ 523
$expect -v
expect version 5.43.0