Linux Slab Allocator란? 커널 메모리 할당 구조와 Slab, SLUB, SLOB의 차이점

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_structinode도 각각의 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

실무 사례

예를 들어 파일 서버에서 메모리 사용량이 계속 증가하는 상황을 가정해 보겠습니다.

다음 순서로 분석합니다.

  1. free -h로 전체 메모리 확인
  2. cat /proc/meminfo | grep Slab로 Slab 메모리 확인
  3. slabtop으로 가장 큰 Slab Cache 확인
  4. cat /proc/slabinfo로 상세 정보 확인
  5. 특정 객체(dentry, inode)가 과도하게 증가했는지 분석

대량의 파일을 처리하는 서버에서는 dentryinode_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의 상태를 쉽게 분석할 수 있으며, 메모리 관련 문제 해결에도 큰 도움이 됩니다.

댓글 남기기