본문으로 건너뛰기

O_DIRECT — Page Cache 우회

[!tldr] 업무 관점 takeaway [[LMCache-Local-Disk-Backend|LMCache]]에 이미 use_odirect=True 옵션이 있다. 이걸 켜야 FDP 효과가 실제 SSD에 그대로 보이고 우리 측정이 의미있다. 단, alignment 조건(메모리/크기/offset 모두 정렬) 위반 시 silently fallback → page cache가 끼어 측정 흐림. 코드 레벨 alignment 검증이 [[기여-포인트-맵|기여 포인트 [5]]] 작업.


한 줄 정의

open(2) 플래그. 파일 I/O 시 OS의 Page Cache를 우회하고 디스크에 직접 (DMA로) 전송.

일반 read/write:
app buffer ──→ page cache ──→ disk
(캐시 일치성, prefetch 등 OS가 관리)

O_DIRECT:
app buffer ──────────────────► disk (DMA)
(OS 캐시 안 거침)

왜 필요한가 (우리 미션 관점)

  1. 측정의 명료성 — page cache가 끼면 cold/warm 구분이 모호. 실제 NVMe에 떨어지는 I/O 패턴을 보려면 우회 필요.
  2. FDP 효과의 실측 — page cache가 write를 모았다 한꺼번에 flush하면 우리가 보낸 FDP hint 의미가 흐려짐.
  3. 메모리 효율 — KV Cache는 이미 LMCache가 자체 캐시(L1 CPU DRAM)를 관리 → OS page cache는 중복.
  4. p99 안정성 — page cache flush가 spike의 원인이 되는 경우 있음.

Alignment 요구사항 — ⚠️ 깨지면 silently fallback

세 가지가 모두 정렬되어야 한다:

write 메모리 버퍼 주소 % alignment == 0 (보통 512B 또는 4KB)
write 크기 % alignment == 0
write 파일 offset % alignment == 0

조건 미달 시:

  • 옛날 커널: EINVAL
  • 최근 커널: 자동으로 buffered I/O로 fallback (조용히)

→ 이게 우리 입장에서 가장 위험한 함정. 옵션은 켜져 있는데 실제로는 page cache를 쓰고 있는 상태가 가능.


LMCache의 현재 상태 (조사 필요)

[[LMCache-Local-Disk-Backend|local_disk_backend]]:

  • use_odirect=True 옵션 존재
  • 단, save_chunk_meta=True일 때는 O_DIRECT가 강제 비활성화 (fs_connector.py:111)
  • 메타데이터 정렬이 까다로워서 일단 끈 것
  • → TODO: support O_DIRECT for save_chunk_meta by ...

이게 [[단기-Task-목록|Task 3 — fs_connector O_DIRECT 메타데이터 경로]]의 대상.


측정 시 체크리스트

  • use_odirect=True 설정 후 strace/bpftrace로 실제 O_DIRECT가 적용되는지 확인
  • alignment 위반 시 fallback 로그 / 메트릭 확인
  • iostat에서 host write 패턴이 chunk 크기와 일치하는지 확인
  • nvme fdp stats로 NAND write가 실제로 줄어드는지 확인 ([[WAF]])

io_uring과의 조합

io_uring + O_DIRECT
→ page cache 없음 + 진짜 async + (io_uring_cmd면) NVMe 직결
→ 측정 명료성 + 성능 동시 확보

이게 우리가 가야 할 방향. [[io_uring]] 참조.


의외의 연결

[!note] LMCache의 자체 캐시 ↔ OS page cache 둘 다 "최근 데이터 메모리 보관" 역할. 중복이고 충돌이다. LMCache가 OS보다 더 좋은 정보(LRU/LFU, KV semantic)를 가지므로 OS page cache는 끄는 게 옳다 = O_DIRECT.

[!note] f2fs와 O_DIRECT f2fs는 자체 hot/cold 분리 기능이 있는데, O_DIRECT 쓰면 그 결정이 우회됨. f2fs + FDP 조합 시에는 두 레이어의 의사결정이 중복/충돌하지 않는지 검토 필요.


관련 페이지

  • [[LMCache-Local-Disk-Backend]] — use_odirect 옵션의 위치
  • [[io_uring]] — O_DIRECT와 자주 함께 쓰는 짝
  • [[Storage-Stack]] — O_DIRECT가 어느 레이어를 건너뛰는가
  • [[NVMe-FDP]] — FDP 효과 측정의 전제 조건
  • [[단기-Task-목록]] — Task 3 (fs_connector O_DIRECT)