달력

2

« 2025/2 »

  • 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
2011. 4. 1. 23:00

VDI 환경을 위한 SCVMM 성능 튜닝 Virtualization2011. 4. 1. 23:00

VDI 환경을 위한 SCVMM 성능 튜닝

VDI 환경의 특성 상 동시에 VM들이 켜지거나(출근 시간대) 동시에 VM들이 꺼지는(퇴근 시간대) 상황이 발생하는데 이 경우 VMM 서버에 많은 부하가 발생할 수 있다. 아래의 튜닝 방법은 약 1,000대의 VM을 기준으로 하므로, 이 이상의 경우에는 다수의 SCVMM 서버를 두어야 할 필요가 있다.

1,000대의 VM을 관리하기 위한 SCVMM 서버의 하드웨어 구성은 다음과 같다.
- 4Core 이상의 CPU와 8GB의 메모리
- SQL Server 2008 R2 Enterprise
- Fibre 방식 디스크로 데이터베이스와 로그 분리
- VM으로 구성할 경우 Pass-through 디스크로 구성

[새로 고침 주기 변경]
레지스트리 키 위치 - HKLM\SOFTWARE\Microsoft\Microsoft System Center Virtual Machine Manager Server\Settings
값형태 / 입력단위 - REG_DWORD / 초

 값 이름  설명  기본 값  최소 값  최대 값  권장 값
VMUpdateInterval VM 목록 새로 고침 30분 0 24시간 120분
HostUpdateInterval 호스트 및 사용자 새로 고침 30분 0 24시간 120분
VMPropertiesUpdateInterval VM 속성 및 상태 새로 고침 2분 0 24시간 30분
VHDMountTimeoutSeconds 동일 디스크를 기반으로 다수의 VM이 동시 생성되는 경우의 시간 제한 10분 10분 1시간 30분 또는 1시간

[오래된 작업 데이터 삭제]
VDI 환경의 경우 많은 양의 작업이 발생하게 되므로 데이터베이스에 많은 양의 작업 데이터가 쌓이게 될 수 있다.
레지스트리 키 위치 - HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft System Center Virtual Machine Manager Server\Settings\Sql\TaskGC
값이름: TaskGC, 기본값: 90일, 권장값: 7일

[WCF 시간 제한]
SCVMM은 서버와 클라이언트의 Powershell 레이어간 통신에 WCF를 사용한다. VDI 환경에서는 많은 양의 요청이 동시에 발생할 경우 지연이나 부하가 발생할 수 있다.
레지스트리 키 위치 - HKLM\Software\Microsoft\Microsoft System Center Virtual Machine Manager Server\Settings\IndigoSendTimeout
값이름: IndigoSendTimeout, 기본값: 120초, 권장값: 300초

[Garbage Collector(GC) 최적화]
기본값인 워크스테이션 GC 대신 VMM 서버의 GC를 설정하면 다수의 VMM 작업에 대한 CPU 오버헤드가 크게 줄어든다.
%Program Files%\Microsoft System Center Virtual Machine Manager 2008 R2\Bin 폴더에 vmmservice.exe.config 파일을 생성한 후 아래의 내용을 붙혀 넣는다.
<configuration>
   <runtime>
      <gcServer enabled="true"/>
   </runtime>
</configuration>


위 설정을 적용하기 위해서는 VMM 서비스를 재시작해야 한다.

:
Posted by 커널64

파라미터로 실행되는 프로그램을 파라미터 단위로 CPU 사용률 출력
VBS VB Script

' 프로세스 및 파라미터 정보 - 동적 입력 로직 추가
HostProcess = "notepad"      ' 프로세스 명: .exe 제외
sApplication = "ABC.txt|123.txt|DEF.txt"     ' 테스트 파라미터

Dim Param(), PID(), N1(), D1(), N2(), D2(), CPUPerf()
Set WMI_Service = GetObject("winmgmts:{impersonationlevel=impersonate}!\root\cimv2")
NumCore = GetNumProcessors

Set colItems = WMI_Service.ExecQuery ("Select * from Win32_Process where name = '"&HostProcess&".exe'")
ProcessCount = colItems.Count
If ProcessCount = 0 Then
Set colItems = Nothing
Set WMI_Service = Nothing
WScript.Quit
End If

