Skip to main content

XFS 파일시스템에서 데이터 폴더별 용량 제한 기능 사용하기

· 15 min read
박종현

Backend.AI에서는 컨테이너를 활용하여 사용자별로 격리된 연산 환경(연산 세션)을 제공하고 있습니다. 일반적으로, 컨테이너의 파일시스템은 읽기만 가능한 계층과 쓰기 가능한 계층(writable container layer)으로 구분되어 있고, 컨테이너 사용자가 생성한 파일은 모두 쓰기 가능한 계층에 저장됩니다. 하지만, 쓰기 가능한 계층에 생성된 파일은 컨테이너가 삭제되면 함께 사라지는 문제가 있습니다. 이 문제는 컨테이너 생성 시 호스트 파일시스템의 특정 디렉터리를 마운트하고, 마운트 된 디렉터리에 데이터를 저장함으로써 해결할 수 있습니다. 외부에서 마운트된 디렉터리는 컨테이너의 수명 주기와 상관없이 독립적으로 존재하기 때문입니다.

Backend.AI 에서도 "스토리지 폴더" 또는 "데이터 폴더"라 불리는 마운트 폴더를 관리할 수 있는 기능을 제공하고 있습니다. 컨테이너 및 Backend.AI에서 외부 마운트 폴더를 관리하는 방식에 관해서는 Backend.AI의 자동마운트 폴더 기능 활용하기에서 보다 자세하게 다룬 바가 있습니다.

제한된 연산 인프라를 효율적으로 운영해야 하는 관리자 입장에서는 데이터 폴더별 최대 용량을 제한하고 싶을 수 있습니다. 보유하고 있는 디스크 용량 대비 사용자가 많거나 대규모 데이터를 다루는 경우, 별도의 용량 제한을 두지 않는다면 디스크 가용량이 금방 소진될 것이기 때문입니다.

데이터 폴더를 대상으로 발생하는 모든 파일 I/O 요청과 이벤트를 모니터링하고 메타 정보로 관리 추가 계층을 만든다면 모든 경우에 적용할 수 있는 폴더별 가용량 제한이 가능합니다. 하지만 파일 입출력에 관한 오버헤드가 지나치게 커지는 문제 때문에 일반적으로 적용하기는 어렵습니다. 특히, 머신러닝 데이터와 같이 대량의 파일을 다루는 연산의 경우 전체 연산 성능을 크게 떨어뜨리는 원인이 될 것입니다. 따라서, Backend.AI에서는 파일시스템 또는 스토리지 계층에서 가용량 제한을 제공하는 때에만 데이터 폴더별 가용량 제한 기능을 제공하고 있습니다.

이번 글에서는 XFS1 파일시스템 상에서 Backend.AI 데이터 폴더의 가용량을 설정하고 활용하는 방법에 관해 알아보겠습니다. GUI 상에서 Backend.AI를 통해 가용량 제한 기능을 적용하는 부분에 관심이 있으시다면 서버 쪽 준비 과정은 건너뛰고 바로 Backend.AI GUI를 통한 폴더별 용량 제한 기능 활용 섹션으로 이동하셔도 좋습니다.

XFS 파일시스템 준비

XFS를 통해 데이터 폴더별 가용량을 제한하기 위해서는 당연히 XFS로 포맷된 디스크 장치가 필요합니다. 테스트만 하려는 경우에는 루프백(loopback) 디스크 장치2를 설정할 수도 있습니다. /vfroot/xfs_quota 위치에 XFS로 포맷된 루프백 장치를 마운트 하기 위해서는 다음과 같은 명령을 실행하면 됩니다.

# 마운트할 대상 디렉터리 생성
sudo mkdir -p /vfroot/xfs_quota
# 1 GB 크기의 파일을 생성
sudo dd if=/dev/zero of=xfs_test.img bs=1M count=1024
# 파일을 XFS로 포맷
mkfs.xfs xfs_test.img
# pquota 옵션을 붙여 루프백 장치를 /vfroot/xfs_quota에 마운트
sudo mount -o loop,rw xfs_test.img -o pquota /vfroot/xfs_quota

