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 캐시 안 거침)
왜 필요한가 (우리 미션 관점)
- 측정의 명료성 — page cache가 끼면 cold/warm 구분이 모호. 실제 NVMe에 떨어지는 I/O 패턴을 보려면 우회 필요.
- FDP 효과의 실측 — page cache가 write를 모았다 한꺼번에 flush하면 우리가 보낸 FDP hint 의미가 흐려짐.
- 메모리 효율 — KV Cache는 이미 LMCache가 자체 캐시(L1 CPU DRAM)를 관리 → OS page cache는 중복.
- 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)