Redim Param(ProcessCount), PID(ProcessCount)
arrApplication = Split(sApplication,"|")
intCount = 0
For Each App in arrApplication
For Each Item in colItems
arrCommandLine = Split(Item.CommandLine," ")
If Instr(UCASE(App), UCASE(arrCommandLine(UBound(arrCommandLine)))) Then
Param(intCount) = App
PID(intCount) = Item.ProcessID
intCount = intCount + 1
End If
Next
Next
Redim N1(intCount), D1(intCount), N2(intCount), D2(intCount), CPUPerf(intCount)
Set colItems = Nothing

Set colItems = WMI_Service.ExecQuery ("Select * from Win32_PerfRawData_PerfProc_Process where name = '"&HostProcess&"' or name like '"&HostProcess&"#%'")
For Each CPUPerf1 in colItems
For i = 0 To intCount
If CPUPerf1.IDProcess = PID(i) Then
N1(i) = CPUPerf1.PercentProcessorTime
D1(i) = CPUPerf1.TimeStamp_Sys100NS
End If
Next
Next
WScript.Sleep(500)
Set colItems = WMI_Service.ExecQuery ("Select * from Win32_PerfRawData_PerfProc_Process where name = '"&HostProcess&"' or name like '"&HostProcess&"#%'")
For Each CPUPerf2 in colItems
For i = 0 To intCount
If CPUPerf2.IDProcess = PID(i) Then
N1(i) = CPUPerf2.PercentProcessorTime
D1(i) = CPUPerf2.TimeStamp_Sys100NS
End If
Next
Next
Set colItems = Nothing

For i = 0 to intCount
If ( 0 = (D2(i)-D1(i)) ) then
CPUPerf(i) = 0
Else
CPUPerf(i) = Round(((((N2(i) - N1(i)) / (D2(i) - D1(i))) * 100) / NumCore), 2)
End If
Next

' 출력 부분 - 가공 로직 추가
For i = 0 to intCount-1
WScript.Echo Param(i), PID(i), CPUPerf(i)
Next

' 코어 수 쿼리 함수
Function GetNumProcessors
Set colItems = WMI_Service.ExecQuery ("Select * from Win32_ComputerSystem")
For Each objItem In colItems
On Error Resume Next
GetNumProcessors = objItem.NumberOfLogicalProcessors
If Err.number <> 0 Then
GetNumProcessors = objItem.NumberOfProcessors
End If
On Error GoTo 0
Next
Set colItems = Nothing
End Function

:
Posted by 커널64

특정 프로세스명에 대한 모든 PID 별 CPU 성능 쿼리 (로직 개선)
VBS VB Script

strProcess = "notepad"        ' 프로세스 명: .exe 제외

Dim PID(), N1(), D1(), N2(), D2(), CPUPerf()
Set WMI_Service = GetObject("winmgmts:{impersonationlevel=impersonate}!\root\cimv2")
NumCore = GetNumProcessors

Set colItems = WMI_Service.ExecQuery ("Select * from Win32_PerfRawData_PerfProc_Process where name = '"&strProcess&"' or name like '"&strProcess&"#%'")
ProcessCount = colItems.Count
If ProcessCount = 0 Then
Set colItems = Nothing
Set WMI_Service = Nothing
WScript.Quit
End If

Redim PID(ProcessCount), N1(ProcessCount), D1(ProcessCount), N2(ProcessCount), D2(ProcessCount), CPUPerf(ProcessCount)
i = 0
For Each CPUPerf1 in colItems
PID(i) = CPUPerf1.IDProcess
N1(i) = CPUPerf1.PercentProcessorTime
D1(i) = CPUPerf1.TimeStamp_Sys100NS
i = i + 1
Next
WScript.Sleep(500)
Set colItems = WMI_Service.ExecQuery ("Select * from Win32_PerfRawData_PerfProc_Process where name = '"&strProcess&"' or name like '"&strProcess&"#%'")
i = 0
For Each CPUPerf2 in colItems
N2(i) = CPUPerf2.PercentProcessorTime
D2(i) = CPUPerf2.TimeStamp_Sys100NS
i = i + 1
Next
Set colItems = Nothing

For i = 0 to ProcessCount
If ( 0 = (D2(i)-D1(i)) ) then
CPUPerf(i) = 0
Else
CPUPerf(i) = Round(((((N2(i) - N1(i)) / (D2(i) - D1(i))) * 100) / NumCore), 2)
End If
Next

' 테스트 출력
WScript.Echo "프로세스 수: " & ProcessCount
For i = 0 to ProcessCount-1
WScript.Echo "PID: "& PID(i) & vbTab & "CPU Util: " & CPUPerf(i) & "%"
Next

