NFS Azure 파일 공유에 대한 성능 향상
이 문서에서는 NFS(네트워크 파일 시스템) Azure 파일 공유의 성능을 향상시키는 방법을 설명합니다.
적용 대상
파일 공유 유형 | SMB | NFS |
---|---|---|
표준 파일 공유(GPv2), LRS/ZRS | ||
표준 파일 공유(GPv2), GRS/GZRS | ||
프리미엄 파일 공유(FileStorage), LRS/ZRS |
읽기 처리량을 향상시키기 위해 미리 읽기 크기 늘리기
Linux의 read_ahead_kb
커널 매개 변수는 순차적 읽기 작업 중에 "미리 읽기" 또는 프리페치해야 하는 데이터의 양을 나타냅니다. 5.4 이전의 Linux 커널 버전은 읽기 버퍼 크기에 대한 클라이언트 쪽 탑재 옵션을 나타내는 탑재된 파일 시스템의 rsize
에 15배에 해당하는 미리 읽기 값을 설정합니다. 이렇게 하면 대부분의 경우 클라이언트 순차 읽기 처리량을 향상시킬 수 있을 만큼 미리 읽기 값이 높게 설정됩니다.
그러나 Linux 커널 버전 5.4부터 Linux NFS 클라이언트는 기본 read_ahead_kb
값인 128KiB를 사용합니다. 이 작은 값은 대용량 파일의 읽기 처리량을 줄일 수 있습니다. 읽기 전 값이 더 큰 Linux 릴리스에서 128KiB 기본값을 사용하는 릴리스로 업그레이드하는 고객은 순차적 읽기 성능이 저하될 수 있습니다.
Linux 커널 5.4 이상의 경우 성능 향상을 위해 read_ahead_kb
를 15MiB로 영구적으로 설정하는 것이 좋습니다.
이 값을 변경하려면 Linux 커널 디바이스 관리자인 udev에 규칙을 추가하여 미리 읽기 크기를 설정합니다. 다음 단계를 수행합니다.
텍스트 편집기에서 다음 텍스트를 입력하고 저장하여 /etc/udev/rules.d/99-nfs.rules 파일을 만듭니다.
SUBSYSTEM=="bdi" \ , ACTION=="add" \ , PROGRAM="/usr/bin/awk -v bdi=$kernel 'BEGIN{ret=1} {if ($4 == bdi) {ret=0}} END{exit ret}' /proc/fs/nfsfs/volumes" \ , ATTR{read_ahead_kb}="15360"
콘솔에서 udevadm 명령을 슈퍼 사용자로 실행하고 규칙 파일 및 기타 데이터베이스를 다시 로드하여 udev 규칙을 적용합니다. udev가 새 파일을 인식하도록 하려면 이 명령을 한 번만 실행하면 됩니다.
sudo udevadm control --reload
Nconnect
Nconnect
은(는) 클라이언트와 NFSv4.1용 Azure Premium Files 서비스 간에 더 많은 TCP(Transmission Control Protocol) 연결을 사용할 수 있도록 하여 대규모 성능을 향상시키는 클라이언트 쪽 Linux 탑재 옵션입니다.
nconnect
의 이점
nconnect
를 사용하면 더 적은 수의 클라이언트 머신을 사용하여 성능을 크게 개선함으로써 총 소유 비용(TCO)을 줄일 수 있습니다. Nconnect
는 단일 또는 여러 클라이언트를 사용하고 하나 이상의 NIC에서 여러 TCP 채널을 사용하여 성능을 향상합니다. nconnect
를 사용하지 않을 경우 가장 큰 프리미엄 Azure 파일 공유 프로비전 크기에서 제공하는 대역폭 스케일링 제한(10GiB/s)을 달성하려면 약 20대의 클라이언트 머신이 필요합니다. nconnect
을(를) 사용하면 6~7개 클라이언트만 사용하여 이러한 제한을 달성할 수 있으며, IOPS(초당 I/O 작업 수) 및 처리량을 크게 향상하면서 컴퓨팅 비용을 거의 70% 절감할 수 있습니다. 다음 데이블을 참조하세요.
메트릭(작업) | I/O 크기 | 성능 향상 |
---|---|---|
IOPS(쓰기) | 64K, 1024K | 3x |
IOPS(읽기) | 모든 I/O 크기 | 2~4배 |
처리량(쓰기) | 64K, 1024K | 3x |
처리량(읽기) | 모든 I/O 크기 | 2~4배 |
필수 조건
- 최신 Linux 배포판은
nconnect
를 완벽하게 지원합니다. 이전 Linux 배포의 경우 Linux 커널 버전이 5.3 이상인지 확인합니다. - 탑재당 구성은 프라이빗 엔드포인트를 통해 스토리지 계정당 단일 파일 공유를 사용하는 경우에만 지원됩니다.
nconnect
의 성능 영향
대규모 Linux 클라이언트에서 NFS Azure 파일 공유와 함께 nconnect
탑재 옵션을 사용할 때 다음과 같은 성능 결과를 달성했습니다. 이러한 결과를 달성하는 방법에 대한 자세한 내용은 성능 테스트 구성을 참조하세요.
nconnect
에 대한 권장 사항
nconnect
에서 최상의 결과를 얻으려면 다음 권장 사항을 따르세요.
nconnect=4
설정
Azure Files는 최대 설정인 16까지 nconnect
설정을 지원하지만 최적의 설정인 nconnect=4
로 탑재 옵션을 구성하는 것이 좋습니다. 현재 nconnect
의 Azure Files 구현을 위한 채널을 4개 이상 설정하는 것은 이득은 없습니다. 실제로 단일 클라이언트에서 단일 Azure 파일 공유 채널이 4개를 초과하면 TCP 네트워크 포화로 인해 성능에 부정적인 영향을 줄 수 있습니다.
신중하게 가상 머신 크기 조정
워크로드 요구 사항에 따라 예상 네트워크 대역폭에 의해 제한되지 않도록 클라이언트 VM(가상 머신)의 크기를 올바르게 조정해야 합니다. 예상된 네트워크 처리량을 달성하기 위해 여러 NIC(네트워크 인터페이스 컨트롤러)가 필요하지 않습니다. Azure Files에서 범용 VM을 사용하는 것이 일반적이지만 워크로드 요구 사항 및 지역 가용성에 따라 다양한 VM 유형을 사용할 수 있습니다. 자세한 내용은 Azure VM 선택기를 참조하세요.
큐 깊이를 64보다 작거나 같게 유지
큐 깊이는 스토리지 리소스가 서비스할 수 있는 보류 중인 I/O 요청 수입니다. 더 이상 성능 향상이 표시되지 않으므로 최적 큐 깊이인 64를 초과하지 않는 것이 좋습니다. 자세한 내용은 큐 깊이를 참조하세요.
Nconnect
탑재당 구성
워크로드에서 단일 클라이언트와 다른 nconnect
설정이 포함된 하나 이상의 스토리지 계정으로 여러 공유를 탑재해야 하는 경우 퍼블릭 엔드포인트를 통해 탑재할 때 이러한 설정이 유지된다고 보장할 수 없습니다. 탑재당 구성은 시나리오 1에 설명된 대로 프라이빗 엔드포인트를 통해 스토리지 계정당 단일 Azure 파일 공유를 사용하는 경우에만 지원됩니다.
시나리오 1: 여러 스토리지 계정이 있는 프라이빗 엔드포인트를 통해 탑재당 구성 nconnect
(지원됨)
- StorageAccount.file.core.windows.net = 10.10.10.10
- StorageAccount2.file.core.windows.net = 10.10.10.11
Mount StorageAccount.file.core.windows.net:/StorageAccount/FileShare1 nconnect=4
Mount StorageAccount2.file.core.windows.net:/StorageAccount2/FileShare1
시나리오 2: 퍼블릭 엔드포인트를 통해 탑재당 구성 nconnect
(지원되지 않음)
- StorageAccount.file.core.windows.net = 52.239.238.8
- StorageAccount2.file.core.windows.net = 52.239.238.7
Mount StorageAccount.file.core.windows.net:/StorageAccount/FileShare1 nconnect=4
Mount StorageAccount.file.core.windows.net:/StorageAccount/FileShare2
Mount StorageAccount2.file.core.windows.net:/StorageAccount2/FileShare1
참고 항목
스토리지 계정이 다른 IP 주소로 확인되더라도 퍼블릭 엔드포인트가 정적 주소가 아니므로 해당 주소가 유지된다고 보장할 수 없습니다.
시나리오 3: 단일 스토리지 계정에 여러 공유가 있는 프라이빗 엔드포인트를 통해 탑재당 구성 nconnect
(지원되지 않음)
- StorageAccount.file.core.windows.net = 10.10.10.10
Mount StorageAccount.file.core.windows.net:/StorageAccount/FileShare1 nconnect=4
Mount StorageAccount.file.core.windows.net:/StorageAccount/FileShare2
Mount StorageAccount.file.core.windows.net:/StorageAccount/FileShare3
성능 테스트 구성
다음 리소스 및 벤치마킹 도구를 사용하여 이 문서에 설명된 결과를 달성하고 측정했습니다.
- 단일 클라이언트: 단일 NIC를 사용하여 Azure VM( DSv4-시리즈)
- OS: Linux(Ubuntu 20.40)
- NFS 스토리지: Azure Files 프리미엄 파일 공유(프로비전된 30TiB,
nconnect=4
설정)
크기 | vCPU | 메모리 | 임시 스토리지(SSD) | 최대 데이터 디스크 수 | 최대 NIC 수 | 예상 네트워크 대역폭 |
---|---|---|---|---|---|---|
Standard_D16_v4 | 16 | 64GiB | 원격 스토리지 전용 | 32 | 8 | 12,500Mbps |
벤치마킹 도구 및 테스트
FIO(Flexible I/O Tester) 벤치마크 및 스트레스/하드웨어 검증에 사용되는 무료 오픈 소스 디스크 I/O 도구를 사용했습니다. FIO를 설치하려면 FIO 추가 정보 파일의 이진 파일 패키지 섹션을 따라 선택한 플랫폼용으로 설치합니다.
이러한 테스트는 임의 I/O 액세스 패턴에 중점을 두지만 순차 I/O를 사용할 때도 비슷한 결과를 얻을 수 있습니다.
높은 IOPS: 100% 읽기
4k I/O 크기 - 임의 읽기 - 64 큐 깊이
fio --ioengine=libaio --direct=1 --nrfiles=4 --numjobs=1 --runtime=1800 --time_based --bs=4k --iodepth=64 --filesize=4G --rw=randread --group_reporting --ramp_time=300
8k I/O 크기 - 임의 읽기 - 64 큐 깊이
fio --ioengine=libaio --direct=1 --nrfiles=4 --numjobs=1 --runtime=1800 --time_based --bs=8k --iodepth=64 --filesize=4G --rw=randread --group_reporting --ramp_time=300
높은 처리량: 100% 읽기
64k I/O 크기 - 임의 읽기 - 64 큐 깊이
fio --ioengine=libaio --direct=1 --nrfiles=4 --numjobs=1 --runtime=1800 --time_based --bs=64k --iodepth=64 --filesize=4G --rw=randread --group_reporting --ramp_time=300
1024k I/O 크기 - 100% 임의 읽기 - 64 큐 깊이
fio --ioengine=libaio --direct=1 --nrfiles=4 --numjobs=1 --runtime=1800 --time_based --bs=1024k --iodepth=64 --filesize=4G --rw=randread --group_reporting --ramp_time=300
높은 IOPS: 100% 쓰기
4k I/O 크기 - 100% 임의 쓰기 - 64 큐 깊이
fio --ioengine=libaio --direct=1 --nrfiles=4 --numjobs=1 --runtime=1800 --time_based --bs=4k --iodepth=64 --filesize=4G --rw=randwrite --group_reporting --ramp_time=300
8k I/O 크기 - 100% 임의 쓰기 - 64 큐 깊이
fio --ioengine=libaio --direct=1 --nrfiles=4 --numjobs=1 --runtime=1800 --time_based --bs=8k --iodepth=64 --filesize=4G --rw=randwrite --group_reporting --ramp_time=300
높은 처리량: 100% 쓰기
64k I/O 크기 - 100% 임의 쓰기 - 64 큐 깊이
fio --ioengine=libaio --direct=1 --nrfiles=4 --numjobs=1 --runtime=1800 --time_based --bs=64k --iodepth=64 --filesize=4G --rw=randwrite --group_reporting --ramp_time=300
1024k I/O 크기 - 100% 임의 쓰기 - 64 큐 깊이
fio --ioengine=libaio --direct=1 --nrfiles=4 --numjobs=1 --runtime=1800 --time_based --bs=1024k --iodepth=64 --filesize=4G --rw=randwrite --group_reporting --ramp_time=300
nconnect
에 대한 성능 고려 사항
nconnect
탑재 옵션을 사용하는 경우 다음과 같은 특징이 있는 워크로드를 면밀히 평가해야 합니다.
- 단일 스레드이거나 낮은 큐 깊이(16 미만)를 사용하는 대기 시간이 중요한 쓰기 워크로드
- 작은 I/O 크기와 함께 단일 스레드이거나 낮은 큐 깊이를 사용하는 대기 시간 중요한 읽기 워크로드
모든 워크로드에 대규모 IOPS 또는 전체 성능이 필요한 것은 아닙니다. 소규모 워크로드의 경우 nconnect
는 의미가 없을 수 있습니다. 다음 표를 사용하여 nconnect
(이)가 워크로드에 유리한지 여부를 결정합니다. 녹색으로 강조 표시된 시나리오는 권장되지만 빨간색으로 강조 표시된 시나리오는 권장되지 않습니다. 노란색으로 강조 표시된 시나리오는 중립적입니다.