FreeBSD 메모리 보고 및 ZFS ARC 캐시 이해

FreeBSD 메모리 보고 및 ZFS ARC 캐시 이해

FreeBSD의 메모리 보고 불일치

FreeBSD에서 메모리 보고는 각 시스템 모니터링 도구가 "사용 중"과 "사용 가능" 메모리를 정의하는 방식이 다르기 때문에 종종 일관되지 않게 보입니다. 이는 운영 체제가 가상 메모리(VM) 시스템을 관리하고 성능 최적화를 위해 디스크 캐시용 RAM을 활용하는 방식 때문입니다.

FreeBSD에서는 메모리가 여러 페이지 큐로 구분됩니다:

  • Active: 사용자 프로세스가 현재 사용 중인 페이지.
  • Inactive: 일정 시간 동안 접근되지 않은 페이지; 재사용 가능하며 시스템에 메모리가 필요하면 해제될 수 있습니다.
  • Laundry: 스와프로 기록될 대기 중인 페이지.
  • Wired: 커널이나 페이지 아웃될 수 없는 잠긴 프로세스가 사용하는 메모리. 이 카테고리에는 ZFS Adaptive Replacement Cache (ARC)도 포함됩니다.
  • Free: 완전히 사용되지 않은 메모리.

Inactive 페이지와 Wired 메모리의 일부(예: 디스크 캐시)는 커널에 의해 회수될 수 있기 때문에, 도구는 이를 "사용 중"으로 셀지 "여유"로 셀지를 결정해야 합니다.

메모리 사용량에서 ZFS ARC의 역할

대부분의 최신 FreeBSD 설치에서 기본 파일 시스템인 ZFS는 Adaptive Replacement Cache (ARC)를 사용해 최근에 사용된 데이터를 RAM에 저장합니다. 일반 커널 캐시와 달리 ARC는 전통적인 VM 시스템을 우회하며 "wired" 메모리 카테고리 안에 저장됩니다.

ARC는 시스템이 애플리케이션을 위해 더 많은 메모리를 요구할 때 자동으로 축소되도록 설계되었으므로 실질적으로 회수 가능합니다. 그러나 모니터링 도구가 단순히 "active"와 "wired" 메모리를 합산하면 ARC 캐시 때문에 실제 실행 중인 프로세스가 필요로 하는 것보다 훨씬 많은 RAM을 사용하고 있는 것처럼 보일 수 있습니다.

ARC 사용량을 정확히 추적하려면 관리자는 sysctl을 사용해 특정 커널 파라미터를 조회할 수 있습니다:

  • kstat.zfs.misc.arcstats.size: 현재 캐시 크기.
  • kstat.zfs.misc.arcstats.c_min: 최소 설정 캐시 크기.
  • kstat.zfs.misc.arcstats.c_max: 최대 설정 캐시 크기.

도구 히어리스틱 분석: btop, fastfetch, htop

각 도구는 메모리 사용량을 계산하는 공식이 달라 동일한 머신에서도 서로 다른 보고서를 제공합니다.

btop

역사적으로 btop은 단순 히어리스틱을 사용했습니다: used memory = active + wired. 이 방식은 ARC 캐시의 회수 가능성을 무시하고 Inactive 페이지를 고려하지 않기 때문에 FreeBSD에서는 종종 부정확합니다.

fastfetch

fastfetch는 보다 포괄적인 자유 메모리 정의를 사용합니다: free memory = free + inactive + cache. 따라서 used memory = total - free memory. 이는 일반적으로 사용 가능한 자원을 보다 낙관적으로 보여줍니다.

htop

htop은 메모리 카테고리를 별도로 표시하지만 사용 메모리를 다음과 같이 계산합니다: used memory = wired + active + laundry.

btop 메모리 보고의 주요 버그

btop 소스 코드(src/freebsd/btop_collect.cpp)를 조사한 결과 FreeBSD 사용자에게 영향을 주는 두 가지 중요한 문제가 발견되었습니다:

32비트 정수 오버플로우

btop은 메모리 페이지 수를 u_int(부호 없는 32비트 정수)로 저장했습니다. 페이지 수에 페이지 크기를 곱해 총 바이트를 계산할 때 4GiB(4,294,967,296 바이트)를 초과하는 값은 래핑됩니다. 예를 들어, 사용 중인 메모리가 4.42 GiB인 시스템이 이 정수 오버플로우 때문에 422 MiB만 사용 중인 것으로 보고될 수 있습니다.

레거시 캐시 보고

btopvm.stats.vm.v_cache_count에서 캐시 데이터를 가져오려 했지만, 이 sysctl 파라미터는 FreeBSD 12.0부터 "호환성을 위한 더미"이며 항상 0을 반환합니다. 실제 캐시 큐는 FreeBSD 6.3.0 이후 존재하지 않았습니다.

올바른 메모리 추적 구현

이러한 불일치를 해결하려면 메모리 모니터링 도구가 ZFS ARC와 FreeBSD 버퍼 캐시(vfs.bufspace)를 명시적으로 고려해야 합니다.

사용 메모리를 계산하는 수정된 논리는 다음과 같습니다:

  1. 전체 캐시 계산: vfs.bufspace와 ARC 캐시의 가변 부분(현재 크기에서 최소 크기를 뺀 값)을 합산합니다.
  2. 원시 사용량 계산: activewired 메모리를 합산합니다.
  3. 실제 사용량 계산: 계산된 캐시를 원시 사용량에서 빼서 구합니다: usedBytes = (cachedBytes < rawUsed) ? rawUsed - cachedBytes : 0.

이러한 개선 사항은 btopfastfetch(논리를 모든 ZFS 지원 시스템, Linux 및 NetBSD 포함으로 확장) 그리고 htop에 대한 풀 리퀘스트로 제출되어 FreeBSD 생태계 전반에 걸쳐 일관되고 정확한 메모리 보고를 보장합니다.


요약: FreeBSD 메모리 사용 보고가 btop, fastfetch와 같은 도구마다 왜 다른지 깊이 파고들어 ZFS Adaptive Replacement Cache(ARC)의 역할과 보고 도구의 정수 오버플로우 버그를 중심으로 설명합니다.

제목: FreeBSD 메모리 보고 및 ZFS ARC 캐시 이해

Sources