250509 TIL #632 파일시스템과 디렉토리 관리

김춘복·2025년 5월 9일
0

TIL : Today I Learned

목록 보기
636/636

Today I Learned

게시판 개편 작업을 하면서 S3에 게시글의 첨부 파일 저장을 하기위해 경로를 어떻게 해야할 지 고민이 되어 파일 시스템에 대해 알아보았다.


파일 시스템이란?

운영 체제가 디스크에 데이터를 저장하고 관리하는 방식
파일과 디렉토리를 체계적으로 구성

주요 구성요소

  • 파일: 데이터를 저장하는 기본 단위
  • 디렉토리: 파일과 다른 디렉토리를 포함하는 폴더
  • inode: 파일 또는 디렉토리의 메타데이터를 저장하는 구조체로, 파일 이름, 크기, 위치, 권한 등을 기록
  • 블록: 실제 데이터가 저장되는 디스크의 최소 단위

파일 시스템은 ext4, NTFS, APFS 등 다양한 종류가 있으며, 각 시스템은 inode와 블록을 활용해 효율적으로 데이터를 관리한다.

디렉토리에 파일이 수 천개 이상 많아지면 느려지는 이유

디렉토리에 파일이 많아지면 성능 저하가 발생하는데, 이는 inode와 디렉토리 구조와 관련이 있다

  • 디렉토리 구조
    디렉토리는 파일 이름과 해당 inode 번호를 매핑한 테이블을 유지하는데, 파일이 많아질수록 이 테이블이 커져 탐색 시간이 증가한다.

  • inode 조회
    파일 접근 시 디렉토리 엔트리를 순회하며 inode를 찾음. 파일이 수 천개 이상이면 선형 탐색이나 캐시 미스로 인해 지연이 발생한다.

  • 파일 시스템 종류
    ext4 같은 파일 시스템은 대량의 파일이 단일 디렉토리에 있을 때 디렉토리 인덱싱이 비효율적일 수 있다. Btrfs나 XFS는 트리 기반 인덱싱으로 이 문제를 완화하지만, 여전히 한계가 있다.

  • 디스크 I/O
    파일 목록을 읽거나 쓰는 작업이 많아지면 디스크 I/O 부하가 증가한다.

결과적으로, 디렉토리 내 파일이 많으면 파일 열기, 삭제, 생성 같은 작업이 느려진다.

해결 방법

디렉토리에 파일이 과도하게 쌓이는 문제를 해결하기 위해 개발자들은 디렉토리를 계층적으로 나누는 방식을 사용한다.

  • 연월일 구조
    /data/YYYY/MM/DD/ (예: /logs/2025/05/09/)는 로그 파일, 백업, 사용자 업로드 파일 등에 자주 사용됨.

  • 해시 기반 분할
    파일 이름을 해시하여 디렉토리를 나눔 (예: /images/a/ab/abc123.jpg). S3 같은 객체 스토리지에서도 유사한 방식 사용.

  • 카테고리 기반
    주제나 유형별로 나눔 (예: /uploads/images/, /uploads/videos/).

  • 숫자 기반
    파일 ID를 기준으로 나눔 (예: /files/001/, /files/002/).

연월일 구조는 특히 시간 기반 데이터(로그, 이벤트 데이터)에 적합하며, 관습적으로 가장 널리 사용됨. 예를 들어, Apache나 Nginx 로그는 기본적으로 날짜별 디렉토리에 저장됨.

연월일 기반 디렉토리 구조가 선호되는 이유

  • 성능 최적화: 디렉토리당 파일 수를 줄여 탐색 속도를 높임.
    예를 들어, /logs/2025/05/09/처럼 나누면 각 디렉토리에 파일이 분산된다.

  • 관리 용이성: 날짜별로 데이터를 분류하면 로그나 백업 파일을 찾거나 아카이빙하기 쉬움.

  • 확장성: 시간이 지남에 따라 파일이 계속 추가되더라도 디렉토리 크기가 제한적임.

profile
Full-Stack Dev / Data Engineer

0개의 댓글