다음을 통해 공유


Linux 클라이언트에서 큰 디렉터리에 액세스할 때 파일 공유 성능 최적화

이 문서에서는 많은 수의 파일이 포함된 디렉터리 작업에 대한 권장 사항을 제공합니다. 일반적으로 여러 디렉터리에 파일을 분산하여 단일 디렉터리의 파일 수를 줄이는 것이 좋습니다. 그러나 큰 디렉터리를 피할 수 없는 상황이 있습니다. Linux 클라이언트에 탑재된 Azure 파일 공유에서 큰 디렉터리로 작업할 때 다음 제안을 고려합니다.

적용 대상

관리 모델 청구 모델 미디어 계층 중복성 중소기업 네트워크 파일 시스템 (NFS)
Microsoft.Storage (마이크로소프트 저장소) 프로비전된 v2 SSD(프리미엄) 로컬(LRS) 아니요 예
Microsoft.Storage (마이크로소프트 저장소) 프로비전된 v2 SSD(프리미엄) 영역(ZRS) 아니요 예
Microsoft.Storage (마이크로소프트 저장소) 프로비전된 v2 HDD(표준) 로컬(LRS) 아니요 아니요
Microsoft.Storage (마이크로소프트 저장소) 프로비전된 v2 HDD(표준) 영역(ZRS) 아니요 아니요
Microsoft.Storage (마이크로소프트 저장소) 프로비전된 v2 HDD(표준) 지역(GRS) 아니요 아니요
Microsoft.Storage (마이크로소프트 저장소) 프로비전된 v2 HDD(표준) GeoZone(GZRS) 아니요 아니요
Microsoft.Storage (마이크로소프트 저장소) 프로비전된 v1 SSD(프리미엄) 로컬(LRS) 아니요 예
Microsoft.Storage (마이크로소프트 저장소) 프로비전된 v1 SSD(프리미엄) 영역(ZRS) 아니요 예
Microsoft.Storage (마이크로소프트 저장소) 종량제 HDD(표준) 로컬(LRS) 아니요 아니요
Microsoft.Storage (마이크로소프트 저장소) 종량제 HDD(표준) 영역(ZRS) 아니요 아니요
Microsoft.Storage (마이크로소프트 저장소) 종량제 HDD(표준) 지역(GRS) 아니요 아니요
Microsoft.Storage (마이크로소프트 저장소) 종량제 HDD(표준) GeoZone(GZRS) 아니요 아니요

해시 버킷 수 늘리기

열거를 수행하는 시스템에 있는 총 RAM 양은 NFS 및 SMB와 같은 파일 시스템 프로토콜의 내부 작업에 영향을 줍니다. 사용자가 높은 메모리 사용량을 경험하지 않더라도 사용 가능한 메모리 양은 시스템에 있는 inode 해시 버킷의 수에 영향을 미치며, 이는 큰 디렉터리에 대한 열거형 성능에 영향을 주거나 향상시킵니다. 시스템이 대규모 열거형 워크로드 중에 발생할 수 있는 해시 충돌을 줄이기 위해 수행해야 하는 inode 해시 버킷 수를 수정할 수 있습니다.

inode 해시 버킷 수를 늘리려면 부팅 구성 설정을 수정합니다.

  1. 텍스트 편집기를 사용하여 파일을 편집합니다 /etc/default/grub .

    sudo vim /etc/default/grub
    
  2. /etc/default/grub 파일에 다음 텍스트를 추가합니다. 이 명령은 128MB를 inode 해시 테이블 크기로 설정하여 시스템 메모리 사용량을 최대 128MB 증가합니다.

    GRUB_CMDLINE_LINUX="ihash_entries=16777216"
    

    이미 있는 경우 GRUB_CMDLINE_LINUX 다음과 같이 공백으로 구분하여 추가 ihash_entries=16777216 합니다.

    GRUB_CMDLINE_LINUX="<previous commands> ihash_entries=16777216"
    
  3. 변경 내용을 적용하려면 다음을 실행합니다.

    sudo update-grub2
    
  4. 시스템을 다시 시작합니다.

    sudo reboot
    
  5. 다시 부팅한 후 변경 내용이 유효한지 확인하려면 커널 cmdline 명령을 확인합니다.

    cat /proc/cmdline
    

    표시되는 경우 ihash_entries 시스템에서 설정을 적용했으며 열거형 성능은 기하급수적으로 향상되어야 합니다.

    dmesg 출력을 확인하여 커널 cmdline이 적용되었는지 확인할 수도 있습니다.

    dmesg | grep "Inode-cache hash table"
    Inode-cache hash table entries: 16777216 (order: 15, 134217728 bytes, linear)
    

