GC 모드와 설정
.NET의 Garbage Collector(GC)는 애플리케이션의 성능과 응답성을 최적화하기 위해 다양한 모드를 제공합니다. GC 모드를 적절히 선택하고 설정하면 메모리 관리 효율을 높이고 애플리케이션의 특성에 맞는 성능을 달성할 수 있습니다. 이번 글에서는 GC의 주요 모드와 설정 방법, 그리고 각 모드의 특징과 적용 사례에 대해 알아보겠습니다.
GC 모드의 종류
Workstation GC
Workstation GC는 데스크톱 애플리케이션이나 사용자 인터페이스(UI)가 있는 애플리케이션에 적합한 모드입니다. 이 모드는 애플리케이션의 응답성을 우선시하며, 단일 프로세서 또는 멀티코어 프로세서 환경에서 동작합니다.
- 특징:
- 동시 수집(Concurrent GC)을 지원하여 GC 실행 중에도 애플리케이션이 일정 부분 동작할 수 있습니다.
- UI 스레드의 중단 시간을 최소화하여 사용자 경험을 향상시킵니다.
Server GC
Server GC는 서버 애플리케이션이나 백엔드 프로세스에 적합한 모드입니다. 멀티코어 프로세서를 활용하여 병렬로 가비지 컬렉션을 수행함으로써 높은 처리량과 성능을 제공합니다.
- 특징:
- 각 프로세서 코어마다 별도의 힙과 전용 GC 스레드를 생성하여 병렬 수집을 수행합니다.
- 최대한의 CPU 자원을 활용하여 메모리 수집 속도를 향상시킵니다.
- 애플리케이션의 처리량을 높이는 데 효과적입니다.
새로운 모드: 서버 GC의 백그라운드 수집
.NET 4.5부터 Server GC에서도 백그라운드 수집(Background GC)을 지원합니다. 이를 통해 Server GC에서도 애플리케이션의 중단 시간을 줄일 수 있습니다.
GC 모드 설정 방법
GC 모드는 애플리케이션의 구성 파일(App.config 또는 Web.config)이나 환경 변수를 통해 설정할 수 있습니다.
구성 파일을 통한 설정
다음은 구성 파일에서 GC 모드를 설정하는 예시입니다.
<configuration>
<runtime>
<!-- Server GC 활성화 -->
<gcServer enabled="true"/>
<!-- 동시 수집 활성화 -->
<gcConcurrent enabled="true"/>
</runtime>
</configuration>
gcServer
요소의enabled
속성을true
로 설정하면 Server GC를 활성화합니다.gcConcurrent
요소의enabled
속성을true
로 설정하면 동시 수집(Workstation GC의 경우) 또는 백그라운드 수집(Server GC의 경우)을 활성화합니다.
환경 변수를 통한 설정
환경 변수를 사용하여 GC 모드를 설정할 수도 있습니다.
- Server GC 활성화:
set COMPlus_gcServer=1
- 동시 수집 비활성화:
set COMPlus_gcConcurrent=0
환경 변수 설정은 애플리케이션을 시작하기 전에 적용해야 합니다.
각 모드의 적용 사례
Workstation GC 적용 사례
- 데스크톱 애플리케이션
- GUI 기반의 응답성이 중요한 애플리케이션
- 단일 사용자 환경 예시: 이미지 편집 프로그램이나 텍스트 에디터와 같이 사용자와의 상호작용이 빈번한 애플리케이션에서는 Workstation GC를 사용하는 것이 적합합니다.
Server GC 적용 사례
- 웹 서버
- 데이터베이스 서버
- 대규모 멀티스레드 서버 애플리케이션 예시: ASP.NET Core 웹 애플리케이션이나 WCF 서비스와 같이 다수의 요청을 처리해야 하는 서버 애플리케이션에서는 Server GC를 활용하여 성능을 향상시킬 수 있습니다.
동시 수집(Concurrent/Background GC)
동시 수집은 GC가 가비지 컬렉션을 수행하는 동안 애플리케이션 스레드가 계속 실행될 수 있도록 합니다. 이를 통해 애플리케이션의 중단 시간을 줄이고 응답성을 향상시킵니다.
- Workstation GC에서의 동시 수집: 기본적으로 활성화되어 있으며, UI 애플리케이션의 응답성을 높이는 데 도움을 줍니다.
- Server GC에서의 백그라운드 수집: .NET 4.5부터 지원되며, 서버 애플리케이션에서도 중단 시간을 최소화할 수 있습니다.
동시 수집 설정 예시
구성 파일에서 동시 수집을 활성화하거나 비활성화할 수 있습니다.
<configuration>
<runtime>
<!-- 동시 수집 비활성화 -->
<gcConcurrent enabled="false"/>
</runtime>
</configuration>
동시 수집을 비활성화하면 GC가 수집 작업을 수행하는 동안 애플리케이션이 일시적으로 중단될 수 있습니다.
GC 설정 확인 방법
애플리케이션에서 현재 사용 중인 GC 모드를 확인하려면 GCSettings
클래스를 사용할 수 있습니다.
using System;
using System.Runtime;
class Program
{
static void Main()
{
Console.WriteLine("Is Server GC: " + GCSettings.IsServerGC);
Console.WriteLine("GC Latency Mode: " + GCSettings.LatencyMode);
}
}
위 코드를 실행하면 현재 GC 모드와 대기 시간 모드를 출력합니다.
GC 대기 시간 모드(Latency Mode)
GC의 대기 시간 모드를 설정하여 애플리케이션의 응답성을 더욱 세밀하게 제어할 수 있습니다.
대기 시간 모드 종류
- Interactive: 기본 모드로, 응답성과 처리량 간의 균형을 유지합니다.
- LowLatency: GC 수집을 최소화하여 응답성을 높입니다. 단, 메모리 사용량이 증가할 수 있습니다.
- SustainedLowLatency: 장기간 LowLatency 모드를 유지합니다.
- NoGCRegion: 지정된 기간 동안 GC를 완전히 중단합니다.
대기 시간 모드 설정 예시
using System;
using System.Runtime;
class Program
{
static void Main()
{
// 현재 대기 시간 모드 저장
var oldMode = GCSettings.LatencyMode;
// LowLatency 모드로 변경
GCSettings.LatencyMode = GCLatencyMode.LowLatency;
// 중요한 작업 수행
PerformCriticalWork();
// 원래 모드로 복원
GCSettings.LatencyMode = oldMode;
}
static void PerformCriticalWork()
{
// 중요한 작업 로직
}
}
LowLatency 모드는 메모리 사용량이 충분하고, 짧은 기간 동안 응답성을 높여야 할 때 유용합니다.
GC 모드 선택 시 고려 사항
- 프로세서 코어 수: Server GC는 멀티코어 환경에서 더 큰 이점을 제공합니다. 단일 코어 시스템에서는 Workstation GC가 적합할 수 있습니다.
- 응답성 vs. 처리량: 사용자 인터페이스의 응답성이 중요하다면 Workstation GC를, 전체 처리량이 중요하다면 Server GC를 선택합니다.
- 메모리 사용 패턴: 애플리케이션의 메모리 할당 패턴에 따라 GC 모드와 대기 시간 모드를 조정해야 합니다.
실습 예제: Server GC 활성화하기
ASP.NET Core 애플리케이션에서 Server GC를 활성화하는 방법은 다음과 같습니다.
1. 프로젝트 파일 수정
.csproj
파일에 다음 속성을 추가합니다.
<PropertyGroup>
<ServerGarbageCollection>true</ServerGarbageCollection>
</PropertyGroup>
2. 프로그램 실행
이제 애플리케이션을 실행하면 Server GC가 활성화됩니다.
3. 설정 확인
애플리케이션 코드에서 GC 모드를 확인합니다.
Console.WriteLine("Is Server GC: " + GCSettings.IsServerGC);
출력 결과가 Is Server GC: True
이면 Server GC가 정상적으로 활성화된 것입니다.
결론
GC 모드와 설정을 이해하고 적절히 활용하면 애플리케이션의 성능과 응답성을 최적화할 수 있습니다. Workstation GC와 Server GC의 특징을 파악하고, 애플리케이션의 특성에 맞는 모드를 선택하는 것이 중요합니다. 또한 동시 수집과 대기 시간 모드를 활용하여 중단 시간을 최소화하고, 사용자 경험을 향상시킬 수 있습니다.