리눅스 커널 DAMON으로 메모리 접근 패턴 모니터링하기

메모리 회수는 LRU 리스트로 hot/cold 페이지를 구분해야 하는데, page table의 accessed bit를 주기적으로 스캔하는 전통적 방식은 메모리가 커질수록 오버헤드가 커진다. DAMON(Data Access MONitor)은 리눅스 5.15부터 커널에 들어온 범용 데이터 접근 모니터링 프레임워크로, 개별 페이지가 아니라 “region” 단위 표본 추출로 오버헤드를 사용자가 직접 통제할 수 있게 한다. 이 글에서는 DAMON의 동작 원리, sysfs로 실제 모니터링을 켜는 방법, DAMOS 기반 자동 회수(DAMON_RECLAIM) 활용법을 정리한다.

Ubuntu 커널에 DAMON적용하는 방법은 아래 글을 참고한다.

핵심 개념

region 기반 샘플링(접근 패턴이 비슷한 주소 범위를 하나의 region으로 묶어 sampling interval마다 무작위 페이지 하나만 확인)과 적응형 region 조정(aggregation interval마다 접근 빈도가 비슷한 region은 병합, 갈리면 분할)이 핵심 메커니즘이다.

튜닝 파라미터의미
sample interval하나의 region에서 접근 여부를 확인하는 주기
aggregation intervalregion 병합/분할과 결과 집계 주기
min/max nr_regionsregion 개수 하한/상한 (오버헤드 상한 통제)

DAMOS scheme은 “이런 접근 패턴(크기, 접근 빈도, age)을 만족하는 region에 이런 액션을 적용하라”는 규칙이다.

액션동작
pageout스왑아웃
cold / willneed회수 후보 표시
hugepage / nohugepageTHP 적용 여부
lru_prio / lru_deprioLRU 우선순위 조정
migrate_hot / migrate_coldNUMA 노드 간 마이그레이션
stat측정만, 액션 없음

sysfs로 모니터링 켜보기

계층 구조는 kdamonds → contexts → targets/schemes. 특정 PID의 가상 주소 공간을 모니터링하는 절차:

# kdamond 1개, context 1개 생성
cd /sys/kernel/mm/damon/admin/
echo 1 > kdamonds/nr_kdamonds
echo 1 > kdamonds/0/contexts/nr_contexts
echo vaddr > kdamonds/0/contexts/0/operations

# 모니터링 간격 (단위: us)
cd kdamonds/0/contexts/0/monitoring_attrs/intervals/
echo 5000    > sample_us
echo 100000  > aggr_us
echo 1000000 > update_us

# region 개수 범위 (intervals/의 형제 디렉터리)
cd ../nr_regions/
echo 10  > min
echo 1000 > max

# 모니터링 대상 PID
cd /sys/kernel/mm/damon/admin/kdamonds/0/contexts/0/targets/
echo 1 > nr_targets
echo $(pidof my_workload) > 0/pid_target

# 처음 켤 때는 commit 없이 바로 on
echo on > /sys/kernel/mm/damon/admin/kdamonds/0/state

$ cat /sys/kernel/mm/damon/admin/kdamonds/0/state
on

실제 sysfs 조작으로 확인한 것: nr_regions/intervals/의 형제 디렉터리라 cd ../nr_regions/가 맞다. commit은 이미 켜진 kdamond에 새 설정을 다시 적용할 때만 쓴다 — 켠 적 없는 kdamond에 먼저 쓰면 Invalid argument.

“4KB~8KB, 접근 횟수 0~5회, age 10~20″인 region을 pageout 대상으로 지정하고 quota/watermark로 안전장치를 건 scheme 예시:

cd /sys/kernel/mm/damon/admin/kdamonds/0/contexts/0/schemes/
echo 1 > nr_schemes
cd 0/

echo 4096 > access_pattern/sz/min
echo 8192 > access_pattern/sz/max
echo 0    > access_pattern/nr_accesses/min
echo 5    > access_pattern/nr_accesses/max
echo 10   > access_pattern/age/min
echo 20   > access_pattern/age/max

echo pageout > action

# quota: 1초에 최대 10ms, 최대 1GiB
echo 10         > quotas/ms
echo 1073741824 > quotas/bytes
echo 1000       > quotas/reset_interval_ms

# watermark: free 비율(천분율) 60%↑ 정지, 50% 동작, 30%↓ 완전 중지
echo free_mem_rate > watermarks/metric
echo 5000000        > watermarks/interval_us
echo 600 > watermarks/high
echo 500 > watermarks/mid
echo 300 > watermarks/low

echo commit > /sys/kernel/mm/damon/admin/kdamonds/0/state

매번 echo로 채우기 번거로우면 damo CLI(damo start/record/report)로 감쌀 수 있다.

DAMON_RECLAIM으로 자동 회수 적용하기

scheme을 직접 구성하지 않아도, “가벼운 메모리 압박 상황에서 오래 안 쓰인 물리 메모리를 선제 회수”하도록 튜닝된 static module DAMON_RECLAIM이 있다.

cd /sys/module/damon_reclaim/parameters

echo 30000000 > min_age        # 30초 이상 미접근 -> cold
echo $((1024*1024*1024)) > quota_sz  # 초당 최대 1GiB 회수
echo 500 > wmarks_high         # free 50%↑면 중단
echo 400 > wmarks_mid          # free 40%면 동작
echo Y > enabled

부팅 시부터 켜려면 커널 커맨드라인에 damon_reclaim.enabled=Y. 비슷한 목적의 DAMON_LRU_SORT(hot region을 LRU 앞쪽으로)도 함께 들어 있다.

주의사항

  • Ubuntu generic 커널도 기본은 CONFIG_DAMON is not set (WSL2·베어메탈 둘 다 확인). ls /sys/kernel/mm/damon/admin/으로 먼저 확인할 것 — 없으면 직접 빌드해야 하고, 그 과정은 별도 글에 정리했다.
  • CONFIG_DAMON_STAT_ENABLED_DEFAULT=y면 부팅 직후부터 kdamond가 이미 하나 떠 있어 새로 on하면 Device or resource busy. echo N > /sys/module/damon_stat/parameters/enabled로 끄고 재시도.
  • vaddr 모니터링은 대상 프로세스가 살아있는 동안만 유효 — 종료되면 target 자동 무효화.
  • min_age/quota를 너무 공격적으로 잡으면 곧 다시 쓰일 페이지까지 스왑아웃될 수 있다. 적용 전 stat 액션이나 tried_regions로 매칭 규모부터 관찰할 것.
  • sample_us를 너무 짧게 잡으면 모니터링 스레드 자체의 CPU 사용량이 늘어난다.
  • DAMON_RECLAIM/DAMON_LRU_SORT는 CONFIG_DAMON_RECLAIM/CONFIG_DAMON_LRU_SORT 설정에 따라 아예 없을 수 있다.

마무리

DAMON은 region 기반 샘플링과 적응형 조정으로 hot/cold 메모리 경계를 낮은 오버헤드로 추적한다. DAMOS scheme과 DAMON_RECLAIM을 결합하면 별도 유저스페이스 데몬 없이 커널 레벨에서 자동 회수까지 구성할 수 있다. 운영에 적용하기 전에는 stat 액션이나 damo report로 실제 접근 패턴부터 관찰할 것을 권장한다.

참고

답글 남기기