ZFS

아래는 ZFS (Zettabyte File System)에서 사용되는 각 함수와 그 역할에 대한 상세한 설명입니다. 이러한 함수는 ZFS 코드베이스의 일부이며, 특정 ZFS 버전 및 구현에 따라 상세 내용이 다를 수 있습니다.

  1. zfs_write: 이 함수는 ZFS VFS 레이어의 일부로, ZFS 데이터셋 내의 파일에 대한 쓰기 요청을 처리합니다. 실제 데이터 쓰기 작업을 수행하기 위해 ZPL (ZFS Posix Layer) 및 하위 레이어와 상호 작용합니다.

  2. zio_write: ZFS의 ZIO 레이어는 I/O 작업을 처리하며, zio_write는 아마도 이 레이어 내에서 쓰기 작업을 처리하는 함수입니다. I/O 요청, 데이터 캐싱, 디스크 쓰기 등을 조정합니다.

  3. zvol_write: ZVOL은 ZFS에서 관리되는 블록 장치로, zvol_write는 ZVOL에 대한 쓰기 작업을 처리합니다. 이 함수는 블록 수준의 쓰기를 관리하기 위해 ZVOL 레이어 및 ZIO 레이어와 상호 작용합니다.

  4. zpl_aio_write: ZFS Posix 레이어(ZPL)는 POSIX 호환 파일 시스템 기능을 제공하는 ZFS의 구성 요소입니다. zpl_aio_write는 아마도 ZPL 내에서 비동기 I/O 쓰기 작업을 처리하며, ZFS가 POSIX 스타일 I/O 호출을 수행하는 응용 프로그램과 상호 작용합니다.

  5. zio_ddt_write: 이 함수는 ZFS 중복 제거 테이블(DDT)과 관련된 데이터 구조와 관련된 쓰기 작업을 관리하는 역할을 할 수 있습니다.

  6. zfs_file_write: 이 함수는 ZFS VFS 레이어의 일부로, ZFS 데이터셋 내의 일반 파일에 대한 쓰기 작업을 처리합니다. 실제 쓰기 작업을 수행하기 위해 ZPL 및 ZIO와 상호 작용합니다.

  7. zfs_file_pwrite: zfs_file_write와 유사하게 파일에 쓰기 작업을 처리하지만 특히 위치 기반(pread) 쓰기 작업을 다룹니다. 데이터를 파일 내에서 지정한 오프셋에 쓸 수 있도록 합니다.

  8. do_write: do_write 함수는 아마도 VFS 레이어의 일부이며 파일 쓰기 작업을 위한 일반적인 시스템 호출 진입 지점입니다. 주로 zfs_write와 같은 ZFS 특정 쓰기 함수와 상호 작용합니다.

  9. arc_write: ARC (Adaptive Replacement Cache)는 ZFS의 캐싱 메커니즘입니다. arc_write 함수는 아마도 ARC 캐시에서 읽기 및 쓰기 성능을 최적화하기 위해 데이터를 읽고 쓰는 작업을 관리합니다.

  10. dbuf_write: ZFS 데이터 버퍼 (dbuf)는 메모리 내 데이터를 관리하기 위해 사용됩니다. dbuf_write 함수는 이러한 버퍼에 데이터를 쓰기를 처리하며 효율적인 읽기 및 쓰기 작업을 용이하게합니다.

  11. dmu_write: DMU (Data Management Unit)는 데이터 관리의 핵심 구성 요소로 dmu_write 함수는 데이터의 저수준 쓰기 작업을 처리하며 일반적으로 ZIO 레이어와 상호 작용합니다.

이러한 함수는 ZFS 코드베이스의 중요한 부분이며 I/O, 데이터 캐싱 및 데이터 무결성과 같은 여러 측면을 관리하는 데 필수적입니다. 이러한 함수의 구체적인 세부 정보는 ZFS 구현 및 버전에 따라 다를 수 있으며 파일 시스템의 복잡성으로 인해 코드가 상당히 방대할 수 있습니다. 함수의 기능을 정확하게 이해하려면 작업 중인 ZFS 구현의 소스 코드를 검토해야 합니다.


