Linux에서는 사용자 프로그램뿐 아니라 커널도 지속적으로 메모리를 할당하고 해제합니다. 파일을 열거나 네트워크 패킷을 처리하고, 프로세스를 생성하거나 파일 시스템을 관리할 때마다 커널 내부에서는 수많은 메모리 객체가 생성되고 제거됩니다.
만약 커널이 매번 새로운 메모리를 할당하고 반환한다면 성능 저하와 메모리 단편화(Fragmentation)가 심각하게 발생할 수 있습니다.
이를 해결하기 위해 Linux Kernel은 Slab Allocator라는 메모리 관리 기법을 사용합니다.
이번 글에서는 Slab Allocator의 개념과 동작 원리, SLAB·SLUB·SLOB의 차이점, 그리고 실무에서 확인하는 방법을 자세히 알아보겠습니다.
Slab Allocator란?
Slab Allocator는 커널 객체를 효율적으로 관리하기 위한 메모리 할당 시스템입니다.
자주 사용하는 객체를 미리 생성하여 캐시에 보관하고, 필요할 때 즉시 재사용하는 방식으로 동작합니다.
간단한 구조는 다음과 같습니다.
Kernel
↓
Slab Cache
↓
Object Allocation
↓
Object Return
↓
Reuse
즉, 새로 생성하는 것이 아니라 이미 준비된 객체를 재사용하여 성능을 높입니다.
Slab Allocator가 필요한 이유
예를 들어 TCP 연결이 계속 생성되고 종료되는 웹 서버를 생각해 보겠습니다.
매번
메모리 할당
↓
객체 생성
↓
사용
↓
메모리 반환
을 반복하면 CPU 오버헤드가 매우 커집니다.
Slab Allocator는
객체 생성
↓
Slab Cache 저장
↓
필요 시 재사용
방식으로 동작하여 메모리 관리 비용을 크게 줄입니다.
Slab의 구조
Slab Allocator는 세 단계로 구성됩니다.
Cache
↓
Slab
↓
Object
각 요소의 의미는 다음과 같습니다.
- Cache : 동일한 종류의 객체를 저장
- Slab : 여러 개의 객체를 담는 메모리 블록
- Object : 실제 커널 객체
예를 들어 task_struct나 inode도 각각의 Slab Cache를 가질 수 있습니다.
Slab Cache란?
Slab Cache는 같은 크기의 객체를 관리하는 공간입니다.
대표적인 캐시는 다음과 같습니다.
- inode_cache
- dentry_cache
- task_struct
- buffer_head
- kmalloc-64
- kmalloc-128
- kmalloc-256
객체 크기에 따라 여러 개의 Cache가 존재합니다.
Slab Allocator 동작 과정
예를 들어 새로운 프로세스를 생성하는 경우입니다.
프로세스 생성
↓
task_struct 필요
↓
Slab Cache 확인
↓
객체 존재
↓
즉시 반환
캐시에 없으면 새로운 Slab을 생성한 뒤 객체를 제공합니다.
SLAB, SLUB, SLOB의 차이
Linux는 세 가지 주요 Allocator를 제공합니다.
| 종류 | 특징 | 사용 환경 |
|---|---|---|
| SLAB | 전통적인 Allocator | 오래된 시스템 |
| SLUB | 현재 기본 Allocator | 대부분의 Linux |
| SLOB | 매우 단순한 Allocator | 임베디드 시스템 |
현재 대부분의 Linux 배포판은 SLUB를 기본으로 사용합니다.
SLUB Allocator
SLUB는 SLAB를 개선한 구조입니다.
장점은 다음과 같습니다.
- 구조 단순화
- Lock 감소
- NUMA 최적화
- 성능 향상
- 메모리 사용 효율 증가
현재 Ubuntu, RHEL, Debian 등 대부분의 배포판에서 기본으로 사용됩니다.
SLOB Allocator
SLOB는 메모리가 매우 작은 환경을 위해 설계되었습니다.
특징
- 코드 단순
- 메모리 사용량 적음
- 작은 임베디드 장치용
- 성능보다 메모리 절약
일반 서버에서는 거의 사용되지 않습니다.
현재 Slab 정보 확인
Slab 사용 현황은 다음 명령으로 확인합니다.
cat /proc/slabinfo
예시
kmalloc-64
kmalloc-128
dentry
inode_cache
task_struct
현재 사용 중인 Slab Cache 목록이 출력됩니다.
Slab 메모리 확인
전체 Slab 사용량은 다음 명령으로 확인할 수 있습니다.
cat /proc/meminfo | grep Slab
예시
Slab: 1245672 kB
SReclaimable: 765432 kB
SUnreclaim: 480240 kB
항목 설명
- Slab : 전체 Slab 메모리
- SReclaimable : 회수 가능한 메모리
- SUnreclaim : 회수 불가능한 메모리
slabtop 사용
실시간 Slab 상태는 다음 명령으로 확인합니다.
slabtop
출력 예시
OBJS
ACTIVE
USE
OBJ SIZE
CACHE SIZE
NAME
어떤 객체가 가장 많은 메모리를 사용하는지 확인할 수 있습니다.
실무에서 자주 사용하는 명령어
Slab 정보
cat /proc/slabinfo
메모리 사용량
cat /proc/meminfo | grep Slab
실시간 확인
slabtop
메모리 상태
free -h
커널 로그
dmesg
가상 메모리 통계
vmstat
실무 사례
예를 들어 파일 서버에서 메모리 사용량이 계속 증가하는 상황을 가정해 보겠습니다.
다음 순서로 분석합니다.
free -h로 전체 메모리 확인cat /proc/meminfo | grep Slab로 Slab 메모리 확인slabtop으로 가장 큰 Slab Cache 확인cat /proc/slabinfo로 상세 정보 확인- 특정 객체(
dentry,inode)가 과도하게 증가했는지 분석
대량의 파일을 처리하는 서버에서는 dentry와 inode_cache 사용량이 크게 증가할 수 있습니다.
자주 묻는 질문
Slab 메모리가 계속 증가하면 메모리 누수인가요?
반드시 그렇지는 않습니다. Linux는 성능 향상을 위해 Slab Cache를 적극 활용합니다. 다만 SUnreclaim이 지속적으로 증가하고 회수되지 않는다면 커널 메모리 누수를 의심해 볼 수 있습니다.
SLUB가 SLAB보다 항상 좋은가요?
대부분의 일반적인 서버 환경에서는 SLUB가 더 높은 성능과 확장성을 제공합니다. 그래서 최신 Linux 배포판에서는 기본 Allocator로 사용됩니다.
slabtop은 운영 서버에서도 사용 가능한가요?
가능합니다. slabtop은 Slab Cache 사용 현황을 실시간으로 확인하는 도구이며, 성능 분석이나 메모리 문제를 진단할 때 자주 활용됩니다.
마무리
Slab Allocator는 Linux Kernel이 커널 객체를 효율적으로 관리하기 위해 사용하는 핵심 메모리 관리 시스템입니다. 동일한 객체를 재사용하여 메모리 할당 비용을 줄이고, 성능과 확장성을 높이는 데 중요한 역할을 합니다. slabtop, /proc/slabinfo, /proc/meminfo를 활용하면 Slab Cache의 상태를 쉽게 분석할 수 있으며, 메모리 관련 문제 해결에도 큰 도움이 됩니다.