' 코어 수 쿼리 함수
Function GetNumProcessors
Set WMI_Service = GetObject("winmgmts:{impersonationlevel=impersonate}!\root\cimv2")
Set colItems = WMI_Service.ExecQuery ("Select * from Win32_ComputerSystem")
For Each objItem In colItems
On Error Resume Next
GetNumProcessors = objItem.NumberOfLogicalProcessors
If Err.number <> 0 Then
GetNumProcessors = objItem.NumberOfProcessors
End If
On Error GoTo 0
Next
End Function

:
Posted by 커널64
2011. 3. 25. 08:01

SCVMM 2008 R2 SP1 릴리즈~! Virtualization2011. 3. 25. 08:01

SCVMM 2008 R2 SP1이 정식 릴리즈 되었다.
http://technet.microsoft.com/en-us/evalcenter/cc793138.aspx

SP1은 Windows Server 2008 R2 SP1에서 추가된 Dynamic Memory 및 RemoteFX 기능을 지원한다.
http://www.microsoft.com/systemcenter/en/us/virtual-machine-manager/vmm-whats-new-r2.aspx
:
Posted by 커널64
2011. 3. 20. 09:33

RemoteFX 관련 그룹 정책 항목 Virtualization2011. 3. 20. 09:33

RemoteFX 관련 그룹 정책 항목 (GPO)
Group Policy RemoteFX Windows Server 2008 R2 SP1

컴퓨터 구성 > 관리 템플릿 > Windows 구성 요소 > 터미널 서비스 > 원격 데스크톱 세션 호스트 > 원격 세션 환경



컴퓨터 구성 > 관리 템플릿 > Windows 구성 요소 > 터미널 서비스 > 원격 데스크톱 세션 호스트 > 원격 세션 환경 



컴퓨터 구성 > 관리 템플릿 > Windows 구성 요소 > 터미널 서비스 > 원격 데스크톱 연결 클라이언트 > RemoteFX USB 리디렉션

:
Posted by 커널64
2011. 3. 15. 18:25

인터넷 익스플로러 9 정식 릴리즈~!! Etc.2011. 3. 15. 18:25

인터넷 익스플로러 9 정식 릴리즈~!!

언어 별 다운로드 링크
http://windows.microsoft.com/ko-KR/internet-explorer/downloads/ie-9/worldwide-languages

:
Posted by 커널64

Microsoft 기반 VDI 구성 시 구성 요소 별 이중화 및 로드 밸런싱 구성 방안



1. RD 세션 호스트 (가상 머신 리디렉션 모드)
다수의 RD 세션 호스트 서버를 DNS 라운드 로빈으로 구성한다. 클라이언트는 DNS 쿼리 후 리턴된 RD 세션 호스트를 통해 연결이 이루어 진다. 즉, Active-Active 모드로 동작한다.

2. RD 연결 브로커
RD 연결 브로커는 다수 노드를 장애 조치 클러스터로 구성해 이중화를 제공한다. 즉, Active-Passive 모드로 동작하며 Active 노드의 서비스 또는 하드웨어 장애 시 Passive 노드로 장애 조치된다.
http://technet.microsoft.com/en-us/library/ff686148(WS.10).aspx

3. RD 가상화 호스트
RD 가상화 호스트는 서버 가상화와 마찬가지로 다수의 Hyper-V 서버를 장애 조치 클러스터로 구성해 이중화를 제공한다. 호스트(노드) 장애 시 가상 머신은 클러스터의 다른 노드로 장애 조치되어 재시작된다.

4. RD 웹 액세스
RD 웹 액세스 서버는 RD 세션 호스트 서버와 마찬가지로 네트워크 로드 밸런싱(NLB) 구성 또는 DNS 라운드 로빈 구성으로 Active-Active 모드의 이중화를 제공한다.