Backend.AI에서 XFS 상 폴더 용량 제한 기능은 XFS의 프로젝트 쿼타(quota) 옵션을 통해 구현하고 있습니다. XFS에서 프로젝트 쿼타 기능을 활성화하기 위해서는 마운트할 때 -o pquota 옵션을 붙여주어야 합니다. 정상적으로 명령이 실행되었다면 /vfroot/xfs_quota 디렉터리는 프로젝트 쿼타 기능이 활성화된 총 용량 1 GiB의 XFS 파일시스템이 되었습니다.

note

루트 파일시스템에서 프로젝트별 용량 제한 기능을 켜기 위해서는 pquota 마운트 플래그가 rootflags 부트 파라미터에 설정되어야 합니다. Backend.AI 운영을 위해서는 OS 파티션과 데이터 파티션을 분리하는 것을 권장하므로 이 방법은 권장되지 않습니다.

이후 마운트 장치를 제거하려면 다음 명령을 실행하면 됩니다.

sudo umount /vfroot/xfs_quota
sudo rm xfs_test.img

Storage-Proxy 백엔드 설정

Backend.AI에는 데이터 폴더 관리 및 파일 I/O 처리 요청을 담당하는 Storage-Proxy 라는 독립 서비스가 있습니다. Storage-Proxy는 다양한 스토리지 및 파일시스템별 특성과 특화 기능에 유연하게 대응하기 위해 플러그인 형태의 스토리지 백엔드를 지원하고 있습니다. 아무런 백엔드가 지정되지 않을 경우 일반적인 파일시스템으로 인식하여 작동하지만, 특정한 백엔드를 설정할 경우 해당 스토리지 또는 파일시스템이 지원하는 고성능 API 및 특화 기능을 활용할 수 있습니다3. 따라서, XFS에서 제공하는 디스크 용량 제한 기능을 Backend.AI 상에서 활용하기 위해서는 Storage-Proxy에서 xfs 백엔드를 설정해야 합니다.

Storage-Proxy를 포함한 Backend.AI 플랫폼을 설치하고 운영하는 방법은 Backend.AI 메타 저장소를 참고하시기 바랍니다.

note

XFS의 프로젝트 쿼타 정보를 조회하고 수정하기 위해서는 root 권한이 필요합니다. 따라서, Storage-Proxy 서비스 또한 root 권한으로 동작해야 합니다.

Storage-Proxy를 설치한 후 설정 파일(storage-proxy.toml)을 열고 다음과 같은 섹션을 추가해줍니다. backendvfs를 지정하면 일반적인 파일시스템을 사용한다는 의미입니다. 여기서는 xfs로 설정해서 Storage-Proxy의 XFS 백엔드를 사용하도록 합니다. path에는 XFS 장치가 마운트 된 경로를 지정하면 됩니다.

[volume.xfs_quota]
backend = "xfs"
path = "/vfroot/xfs_quota"

이후 Storage-Proxy 서비스를 재시작하면 Backend.AI 상에서 XFS 파일시스템을 사용할 준비가 끝납니다. 이제 GUI를 통해 XFS 용량 제한 기능을 사용하는 일만 남았습니다.

note

XFS의 프로젝트 쿼타 정보는 /etc/projects, /etc/projids 라는 두 개의 파일에 기록됩니다. Storage-Proxy에서도 이 파일을 통해 XFS 쿼타 기능과 상호작용하게 되므로, 두 파일이 삭제되거나 손상되지 않도록 주의해야 합니다. 주기적으로 파일을 백업해두는 것도 좋습니다.

Backend.AI GUI를 통한 폴더별 용량 제한 기능 활용