다음 탑재 옵션은 열거형과 관련이 있으며 큰 디렉터리로 작업할 때 대기 시간을 줄일 수 있습니다.

actimeo

actimeo 탑재 옵션은 클라이언트가 서버에서 특성 정보를 요청하기 전에 파일 또는 디렉터리의 특성을 캐시하는 시간(초)을 지정합니다. 이 기간 동안 서버에서 발생하는 변경 내용은 클라이언트가 서버를 다시 검사할 때까지 검색되지 않은 상태로 유지됩니다. SMB 클라이언트의 경우 기본 특성 캐시 시간 제한은 1초로 설정됩니다.

NFS 클라이언트에서 actimeo를 지정하면 모든 acregmin, acregmax, acdirmin, acdirmax가 동일한 값으로 설정됩니다. 지정되지 않은 경우 actimeo 클라이언트는 이러한 각 옵션에 대해 기본값을 사용합니다.

큰 디렉터리로 작업할 때는 actimeo 30초에서 60초 사이로 설정하는 것이 좋습니다. 이 범위의 값을 설정하면 특성이 클라이언트의 특성 캐시에서 더 오랜 기간 동안 유효하게 유지되므로 작업을 통해 파일을 가져오는 대신 캐시에서 파일 특성을 가져올 수 있습니다. 이렇게 하면 작업이 계속 실행되는 동안 캐시된 특성이 만료되는 상황에서 대기 시간을 줄일 수 있습니다.

다음 그래프는 기본 탑재를 사용하여 여러 작업을 완료하는 데 걸리는 총 시간과 단일 디렉터리에 1백만 개의 파일이 있는 워크로드의 actimeo 값을 30으로 설정하는 방법을 비교합니다. 테스트에서는 일부 작업의 총 완료 시간이 77%까지 단축되었습니다. 모든 작업은 unaliased ls로 수행되었습니다.

기본 탑재를 사용하는 것과 100만 개의 파일이 있는 워크로드에 대해 actimeo 값을 30으로 설정할 때 운영 종료 시간 차이를 비교하는 그래프입니다.

NFS nconnect

NFS nconnect는 클라이언트와 NFS 파일 공유 간에 여러 TCP 연결을 사용할 수 있는 NFS 파일 공유에 대한 클라이언트 쪽 탑재 옵션입니다. 대기 시간을 줄이고 성능을 향상시키려면 최적의 nconnect=4 설정을 사용하는 것이 좋습니다. nconnect 기능은 여러 스레드에서 비동기 또는 동기 I/O를 사용하는 워크로드에 특히 유용할 수 있습니다. 자세히 알아보기.

명령 및 작업

명령 및 작업을 지정하는 방식도 성능에 영향을 줄 수 있습니다. ls 명령을 사용하여 큰 디렉터리의 모든 파일을 나열하는 것이 좋습니다.

참고 항목

재귀 ls, finddu 같은 일부 작업에는 파일 이름과 파일 특성이 모두 필요하므로 디렉터리 열거형(항목을 가져오기 위해)을 각 항목의 통계와 결합합니다(특성을 가져오기 위해). 이러한 명령을 실행할 가능성이 있는 탑재 지점에서 actimeo에 대해 더 높은 값을 사용하는 것이 좋습니다.

unaliased ls 사용

일부 Linux 배포에서 셸은 ls 같은 ls --color=auto 명령에 대한 기본 옵션을 자동으로 설정합니다. 이렇게 하면 ls 유선에서 작동하는 방식이 변경되고 ls 실행에 더 많은 작업이 추가됩니다. 성능 저하를 방지하려면 unaliased ls를 사용하는 것이 좋습니다. 다음 세 가지 방법 중 하나를 수행할 수 있습니다.

  • 현재 세션에만 영향을 주는 임시 해결 방법으로, 명령을 unalias ls사용하여 별칭을 제거할 수 있습니다.

  • 영구적으로 변경하려면 사용자의 ls 파일에서 bashrc/bash_aliases 별칭을 편집할 수 있습니다. Ubuntu에서 ~/.bashrc(을)를 편집하여 ls별칭을 제거합니다.

  • ls(을)를 호출하는 대신 ls 이진 파일(예: /usr/bin/ls)을 직접 호출할 수 있습니다. 이렇게 하면 별칭에 있을 수 있는 옵션 없이 ls(을)를 사용할 수 있습니다. 명령 which ls(을)를 실행하여 이진 파일의 위치를 찾을 수 있습니다.

