본문으로 건너뛰기
0
r/jeffnews HN 약 5분

POSIX atime: 파일을 읽기만 해도 쓰기가 발생하는 구조의 문제점

backend

요약

POSIX 표준의 atime은 파일을 읽을 때마다 접근 시간을 기록하므로 모든 읽기가 쓰기로 이어짐. Linux는 2009년부터 relatime을 기본값으로 도입해 성능 문제를 완화했으며, 저자는 대다수 사용자에게 atime 자체가 불필요한 레거시라고 주장함.

기사 전체 정리

POSIX atime: 파일을 읽기만 해도 쓰기가 발생하는 구조의 문제점

POSIX 표준에 따르면 파일에는 atime(마지막 접근 시간), mtime(마지막 수정 시간), ctime(상태 변경 시간) 세 가지 타임스탬프가 있음. 이 중 atime은 파일을 읽을 때마다 갱신되기 때문에, 모든 읽기가 곧 쓰기가 됨. 디렉토리도 마찬가지임.

왜 문제인가

  • 파일을 읽을 때마다 메타데이터 쓰기가 발생하므로 I/O 성능에 악영향을 줌
  • CoW(Copy-on-Write) 파일시스템인 Btrfs에서는 특히 치명적임. 읽기만 해도 불필요한 복사가 일어남
  • NAND 기반 스토리지에서는 쓰기 횟수가 수명에 직결되므로 YAFFS2 같은 파일시스템은 아예 atime을 저장하지 않음
  • 캐시에서 읽어도 atime 갱신 때문에 디스크 쓰기가 발생해 하드디스크가 스핀다운하지 못하는 문제도 있음

Linux의 해결책: relatime

  • Linux 2.6.30(2009년)부터 relatime이 기본값으로 도입됨
  • atime을 매번 갱신하는 대신, 이전 atime이 mtime/ctime보다 이전인 경우에만 갱신함
  • 1일 이상 경과한 경우에도 갱신하여 기존 도구들의 호환성을 유지함

atime을 실제로 사용하는 프로그램들

  • tmpreaper / systemd-tmpfiles: 오래 접근하지 않은 임시 파일 삭제에 활용
  • Mutt 등 구형 메일 클라이언트: 특정 설정에서 새 메일 확인에 atime 사용
  • Debian popularity-contest: 설치된 패키지 중 실제 사용되는 것을 파악하는 데 활용
  • 디스크 사용량 분석 도구(agedu, dust): 사용하지 않는 파일 식별에 활용
  • relatime은 이 모든 유스케이스를 지원하므로 strict atime은 불필요함

atime의 역사와 잡학

  • CVE-2014-5207: atime을 악용해 TOCTOU 공격의 확률적 방어를 무력화하는 기법이 발표됨
  • DragonFly BSD: 기본적으로 atime을 비활성화함
  • Nix: 가비지 컬렉터에서 atime 지원을 제거함. "실제로 유용하지 않다"는 이유
  • 백업 소프트웨어가 atime을 사용한다는 주장이 있으나, 실제로는 HSM(계층적 스토리지 관리) 소프트웨어 하나가 근거이며 대부분의 백업 프로그램은 atime을 무시하거나 우회함
  • 1991년 논문에서 이미 atime이 내결함성 기법에 문제를 일으킨다고 지적했으며, 파일 닫기(close) 시점에 갱신하도록 Unix 시맨틱스 변경을 제안함

결론

  • 저자는 자신의 ZFS 풀에서 atime을 비활성화함
  • 대다수 사용자에게 atime은 이미 쓸모없는 레거시이며, relatime만으로도 필요한 유스케이스를 충분히 커버할 수 있음
  • popularity-contest는 inotify로 대체 가능하고, 임시 파일 정리용 atime은 tmpfs에만 활성화하면 됨

원문 링크

핵심 포인트

  • POSIX atime은 파일 읽기마다 접근 시간을 갱신하므로 모든 읽기가 쓰기 I/O를 유발함
  • Linux 2.6.30부터 relatime이 기본값으로, mtime/ctime보다 오래된 경우에만 atime 갱신
  • atime을 실제 사용하는 프로그램은 tmpreaper, systemd-tmpfiles, Mutt, popularity-contest 등 소수에 불과
  • CoW 파일시스템(Btrfs)이나 NAND 스토리지에서 특히 해로우며, DragonFly BSD는 기본 비활성화

인사이트

대부분의 서버와 개발 환경에서 atime은 실질적 이점 없이 I/O 부하만 추가하는 레거시임. ZFS나 Btrfs를 사용한다면 noatime 마운트 옵션을 적극 검토할 만함.

댓글

댓글

댓글을 불러오는 중...

backend

Redis 8.0 출시 — I/O 스레딩 갈아엎고 처리량 3배, 2.1M ops/sec 달성

Redis 8.0이 I/O 스레딩 모델을 완전히 재설계해서 16코어 기준 2.1M ops/sec를 달성함 (7.4 대비 3배). Hash field expiration, Vector search HNSW, Client-side caching v2, Redis Functions 2.0 async 실행 등 굵직한 기능이 추가되고, jemalloc 통합으로 메모리 fragmentation도 25% 줄어듦.

backend

Coalton 0.2 프리뷰: 커링을 버리고, 키워드 인자와 실수 대수적 수를 품다

Common Lisp 안에 사는 정적 타입 함수형 언어 Coalton이 0.2에서 Haskell 스타일 커링을 버리고 고정 인자 함수로 전환. 키워드 인자, 다중 반환값, 컬렉션 리터럴, 짧은 람다, scoped 타입 변수, 실수 대수적 수(RealAlgebraic) 등 대규모 변경.

backend

5만 달러짜리 수작업 포렌식 감사를 결정론적 Python 엔진으로 대체한 사례

이혼 소송에서 공동 계좌 내 별도 재산을 증명하는 포렌식 회계 작업을 자동화한 Exit Protocol. LIBR(최저 중간 잔액 규칙)을 상태 머신으로 구현하고, Spatial-Grid OCR로 은행 PDF를 처리하며, Daubert 기준 충족을 위해 AI를 의도적으로 배제한 결정론적 파이프라인임.

backend

Sandia 국립연구소의 LAPIS: 희소 행렬 연산을 위한 MLIR 기반 컴파일러 프레임워크

Sandia 국립연구소에서 MLIR 위에 구축한 LAPIS 컴파일러 프레임워크 발표. Kokkos 방언으로 다양한 아키텍처 지원하며 희소 선형대수 연산을 GPU에서 효율적으로 최적화

backend

Cloudflare, API 한 번으로 웹사이트 전체를 크롤링하는 /crawl 엔드포인트 오픈 베타 출시

Cloudflare Browser Rendering에 /crawl 엔드포인트가 오픈 베타로 추가됨. 시작 URL 하나로 전체 사이트를 크롤링하고 HTML, Markdown, JSON으로 반환하며, robots.txt를 준수하는 비동기 크롤링 API.