XFS 마운트와 Storage-Proxy 설정이 완료되면 관리자는 GUI 환경에서 편리하게 데이터 폴더별 용량 제한 기능을 사용할 수 있습니다. Backend.AI Control-Panel(관리자 UI)을 통해서는 사용자별 자원 정책 설정에서 폴더별 최대 저장 용량(Max Folder Size)을 설정할 수 있습니다. 아래 그림에서는 100 MiB로 설정해보았습니다. 이제 해당 자원 정책의 적용을 받는 사용자는 데이터 폴더 당 100 MiB 이상의 파일을 생성할 수 없게 됩니다. 이 가용량은 관리자가 언제든지 변경할 수 있습니다.

Figure 1. Control-Panel을 통해 사용자별 폴더 가용량 설정

실제로 확인해보기 위해 사용자 GUI로 로그인한 후 데이터 폴더를 하나 만들어 보았습니다. 폴더의 이름은 xfs-test-folder 입니다.

Figure 2. Web-UI를 통한 사용자 폴더 생성

데이터 폴더 리스트에서 생성한 폴더를 확인할 수 있습니다. 가용량에 100 MiB가 적용되어 있는 것도 알 수 있습니다.

Figure 3. 가용량이 제한된 데이터 폴더 생성

폴더를 마운트 하여 연산 세션을 실행하고 터미널 앱을 띄웠습니다. 마운트한 데이터 폴더인 /home/work/xfs-test-folder로 이동한 후 200 MiB 파일을 생성해보았습니다(bs=200M count=1).

Figure 4. 터미널에서 가용량 제한 폴더에 200 MiB 파일 생성을 시도하지만 실패

Figure 4.에서 확인할 수 있듯이 200 MiB 파일 생성을 시도하면 No space left on device 오류가 발생합니다. 생성된 실제 파일의 크기를 조회해보면 100 MiB 임을 알 수 있습니다. 자원 정책에서 설정한 가용량 제한이 잘 적용되고 있는 것입니다.

Figure 5. Web-UI 상 폴더 사용량 및 가용량 정보 확인

Web-UI에서 폴더 정보 버튼을 클릭해보면 폴더의 자세한 정보를 알 수 있습니다. "폴더 사용량" 항목을 보면 현재 사용량과 가용량을 확인할 수 있습니다.

이처럼 Backend.AI 관리자와 사용자는 XFS의 쿼타 구현 방식에 신경쓰지 않고 GUI를 통해 아주 간단한 방식으로 폴더별 가용량 제한 기능을 이용할 수 있습니다.

마무리

이번 글에서는 XFS 파일시스템 상에서 데이터 폴더별 가용량을 제한하는 방법에 관해 알아보았습니다. 서비스 단에서 몇 가지 준비를 해야하지만, 시스템 운영자가 한 번만 설정을 해두면 관리자와 사용자는 전용 UI를 통해 편리하게 가용량을 적용하고 조회할 수 있습니다.

XFS 뿐만 아니라 쿼타 기능을 지원하는 스토리지의 경우 Backend.AI Storage-Proxy의 백엔드 플러그인 개발을 통해 데이터 폴더 가용량을 제한할 수 있습니다. 실제로 래블업에서는 스토리지 파트너사와의 협력을 통해 전용 백엔드 플러그인 개발을 진행하고 있으며, 그 중 일부는 데이터 폴더 가용량 기능도 지원 가능할 것으로 예상합니다.


  1. XFS 64비트 저널링 파일시스템으로, RHEL (Redhat Enterprise Linux) 계열 운영체제의 기본 파일시스템입니다. XFS는 파일시스템 계층에서 사용자별, 프로젝트별 디스크 용량 제한(quota) 기능을 제공합니다.
  2. 어떤 파일시스템 상에 존재하는 파일 하나를 마치 하나의 디스크 장치처럼 인식시킨 가상의 장치입니다. 일반적으로 루프백 디스크 장치는 보안 및 성능 문제가 있을 수 있으므로 실 서버에서 사용은 권장하지 않습니다.
  3. 현재 Storage-Proxy가 지원하는 백엔드는 VFS (기본 백엔드), XFS, PureStorage, NetApp, CephFS 등이 있습니다.