ls가 출력을 정렬하지 못하도록 방지

다른 명령과 함께 ls(을)를 사용하는 경우 ls 파일을 반환하는 순서에 신경 쓰지 않는 상황에서 ls(이)가 출력을 정렬하지 못하게 하여 성능을 향상시킬 수 있습니다. 출력을 정렬하면 상당한 오버헤드가 추가됩니다.

ls -l | wc -l(을)를 실행하여 총 파일 수를 가져오는 대신 -f(으)로 -U 또는 ls 옵션을 사용하여 출력이 정렬되지 않도록 할 수 있습니다. 차이점은 -f 숨겨진 파일도 표시하고 -U 표시되지 않는다는 것입니다.

예를 들어 Ubuntu에서 ls 이진 파일을 직접 호출하는 경우 /usr/bin/ls -1f | wc -l 또는 /usr/bin/ls -1U | wc -l(을)를 실행하세요.

다음 차트에서는 정렬되지 않은 정렬되지 않은 ls(을)를 사용하여 결과를 출력하는 데 걸리는 시간과 정렬된 ls(와)과 비교합니다.

정렬된 ls 작업과 정렬되지 않은 작업을 완료하기 위한 총 시간(초)을 비교하는 그래프입니다.

파일 복사 및 백업 작업

파일 공유에서 데이터를 복사하거나 파일 공유에서 다른 위치로 백업하는 경우 최적의 성능을 위해 활성 I/O를 사용하여 라이브 파일 공유 대신 공유 스냅샷을 원본으로 사용하는 것이 좋습니다. 백업 애플리케이션은 스냅샷에서 직접 명령을 실행해야 합니다. 자세한 내용은 Azure Files에서 공유 스냅샷 사용을 참조 하세요.

애플리케이션 수준 권장 사항

큰 디렉터리를 사용하는 애플리케이션을 개발할 때는 다음 권장 사항을 따릅니다.

  • 파일 특성을 건너뜁니다. 애플리케이션에 파일 이름만 필요하고 파일 형식 또는 마지막으로 수정된 시간과 같은 파일 특성이 필요하지 않은 경우 적절한 버퍼 크기와 같은 getdents64 시스템 호출을 여러 번 호출하여 파일 형식이 없는 지정된 디렉터리의 항목을 가져올 수 있으므로 필요하지 않은 추가 작업을 방지하여 작업을 더 빠르게 수행할 수 있습니다.

  • 인터리브 통계 호출입니다. 애플리케이션에 특성 및 파일 이름이 필요한 경우 getdents64(을)를 사용한 파일의 끝까지 모든 항목을 가져오는 대신 getdents64와(과) 함께 통계 호출을 인터리브한 다음 반환된 모든 항목에 대해 통계를 수행하는 것이 좋습니다. 통계 호출을 인터리빙하면 클라이언트가 파일과 해당 특성을 한 번에 모두 요청하여 서버에 대한 호출 수를 줄이도록 지시합니다. 높은 actimeo 값과 결합하면 인터리브 통계 호출이 성능을 크게 향상시킬 수 있습니다. 예를 들어 [ getdents64, getdents64, ... , getdents64, statx (entry1), ... , statx(n) ] 대신 다음의 getdents64(와)과 같이 statx 호출을 배치합니다: [ getdents64, (statx, statx, ... , statx), getdents64, (statx, statx, ... , statx), ... ].

  • I/O 깊이를 높입니다. 가능하면 0이 아닌 값(1보다 큼)으로 nconnect을(를) 구성하고 여러 스레드 간에 작업을 배포하거나 비동기 I/O를 사용하는 것이 좋습니다. 이렇게 하면 파일 공유에 대한 여러 동시 연결의 이점을 활용할 수 있는 비동기 작업이 가능합니다.

  • 강제 사용 캐시입니다. 애플리케이션이 하나의 클라이언트만 탑재한 파일 공유의 파일 특성을 쿼리하는 경우 AT_STATX_DONT_SYNC 플래그와 함께 statx 시스템 호출을 사용합니다. 이 플래그를 사용하면 캐시된 특성이 서버와 동기화되지 않고 캐시에서 검색되어 최신 데이터를 가져오기 위한 추가 네트워크 왕복을 방지할 수 있습니다.

참고 항목