Interview/OS

OS Delayed Write 지연 쓰기

김 정출 2024. 9. 28. 10:30

Delayed Write

  • 지연 쓰기(Delayed Write)는 운영체제에서 디스크 쓰기 작업을 효율적으로 처리하기 위해 사용되는 기술로, 데이터를 즉시 디스크에 기록하지 않고 메모리에 임시로 저장한 후 나중에 한 번에 기록하는 방식입니다. 이 방식은 주로 배치 작업(Batch Operation)으로 처리되며, 여러 쓰기 요청을 모아서 디스크 I/O를 최소화하고 시스템 성능을 높이는 역할을 합니다.

지연 쓰기의 내부 로직

1. 데이터 쓰기 요청 발생

  • 애플리케이션이 파일에 데이터를 쓰려는 요청을 보냅니다. 이 때, 운영체제는 디스크 I/O 작업을 바로 실행하지 않고, 데이터를 먼저 메모리 캐시(Page Cache)에 저장합니다.
  • 이 메모리 캐시는 페이지 캐시 또는 버퍼 캐시라고 하며, 자주 접근하는 데이터를 저장해 두어 I/O 성능을 최적화합니다.

2. 메모리 캐시에 데이터 저장

  • 운영체제는 파일에 대한 데이터를 메모리 캐시에 임시 저장합니다. 이렇게 하면 디스크에 직접 쓰지 않기 때문에 디스크 I/O 비용이 발생하지 않고, 메모리에 데이터를 기록하는 것이 훨씬 빠르기 때문에 쓰기 속도가 빨라집니다.
  • 메모리 캐시에는 데이터의 변경 사항을 관리하기 위해 더티 페이지(Dirty Page)라는 개념이 사용됩니다. 더티 페이지는 메모리 캐시에 저장된 데이터 중에서 아직 디스크에 기록되지 않은 변경된 데이터를 의미합니다.

3. 배치 작업 준비

  • 시간이 지나면서 여러 쓰기 작업이 발생하면, 운영체제는 메모리 캐시에 있는 여러 데이터 변경 사항을 한꺼번에 디스크에 기록하기 위해 배치 작업을 준비합니다.
  • 이러한 배치 작업은 운영체제의 쓰기 정책(Write-back Policy)에 따라 수행됩니다. 일반적으로는 일정 시간이 경과하거나, 캐시의 공간이 부족해질 때 배치 작업이 수행됩니다.

4. 쓰기 정책 (Write-back Policy)

  • 운영체제는 데이터를 언제 디스크로 쓸지 결정하는 쓰기 정책을 가지고 있습니다. 주요 쓰기 정책은 다음과 같습니다:
    • 지연 쓰기 (Delayed Write): 데이터를 바로 디스크에 기록하지 않고, 나중에 배치로 기록합니다. 이는 디스크 I/O 성능을 높이기 위한 정책입니다.
    • 강제 쓰기 (Write-through): 데이터가 캐시에 기록되는 동시에, 즉시 디스크에도 기록하는 방식입니다. 지연 쓰기와 달리 데이터의 무결성을 보장하지만, 성능은 다소 떨어집니다.
  • 지연 쓰기는 일반적으로 시간 기반 또는 이벤트 기반으로 디스크에 기록됩니다:
    1. 시간 기반: 일정 시간이 지나면 운영체제가 더티 페이지들을 디스크로 기록합니다.
    2. 이벤트 기반: 캐시가 가득 차거나, 시스템 종료 요청이 발생할 때, 또는 fsync() 함수와 같은 명시적인 요청이 있을 때 캐시된 데이터를 디스크에 기록합니다.

5. 배치 작업 실행

  • 배치 작업이 시작되면, 운영체제는 캐시에 있는 더티 페이지를 디스크에 쓰기 시작합니다. 이때 여러 페이지를 한꺼번에 디스크로 기록하므로, 개별적으로 디스크에 쓰는 것보다 더 효율적입니다.
  • 운영체제는 디스크의 블록 단위로 데이터를 기록하므로, 각 쓰기 작업이 디스크 스케줄러에 의해 최적화되어 순차적으로 기록됩니다. 이 과정에서 디스크 병목 현상을 줄이고, I/O 성능을 최대화할 수 있습니다.

6. 더티 페이지 클리어

  • 더티 페이지가 디스크에 기록된 후, 운영체제는 해당 페이지를 더티 상태에서 깨끗한 상태(Clean Page)로 변경합니다.
  • 이제 이 페이지는 디스크에 안전하게 기록되었으므로, 다시 더티 페이지로 설정될 때까지 추가적인 디스크 쓰기 작업은 필요하지 않습니다.