5. RD 라이선싱 및 RD 게이트웨이
RD 라이선싱 배포 가이드 (http://technet.microsoft.com/en-us/library/dd983943(WS.10).aspx)
RD 게이트웨이 서버 이중화 가이드 (http://blogs.msdn.com/rds/archive/2009/03/24/improving-ts-gateway-availability-using-nlb.aspx)

지원되지 않는 구성
- Active-Active RD 연결 브로커 구성
- RD 가상화 호스트 서버에서의 RD 연결 브로커 클러스터링 구성

:
Posted by 커널64
2011. 3. 10. 05:23

XenDesktop 흐름도? Virtualization2011. 3. 10. 05:23

XenDesktop에서 사용자 로그온 후 리소스에 연결하기까지의 흐름도
사용자 인증 -> 웹 인터페이스 -> XML Broker -> 웹 인터페이스 -> 사용자 -> XML Broker -> 사용자


:
Posted by 커널64

Hyper-V 구성 시 클러스터 네트워크 구성 (우선순위)

> PowerShell 실행
> Import-Module failoverclusters
> Get-ClusterNetwork | FT Name, Metric, Role
현재 네트워크 인터페이스의 메트릭과 용도 쿼리

Role의 값에 대한 설명은 다음과 같다.
Role = 0: 클러스터 네트워크 사용 안함
Role = 1: 클러스터 내부 네트워크(예: Private)
Role = 3: 클러스터 네트워크(예: Public)

기본 게이트웨이가 설정되어 있는 네트워크는 클러스터 네트워크로 설정되며 메트릭은 10,000 이상의 값을 가진다.
기본 게이트웨이가 설정되어 있지 않은 네트워크는 메트릭 1,000에서 10,000 사이의 값을 가지며 내부 네트워크로 간주된다.
메트릭은 비용을 나타내며 더 작은 값을 가질 수록 클러스터 내부 네트워크 용도(CSV의 리디렉션 I/O 포함)로 사용되어진다.

메트릭을 변경하는 방법은 다음과 같다.
> PowerShell 실행
> Get-ClusterNetwork "CSV Cluster" | %{$_.Metric=800}
> Get-ClusterNetwork "LM Cluster" | %{$_.Metric=900}
메트릭을 변경하는 경우에는 다른 네트워크 인터페이스와 메트릭 값이 충돌되지 않도록 하기 위해서는 1,000 이하의 값으로 설정하는 것이 좋다.

메트릭이 가장 작은 네트워크가 CSV의 리디렉션 I/O 용도로 사용된다.

:
Posted by 커널64

VBS VBScript SCOM System Center Operations Manager
성능 수집 시간과 OM DB 인서트 시간에 많은 차이가 나는 서버 목록 쿼리

Dim TimeGap, objCN, strConnection, objRS, strSQLQuery
TimeGap = 15

Set objCN = CreateObject("ADODB.Connection")
strConnection = "Driver={SQL Server};Server=.;Trusted_Connection=TRUE"
objCN.Open strConnection
strSQLQuery= "USE OperationsManager"
strSQLQuery= strSQLQuery & " select"
strSQLQuery= strSQLQuery & " vme.path"
strSQLQuery= strSQLQuery & ", max(vpd.TimeAdded) as TimeAdded"
strSQLQuery= strSQLQuery & ", max(vpd.TimeSampled) as TimeSampled"
strSQLQuery= strSQLQuery & ", DATEDIFF(MINUTE, max(vpd.TimeSampled), max(vpd.TimeAdded)) as TimeGap"
strSQLQuery= strSQLQuery & ", Dateadd(HOUR, 9, max(vpd.TimeAdded)) as LocalTimeAdded"
strSQLQuery= strSQLQuery & ", Dateadd(HOUR, 9, max(vpd.TimeSampled)) as LocalTimeSampled"
strSQLQuery= strSQLQuery & " from PerformanceDataInsertView as vpd"
strSQLQuery= strSQLQuery & " join PerformanceCounterView as vpc on vpc.PerformanceSourceInternalId = vpd.PerformanceSourceInternalId"
strSQLQuery= strSQLQuery & " join ManagedEntityGenericView as vme on vme.Id = vpc.ManagedEntityId"
strSQLQuery= strSQLQuery & " where DATEDIFF(MINUTE, vpd.TimeSampled, vpd.TimeAdded) >= " & TimeGap
strSQLQuery= strSQLQuery & " group by vme.path"
objRS=CreateObject("ADODB.Recordset")
Set objRS = objCN.Execute(strSQLQuery)
strMsg = "다음 서버(들)의 성능 수집 시간과 데이터베이스 입력 시간의 차이가 " & TimeGap &"분 이상입니다. 컴퓨터의 시간 설정을 확인해 보시기 바랍니다. "
strServerList = ""
Do Until objRS.EOF
strServerList = strServerList & objRS(0) & "(시간 차: " & objRS(3) & "분), "
objRS.MoveNext
Loop
objRS.Close
objCN.Close
If strServerList <> "" Then
strServerList = Left(strServerList, Len(strServerList)-2)
End If

WScript.Echo strMsg & strServerList

:
Posted by 커널64