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의 특징을 파악하고, 애플리케이션의 특성에 맞는 모드를 선택하는 것이 중요합니다. 또한 동시 수집과 대기 시간 모드를 활용하여 중단 시간을 최소화하고, 사용자 경험을 향상시킬 수 있습니다.