지연 쓰기의 동작 예시

  1. 파일 쓰기 요청: 애플리케이션이 파일에 1MB의 데이터를 쓰려고 할 때, 이 데이터를 운영체제는 디스크에 바로 기록하지 않고 메모리 캐시에 기록합니다.
  2. 배치 작업 대기: 여러 개의 쓰기 작업이 발생하면, 이 모든 쓰기 요청이 캐시에 저장된 상태로 있습니다.
  3. 배치 쓰기 실행: 일정 시간이 지나거나, 캐시가 가득 차게 되면 운영체제는 더티 페이지들을 모아서 한 번에 디스크에 기록합니다.
  4. 캐시 비우기: 배치 작업이 완료되면, 더티 페이지는 클린 페이지로 변환되고, 메모리 캐시가 비워집니다.

지연 쓰기의 장점

  1. 디스크 I/O 감소:
    • 지연 쓰기는 여러 개의 쓰기 요청을 한 번에 처리하므로, 디스크 I/O 횟수를 크게 줄일 수 있습니다. 디스크에 데이터를 개별적으로 기록하는 대신, 배치 작업으로 묶어서 처리하기 때문에 디스크 성능이 크게 향상됩니다.
  2. 쓰기 성능 향상:
    • 메모리 캐시에 데이터를 저장하고 빠르게 쓰기 작업을 완료할 수 있으므로, 쓰기 작업의 응답 속도가 매우 빨라집니다. 이로 인해 애플리케이션의 성능이 향상됩니다.
  3. 디스크 수명 연장:
    • SSD와 같은 저장 매체는 쓰기 횟수가 많을수록 수명이 짧아집니다. 지연 쓰기를 통해 쓰기 횟수를 줄일 수 있어 디스크 수명을 연장할 수 있습니다.

지연 쓰기의 단점

  1. 데이터 무결성 문제:
    • 지연 쓰기는 데이터를 메모리에 먼저 기록하고, 디스크에는 나중에 기록하기 때문에, 시스템 충돌이나 전원 장애가 발생할 경우 데이터 손실이 발생할 수 있습니다.
    • 이를 방지하기 위해 fsync() 같은 명시적 동기화 요청이 필요하며, 중요한 데이터의 경우 강제 쓰기 방식을 사용할 수 있습니다.
  2. 메모리 오버헤드:
    • 많은 데이터를 메모리 캐시에 저장하므로, 시스템의 메모리 자원을 많이 사용할 수 있습니다. 메모리가 부족해지면 스왑(swap)을 사용해야 하며, 이는 성능 저하로 이어질 수 있습니다.
  3. 동기화 문제:
    • 여러 프로세스가 동일한 파일을 동시에 쓰거나 읽는 경우, 지연된 쓰기 작업이 동기화되지 않으면 데이터 일관성 문제가 발생할 수 있습니다. 이를 해결하기 위해 락(lock)이나 다른 동기화 메커니즘이 필요합니다.

지연 쓰기의 일반적인 사용 사례

  1. 파일 시스템:
    • Ext4, NTFS와 같은 파일 시스템에서는 성능 향상을 위해 지연 쓰기를 사용하여 디스크에 데이터를 빠르게 기록하고 나중에 실제 쓰기 작업을 배치로 처리합니다.
  2. 데이터베이스:
    • 데이터베이스 시스템에서 트랜잭션 로그임시 파일을 지연 쓰기로 처리하여 성능을 최적화합니다. 그러나 데이터베이스는 데이터 무결성이 매우 중요하기 때문에, 중요 데이터는 지연 쓰기 대신 즉시 디스크에 기록하는 방법을 병행합니다.
  3. SSD 성능 최적화:
    • SSD는 쓰기 작업이 많아지면 성능이 저하될 수 있는데, 지연 쓰기를 통해 쓰기 횟수를 줄이고 블록 정렬 최적화를 할 수 있습니다.

요약

  • 지연 쓰기(Delayed Write)*는 데이터를 메모리 캐시에 임시 저장하고, 나중에 배치로 디스크에 기록하는 방식입니다. 이를 통해 디스크 I/O를 최적화하고 시스템 성능을 높일 수 있습니다.
  • 배치 작업은 여러 개의 쓰기 작업을 모아서 한 번에 디스크에 기록하는 것으로, 디스크 접근 빈도를 줄이고 성능을 향상시킵니다.
  • 그러나 데이터 무결성전원 장애와 같은 문제가 발생할 수 있어, 중요 데이터에 대해서는 명시적인 동기화가 필요합니다.

지연 쓰기는 시스템 성능을 높이는 데 중요한 기술이지만, 데이터 안전성을 보장하기 위해 적절한 동기화 메커니즘을 함께 사용해야 합니다.