1.
Dell PowerEdge R610을 이용한 가상화환경을 설정한 경험입니다. 다 아시는 내용이라도 이해를 바랍니다. 예전부터 제가 작업한 사항은 사내위키를 통하여 꼭 기록하였습니다. 지식공유차원입니다. 지금은 블로그가 위키역할을 하고 있으므로 작업내용을 소개하고자 합니다. 이후에 정리한 내용중 이전에 썼던 글을 같이 참조하셨으면 합니다.
BIOS 셋팅과 레이턴시
Low Latency와 CPU Affinity
가상화환경을 설정한 목적은 Community Cloud를 통하여 트레이딩서비스를 제공할 수 있는지를 시험하기 위함입니다. R610은 Hyper-Threading을 할 경우 12 Core이지만 Low Latency를 위하여 Virtual Processor기능을 Bios에서 Disabled로 할 경우 6Core입니다. Host와 Guest 둘에 2 Core 및 메모리 3G를 할당하는 환경을 구축하려고 합니다. Host OS와 Guest OS는 Centos 6.0으로 하였고 또다른 Guest OS는 Windows 2008 Server/Standard로 하였습니다. ZeroAOS는 Linux와 Windows를 모두 지원할 계획이기때문에 윈도우를 위한 표준OS로 Windows 2008 Server를 사용하려고 합니다.
CentOS 6.0을 설치할 때 Package->Virtualizaiton을 모두 선택하면 KVM을 이용한 가상화환경이 별도의 노력없이 잘 설치됩니다. System Tools -> Virtual Machine Manager를 이용하여 GUI를 이용하여 Virtual Machine을 편하게 설치할 수 있습니다.
혹시 Virtualization과 관련된 패키지를 설치하지 못했다면 다음과 같이 하면 됩니다.
yum install kvm libvirt python-virtinst qemu-kvm
libvirt daemon을 실행합니다.
/etc/init.d/libvirtd start]
이제 KVM이 정상적으로 동작하는지 알아보도록 하죠.
virsh -c qemu:///system list
그러면 아래와 같은 화면을 볼 수 있습니다.
1 2 3 4 5 |
[root@server1 ~]# virsh -c qemu:///system list Id Name State ---------------------------------- [root@server1 ~]# |
이상과 같은 순서로 하면 Command Line에서도 가상화 프로그램을 설치할 수 있습니다. 그렇지만 CPU가 가상화를 지원하지 않는다고 하면 말짱 도루묵입니다. 명령어로 자신의 CPU가 지원하는지를 확인하여야 합니다.
egrep ‘(vmx|svm)’ –color=always /proc/cpuinfo
아래와 같은 화면에 vmx 혹은 svm이 다른 색상으로 표시되어야 합니다.
1 2 3 4 5 |
[Zero@ZeroAOS ~]$ sudo egrep '(vmx|svm)' --color=always /proc/cpuinfo flags : fpu vme de pse tsc msr pae mce cx8 apic mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good xtopology nonstop_tsc aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 cx16 xtpr pdcm dca sse4_1 sse4_2 popcnt aes lahf_lm arat tpr_shadow vnmi flexpriority ept vpid flags : fpu vme de pse tsc msr pae mce cx8 apic mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good xtopology nonstop_tsc aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 cx16 xtpr pdcm dca sse4_1 sse4_2 popcnt aes lahf_lm arat tpr_shadow vnmi flexpriority ept vpid [Zero@ZeroAOS ~]$ |
이상의 절차를 확인한 후 서둘러 VM를 설치하였습니다. VirtualBox를 사용해보았기때문에 설치자체는 힘들지 않았습니다. 다만 VirtualBox를 사용할 때 없던(?) 기능인 Spinning이 보이더군요.
2.
사실 리눅스나 윈도우를 깔아본 ?사람은 별 고민없이 새로운 VM를 설치할 수 있습니다.그런데 문제가 생겼습니다. 네트워크를 설정할 때 ‘NAT’로 하니까 GuestOS를 다른 서버에서 접근을 할 수 없습니다. VM이 ?아웃바운드하는 세션은 가능하지만 인바운드 세션을 받을 방법이 없습니다. 이 때 NAT대신에 BRIDGE를 사용하여야 합니다. Guest OS를 설치하기 전에 Bridge를 설정하여야 Virtual Machine Manager에서 Netowkr 설정이 가능합니다. 그러면 어떻게 설정할까요?
먼저 Bridge설정이 가능하도록 하는 프로그램을 설치합니다.
yum install bridge-utils
Bridge설정을 하기 위하여 /etc/sysconfig/network-scripts/ifcfg-br1을 만듭니다.
vi /etc/sysconfig/network-scripts/ifcfg-br1
이 때 물리적으로 공유하는 이더넷카드의 정보를 가져와서 수정합니다. 저의 경우 eth1입니다. 가져온 정보중 ?IPADDR, PREFIX, GATEWAY, DNS1 and DNS2 값등은 사용하고 TYPE은 Ethernet대신에 Bridge라고 합니다.아래와 같습니다.
DEVICE=”br1″
NM_CONTROLLED=”yes”
ONBOOT=yes
TYPE=Bridge
BOOTPROTO=none
DEFROUTE=yes
IPV4_FAILURE_FATAL=yes
IPV6INIT=no
NAME=”System br1″
IPADDR=10.1.2.201
PREFIX=24
GATEWAY=10.1.2.1
DNS1=8.8.8.8
이제 eth1의 설정을 변경할 차례입니다.
DEVICE=”eth1″
NM_CONTROLLED=”yes”
ONBOOT=yes
TYPE=Ethernet
#BOOTPROTO=none
DEFROUTE=yes
IPV4_FAILURE_FATAL=yes
IPV6INIT=no
NAME=”System eth1″
#UUID=9c92fad9-6ecb-3e6c-eb4d-8a47c6f50c04
#IPADDR=10.1.2.201
#PREFIX=24
#GATEWAY=10.1.2.1
HWADDR=F0:4D:A2:09:DE:A1
#DNS1=8.8.8.8
BRIDGE=br1
위의 설정처럼 BOOTPROTO, IPADDR, PREFIX, GATEWAY, DNS1, and DNS2s는 #으로 주석처리하고 BRIDGE를 추가하여 값을 넣습니다.
/etc/init.d/network restart
위의 명령을 실행하고 난 후 ifconfig로 네트워크 설정을 확인합니다. 만약 방화벽기능이 On 되어 있는 서버일 경우 별도의 작업을 하여야 합니다. 저의 경우 Off를 해놓아 더 이상 설정변경을 하지 않았습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
[Zero@ZeroAOS ~]$ifconfig br1 Link encap:Ethernet HWaddr F0:4D:A2:09:DE:A1 inet addr:10.1.2.201 Bcast:10.255.255.255 Mask:255.255.255.0 inet6 addr: fe80::f24d:a2ff:fe09:dea1/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:26960 errors:0 dropped:0 overruns:0 frame:0 TX packets:43913 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:2032481 (1.9 MiB) TX bytes:15978805 (15.2 MiB) eth0 Link encap:Ethernet HWaddr F0:4D:A2:09:DE:9F inet addr:112.216.200.142 Bcast:112.216.200.143 Mask:255.255.255.248 inet6 addr: fe80::f24d:a2ff:fe09:de9f/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:27227 errors:0 dropped:0 overruns:0 frame:0 TX packets:115 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:2963399 (2.8 MiB) TX bytes:30412 (29.6 KiB) Interrupt:36 Memory:d6000000-d6012800 eth1 Link encap:Ethernet HWaddr F0:4D:A2:09:DE:A1 inet6 addr: fe80::f24d:a2ff:fe09:dea1/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:29183 errors:0 dropped:0 overruns:0 frame:0 TX packets:48212 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:3035464 (2.8 MiB) TX bytes:16447626 (15.6 MiB) Interrupt:48 Memory:d8000000-d8012800 lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:16436 Metric:1 RX packets:43185 errors:0 dropped:0 overruns:0 frame:0 TX packets:43185 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:3839120 (3.6 MiB) TX bytes:3839120 (3.6 MiB) virbr0 Link encap:Ethernet HWaddr FE:54:00:7B:E3:DB inet addr:192.168.122.1 Bcast:192.168.122.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:5 errors:0 dropped:0 overruns:0 frame:0 TX packets:12 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:230 (230.0 b) TX bytes:3199 (3.1 KiB) vnet0 Link encap:Ethernet HWaddr FE:54:00:7B:E3:DB inet6 addr: fe80::fc54:ff:fe7b:e3db/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:5 errors:0 dropped:0 overruns:0 frame:0 TX packets:3632 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:500 RX bytes:300 (300.0 b) TX bytes:189249 (184.8 KiB) |
Virtual Machine Manager를 이용하여 설치를 할 경우 Network설정에서 Bridge를 선택하실 수 있습니다.
그런데 저처럼 이미 선택한 경우는 어떻게 해야 하나요? 무식하게 다시 설치를 하여야 하나요? 가장 안전한 방법이 재설치입니다. 그렇지만 환경파일의 설정값을 바꾸면 되지않을까 시험을 해보았습니다.
‘ps -ef’로 실행중인 프로세스를 찾아보시면 qemu-kvm이라는 프로세스를 확인하실 수 있습니다.
qemu ? ? ?2054 ? ? 1 ?6 10:38 ? ? ? ? ?00:25:40 /usr/libexec/qemu-kvm -S -M rhel6.0.0 -enable-kvm -m 3072 -smp 2,sockets=2,cores=1,threads=1 -name Centos6 -uuid e5287511-5b10-78ae-d130-d2c6cf0e5648 -nodefconfig -nodefaults -chardev socket,id=monitor,path=/var/lib/libvirt/qemu/Centos6.monitor,server,nowait -mon chardev=monitor,mode=control -rtc base=utc -boot c -drive file=/home/Zero/images/Centos6.img,if=none,id=drive-virtio-disk0,boot=on,format=raw,cache=none -device virtio-blk-pci,bus=pci.0,addr=0x5,drive=drive-virtio-disk0,id=virtio-disk0 -drive if=none,media=cdrom,id=drive-ide0-1-0,readonly=on,format=raw -device ide-drive,bus=ide.1,unit=0,drive=drive-ide0-1-0,id=ide0-1-0 -netdev tap,fd=21,id=hostnet0 -device virtio-net-pci,netdev=hostnet0,id=net0,mac=52:54:00:7b:e3:db,bus=pci.0,addr=0x3 -chardev pty,id=serial0 -device isa-serial,chardev=serial0 -usb -device usb-tablet,id=input0 -vnc 127.0.0.1:0 -vga cirrus -device AC97,id=sound0,bus=pci.0,addr=0x4 -incoming exec:cat -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x6
qemu-kvm의 옵션정보는 /etc/libvirt/qemu 에 xml파일로 저장되어 있습니다.
1 2 |
[root@ZeroAOS qemu]# ls autostart Centos6.xml networks Win2008SVR.xml |
Centos6.xml이라는 파일을 열어서 interface와 관련된 항목을 찾았습니다. 기존설정은 아래와 같습니다.
<interface type=’network’>
<mac address=’52:54:00:7b:e3:db’/>
<source network=’default’/>
<model type=’virtio’/>
<address type=’pci’ domain=’0x0000′ bus=’0x00′ slot=’0x03′ function=’0x0’/>
</interface>
Interface를 다음과 같이 수정하였습니다. mac address를 설정하지 않으면 자동으로 설정한다고 합니다.
<interface type=’bridge’>
<source bridge=’br1’/>
</interface>
이제 Centos를 설치한 Guest OS로 ssh로 접속하여 네트워크설정을 확인합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
[zerooms@ZeroOMS ~]$ ifconfig eth0 Link encap:Ethernet HWaddr 52:54:00:7B:E3:DB inet addr:192.168.122.196 Bcast:192.168.122.255 Mask:255.255.255.0 inet6 addr: fe80::5054:ff:fe7b:e3db/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:12295 errors:0 dropped:0 overruns:0 frame:0 TX packets:6567 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:17918124 (17.0 MiB) TX bytes:448633 (438.1 KiB) lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:16436 Metric:1 RX packets:8 errors:0 dropped:0 overruns:0 frame:0 TX packets:8 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:480 (480.0 b) TX bytes:480 (480.0 b) |
이상과 같이 환경설정 파일을 직접 수정하는 방법도 있지만 virsh를 이용하는 방법도 있습니다.
virsh edit <VM name>
위와 같이 입력하면 xml파일을 읽어와 에디터에서 수정할 수 있도록 해줍니다. 나머지는 ?동일합니다. 이제 Guest OS가 Boot할 때 자동으로 실행하도록 설정할 차례입니다. 방법은 아래와 같습니다.
virsh autostart guest_name
아주 간단하죠?(^^)
3.
이상이 CentOS 6.0을 이용한 가상화설정이었습니다. 이제 두가지 과제가 남았습니다. 하나는 Guest OS에 CPU Affinity를 적용하는 일입니다. 다음은 Host OS의 네트워크환경이 모두 Bridge를 통하여 이루어지도록 하는 것입니다.
먼저 CPU Affinity는 VMS를 이용하여 설치할 때 CPU Spinning 항목에서 사용할 CPU를 입력하면 자동적으로 CPU Affinity가 적용됩니다. 앞서 CentOS 6은 CPU Core 2,3을 할당하였다고 하였습니다. 이를 확인하려면 아래와 같이 합니다. PID 2054는 앞서 Centos6의 가상환경을 만들어주는 프로세스의 ID입니다.
1 2 |
[Zero@ZeroAOS ~]$ taskset -c -p 2054 pid 2054's current affinity list: 2,3 |
아니면 taskset 명령어를 이용하여 CPU Affinity를 적용하여도 됩니다. 사용법은 아래를 확인하시길 바랍니다.
TaskSet 으로 Process의 사용 CPU를 지정해 보자!
CPU Affinity를 적용할 때 Kernel Parameter를 이용하는 방법도 있습니다. isolcpu입니다. 제가 시험한 환경도 Host OS는 CPU Core 0,1을 사용하는 것으로 설정하였습니다. /boot/grub/grub.conf중 일부입니다.
title CentOS Linux (2.6.32-71.29.1.el6.x86_64)
root (hd0,0)
kernel /vmlinuz-2.6.32-71.29.1.el6.x86_64 ro root=/dev/mapper/vg_zeroaos-lv_root rd_LVM_LV=vg_zeroaos/lv_root rd_LVM_LV=vg_zeroaos/lv_swap rd_NO_LUKS rd_NO_MD rd_NO_DM LANG=en_US.UTF-8 SYSFONT=latarcyrheb-sun16 KEYBOARDTYPE=pc KEYTABLE=ko crashkernel=auto rhgb quiet isolcpu=2,3,4,5
initrd /initramfs-2.6.32-71.29.1.el6.x86_64.img
isolcpu가 정상적으로 적용되었으면 Host OS의 프로세는 당연히 0,1에서 동작하여야 합니다. 그런데 특정한 프로세스를 Taskset으로 보면 이렇습니다.
1 2 |
[Zero@ZeroAOS ~]$ taskset -c -p 2054 pid 2054's current affinity list: 2,3 |
isolcpu의 설정이 뜻대로 움직이지 않네요. 좀더 확인해야 할 부분입니다.
또다른 과제인 Bridge설정을 변경하는 부분은 외부에서 SSH로 Guest OS에 바로 접속하도록 하기 위함입니다. 이 부분은 좀더 살펴보아야 할 듯 하네요.
이상을 위해 참고한 자료는 다음과 같습니다.
Virtualization With KVM On A CentOS 6.0 Server
IBM Information Center for Linux(Linux와 Virtualization항목을 참고. 특히 튜닝항목 참조)
(*)참고로 가상화를 위한 Shell인 virsh의 사용법을 소개합니다. 유닉스나 리눅스 계열의 경우 shell을 잘 사용하면 거의 모든 일을 손쉽게 할 수 있습니다. 마찬가지입니다.
Show a list of all the defined guests: virsh list –all
Show a guest’s info: virsh dominfo guest’s_name
Start and stop guests:Start a guest: virsh start guest’s_name
Shutdown a guest (gently): virsh shutdown guest’s_name
Shutdown a guest (wild): virsh destroy guest’s_name
Suspend a guest: virsh suspend guest’s_name
Resume a suspended guest: virsh resume guest’s_name
Create and modify guests:Create a new guest
Create a guest from its XML definition: virsh create xml_file.xml
Dump a guest’s definition in XML: virsh dumpxml guest’s_name
Modify a guest’s definition: virsh edit guest’s_name
Remove a guest’s definition (it doesn’t remove the image file): virsh undefine guest’s_name
Backup and restore guests:Save a guest’s state on a file: virsh save guest’s_name guest’s_state_file
Restore a guest from a state file: virsh restore guest’s_state_file
CPU Affinity가 어느정도 성능향상을 가져오는지 궁금하네요. 저희는 가상머신에는 적용하지않아서요.
네트워크메니저 사용하시는군요. 저희는 지워버렸습니다. 기존의 네트워크 설정파일을 자꾸 무시해서 화났습니다.
아직은 PoC단계이신듯한데 호스트머신에 가상머신을 많이 설치할 예정이시라면 DHCP머신을 하나 마련하셔서 프로파일을 관리하는 걸 추천합니다. Koan을 사용하면 DHCP에 정의된 가상머신을 호스트머신에서 kickstart할 수 있습니다.
Cobber/Koan은 처음 알았습니다. 한번 보고 괜찮을 듯 하면 참고로 하겠습니다. DHCP서버는 제가 입주한 센터에 있습니다. DHCP서버를 사용하도록 브릿지구성을 해야 하는데 아직 못하고 있습니다.
네트워크매니저가 아직 속을 썩이지 않아서…
CPU Affinity는 최소한 Jitter를 최소화할 수만 있어도 괜찮다는 생각으로 시험하고 있습니다. 아직 결과가 나오지 않아서.
때가 되면 공개하도록 하겠습니다.
감사합니다.