Rust 구조체 최적화로 메모리 사용량 50% 절감!

by DD
1개월 전
조회수 18

Rust에서 JSON 역직렬화(Deserialization) 시 구조체 레이아웃 최적화를 통해 메모리 사용량을 획기적으로 줄임

Option 필드의 메모리 사용량과 Box를 활용한 힙 할당(Heap Allocation)을 통해 메모리 효율을 높이는 방법을 제시

Serde 라이브러리를 사용한 역직렬화 과정에서 발생하는 메모리 오버헤드(Memory Overhead)를 줄이기 위한 구체적인 기술적 접근

jemalloc을 활용한 메모리 사용량 측정 및 프로파일링(Profiling)을 통해 최적화 효과를 검증

Rust 구조체 메모리 레이아웃의 이해

Rust에서 구조체 내 Option 필드는 `None` 상태에서도 해당 구조체의 크기만큼 메모리를 차지한다. 이는 Rust의 메모리 관리 방식과 컴파일러 최적화의 특징 때문이다. 특히, 여러 Option 필드를 가진 구조체는 메모리 사용량 증가의 주요 원인이 된다. 따라서, 구조체 내 필드를 Option>으로 래핑(Wrapping)하여 힙에 할당함으로써, `None`일 경우 포인터 크기만큼의 메모리만 사용하도록 최적화할 수 있다. 이러한 방식은 메모리 사용량 절감(Memory Optimization)에 효과적이다.

Serde를 활용한 JSON 역직렬화 최적화

Serde 라이브러리를 사용하여 JSON 데이터를 역직렬화할 때, 불필요한 구조체를 감지하고 힙에 할당하는 커스텀 역직렬화기를 구현하여 메모리 사용량을 줄일 수 있다. 구체적으로, 모든 필드가 `None`인 구조체를 감지하여 힙 할당(Heap Allocation)을 수행하지 않도록 한다. 이러한 최적화는 JSON 데이터 처리(JSON Data Processing) 과정에서 발생하는 메모리 오버헤드를 줄이는 데 기여하며, 특히 대량의 JSON 데이터를 처리하는 경우 성능 향상에 큰 영향을 미친다.

메모리 사용량 측정 및 검증

메모리 사용량 측정 및 검증을 위해 `jemalloc`을 활용한 프로파일링(Profiling) 기법을 사용했다. `jemalloc`은 표준 할당자보다 더 자세한 메모리 사용 통계를 제공하며, 이를 통해 역직렬화 전후의 메모리 사용량을 비교 분석했다. 측정 결과, 구조체 최적화를 통해 실제 프로그램의 메모리 사용량을 475MB나 절감할 수 있었다. 이러한 검증 과정은 최적화의 효과를 객관적으로 입증하고, 성능 개선(Performance Improvement)의 근거를 제공한다.

Rust 메모리 관리의 트레이드오프

구조체 최적화는 메모리 사용량을 줄이는 데 효과적이지만, 힙 할당으로 인해 메모리 단편화(Memory Fragmentation)가 발생할 수 있다. 또한, 커스텀 역직렬화 과정에서 CPU 사용량이 증가할 수 있다. 하지만, 메모리 사용량 감소로 인해 전체적인 프로그램 실행 속도가 향상되는 경우가 많다. 따라서, 메모리 사용량과 CPU 사용량 사이의 트레이드오프(Trade-off)를 고려하여 최적의 설계를 선택해야 한다.

Box to save memory in Rust