중복 제거 (Deduplication)가 ZFS에서 수행되는 경우, 데이터 쓰기 작업은 다음과 같은 일반적인 순서로 진행될 수 있습니다:

  1. zfs_write 또는 zpl_aio_write: 사용자가 파일 시스템에 데이터를 쓰려고 할 때 ZFS VFS 레이어에서 데이터 쓰기 요청이 시작됩니다. 이 함수는 파일 시스템의 상위 레이어에서 쓰기 요청을 처리하고 중복 데이터의 쓰기를 검토합니다.

  2. zio_write 또는 zvol_write: ZFS의 ZIO 레이어에서 실제 데이터 쓰기 작업이 처리됩니다. 이 단계에서 ZIO 레이어는 데이터를 캐싱하고 디스크에 쓰기 작업을 조정합니다.

  3. zio_ddt_write: 중복 제거 테이블 (DDT)이 사용되는 경우, 이 단계에서 중복 데이터가 식별되고 중복 데이터 테이블에 업데이트됩니다. 중복 데이터를 제거하고 중복 데이터 테이블을 업데이트하여 중복 제거 효과를 달성합니다.

  4. dmu_write: 데이터 관리 유닛 (DMU)은 데이터 블록의 실제 쓰기 작업을 관리합니다. 중복 데이터가 식별되면 중복 제거 후 쓰기 작업이 수행됩니다.

  5. arc_write: 데이터의 일부는 ARC (Adaptive Replacement Cache)에 캐시될 수 있습니다. 중복 데이터의 캐싱 및 쓰기 작업은 ARC 캐시에 영향을 미칠 수 있으며 데이터의 읽기 및 쓰기 성능을 최적화합니다.

  6. dbuf_write: 데이터 버퍼 (dbuf)는 메모리 내 데이터 관리를 처리하며, 중복 제거 후의 데이터 블록 쓰기 작업은 DBUF를 통해 캐시되고 관리됩니다.

  7. wfi_write 또는 efi_write: 마지막으로, 특정 구현에서 사용하는 함수가 중복 데이터 쓰기 작업을 완료하고 마무리할 수 있습니다.

중복 제거는 ZFS에서 저장 용량을 최적화하는 중요한 기능 중 하나입니다. 중복 데이터가 발견되면 중복 데이터 테이블을 업데이트하고 중복 데이터를 실제로 디스크에 저장하지 않으므로 저장 용량을 절약할 수 있습니다. 하지만 중복 제거는 추가 계산 작업이 필요하므로 성능 측면에서도 고려해야 합니다. ZFS는 중복 제거를 효율적으로 수행하기 위한 다양한 최적화 기능을 제공합니다.


중복 제거 (Deduplication) 프로세스는 ZFS 파일 시스템의 다양한 레이어와 함수 간에 협력적으로 작동하며 데이터의 중복을 제거하고 중복 제거 테이블을 업데이트합니다. 다음은 중복 제거 과정의 일반적인 단계와 설명입니다:

  1. 처음에는 ZPL의 zfs_write를 수행합니다:
  • 사용자가 파일 시스템에 데이터를 쓰려고 하면 ZFS VFS 레이어에서 데이터 쓰기 요청이 시작됩니다.
  • 이 함수는 파일 시스템의 상위 레이어에서 쓰기 요청을 처리합니다.
    1. 그다음에는 ZIO 레이어에서 zio_write를 수행합니다:
  • ZIO 레이어는 I/O 작업을 처리하며 실제 데이터 쓰기 작업을 관리합니다.
  • 데이터의 캐싱, 디스크로의 쓰기 작업 및 데이터 무결성 관리를 수행합니다.
    1. ZIO에서 중복 데이터 확인 (중복 데이터 식별):
  • ZIO 레이어에서 중복 데이터를 확인하기 위한 작업을 수행합니다. 이 과정에서 중복된 데이터 블록을 식별합니다.
    1. DMU에서 중복 데이터 쓰기 및 업데이트:
  • 중복 데이터가 확인되면 DMU (Data Management Unit) 레이어에서 중복 데이터를 처리합니다.
  • 중복된 데이터 블록은 디스크에 실제로 쓰지 않고 중복 제거가 수행됩니다.
  • 중복 제거 테이블 (DDT)이 업데이트되어 중복 데이터의 매핑 정보를 유지하고 새로운 데이터 블록에 대한 중복 데이터 확인을 위해 업데이트됩니다.
    1. ARC에서 캐싱 및 성능 최적화:
  • 중복 제거 후, 중복 데이터가 캐시될 수 있습니다. ARC (Adaptive Replacement Cache)는 데이터의 캐시 및 성능 최적화를 처리합니다.
    1. 데이터 버퍼 (dbuf)에서 데이터 관리:
  • 중복 제거된 데이터는 데이터 버퍼 (dbuf)로 캐시될 수 있습니다. dbuf는 메모리 내 데이터를 관리합니다.
    1. 쓰기 완료 및 마무리:
  • 마지막으로, 중복 데이터 제거 및 관련 작업이 완료됩니다.

중복 제거는 저장 공간을 최적화하는 데 중요한 역할을 합니다. 중복된 데이터를 제거하고 중복 제거 테이블을 업데이트하여 중복 데이터를 효과적으로 관리합니다. 이러한 프로세스는 데이터 무결성과 성능을 유지하면서 중복 데이터의 관리를 가능하게 합니다.


  1. ZPL (ZFS Posix Layer):
  • 사용자가 데이터를 파일 시스템에 쓰려고 할 때, ZPL 레이어에서 zfs_write 함수가 호출됩니다.
  • ZPL은 파일 시스템의 사용자 공개 API를 제공하고 POSIX 파일 시스템 기능을 구현합니다.
    1. ZIO (ZFS I/O) 레이어:
  • ZPL에서의 쓰기 요청은 ZIO 레이어로 전달됩니다.
  • ZIO는 데이터의 쓰기 및 읽기 작업을 관리하며 중복 데이터의 확인 및 관리가 시작됩니다.
  • zio_write 함수가 여기서 사용됩니다.
    1. SPA (Storage Pool Allocator):
  • SPA 레이어는 스토리지 풀을 관리하고 스토리지 디바이스와의 상호 작용을 처리합니다.
  • SPA는 데이터 블록의 할당과 해제를 관리하며 중복 제거와는 직접적인 관련이 없습니다.
    1. ZVOL (ZFS Volume) 레이어:
  • ZVOL은 ZFS에서 관리되는 블록 수준 가상 볼륨을 나타냅니다.
  • 중복 데이터가 중복 제거될 때, ZVOL은 중복된 데이터 블록을 관리하고 쓰기 요청을 받습니다.
    1. DMU (Data Management Unit):
  • ZIO에서 중복 데이터가 확인되면 DMU 레이어로 전달됩니다.
  • DMU는 데이터 관리와 중복 데이터 관리를 처리하며 zio_ddt_write 함수를 통해 중복 데이터를 관리하고 중복 데이터 테이블을 업데이트합니다.
  • dmu_write 함수를 통해 데이터의 쓰기 작업을 관리합니다.
    1. ARC (Adaptive Replacement Cache):
  • 중복 데이터의 일부는 ARC 캐시에 캐싱될 수 있으며, ARC는 데이터의 캐싱 및 캐시 관리를 처리합니다.
    1. DBUF (Data Buffer):
  • 데이터 버퍼 (dbuf)는 중복 제거된 데이터의 관리와 캐싱을 처리합니다.
    1. 쓰기 완료 및 마무리:
  • 마지막으로, 중복 데이터 제거 및 관련 작업이 완료됩니다. 이 단계는 wfi_write 또는 다른 적절한 함수를 통해 마무리될 수 있습니다.

SPA 레이어는 주로 스토리지 풀의 할당과 해제를 관리하고, ZVOL 레이어는 블록 수준 가상 볼륨의 관리를 처리합니다. 이러한 레이어는 중복 데이터 확인과 관련이 없으며 주로 데이터 블록의 할당 및 관리 역할을 수행합니다.

ZFS Process 설명

  1. zswap-shrink:
  • zswap은 컴퓨터의 메모리 압축을 담당하는 커널 기능입니다. zswap-shrink 프로세스는 압축된 메모리를 관리하고 축소하는 작업을 수행할 수 있습니다.
    1. zvol:
  • zvol은 ZFS의 블록 장치(Volume)를 나타냅니다. 이 프로세스는 ZFS 블록 장치와 관련된 작업을 처리할 수 있습니다.
    1. z_vdev_file:
  • z_vdev_file는 ZFS에서 사용되는 가상 디바이스(File VDev)에 대한 작업을 담당합니다. 이것은 주로 파일을 기반으로 한 스토리지를 의미합니다.
    1. z_null_iss, z_null_int, z_rd_iss, z_rd_int_0, z_rd_int_1, z_wr_iss, 등:
  • 이러한 프로세스들은 ZFS의 다양한 I/O 작업을 담당합니다. rd는 Read(읽기), wr는 Write(쓰기) 작업을 나타내고, iss와 int는 각각 Issue(발행)와 Interrupt(인터럽트)를 나타냅니다. 각 프로세스는 특정 유형의 I/O 작업을 처리합니다.
    1. z_ioctl_iss, z_ioctl_int:
  • 이 프로세스들은 ZFS의 I/O Control 작업을 담당합니다. 주로 입출력과 관련된 컨트롤을 처리합니다.
    1. z_trim_iss, z_trim_int:
  • z_trim은 TRIM 작업을 나타냅니다. TRIM은 미사용 블록을 표시하여 스토리지 디바이스에게 해당 블록을 초기화할 수 있음을 알리는 작업입니다.
    1. z_zvol, z_prefetch, z_upgrade:
  • 각각은 ZFS의 특정 기능을 수행하는 프로세스로 추정됩니다. z_zvol은 ZFS 블록 장치와 관련된 작업을 수행할 것으로 예상됩니다.
    1. dp_zil_clean_ta:
  • 이 프로세스들은 ZFS Intent Log (ZIL) 관리와 관련이 있을 것으로 보입니다. ZIL은 파일 시스템의 트랜잭션 로그를 나타냅니다.
    1. z_unlinked_drai, z_wr_iss, z_wr_int_0, z_wr_int_1:
  • 다양한 ZFS I/O 작업을 담당하는 프로세스입니다. 이름에서 읽을 수 있듯이, Write(쓰기)와 Unlinked(삭제된) 데이터 관리와 관련이 있을 것으로 보입니다.
    1. z_livelist_dest, z_livelist_cond:
  • 이 프로세스들은 ZFS의 Livelist 관련 작업을 담당합니다. Livelist는 파일 시스템의 라이브 데이터와 관련된 메커니즘입니다.

일반적으로 ZFS에서 I/O를 담당하는 핵심 프로세스는 z_rd_issz_rd_intz_wr_issz_wr_intz_ioctl_issz_ioctl_int, 등이며, 그 외의 프로세스들은 특정 기능이나 작업을 담당하는 것으로 예상됩니다. 이 프로세스들의 동작은 ZFS의 버전 및 설정에 따라 달라질 수 있습니다.


참고