작은 파일의 느린 NFS 전송 성능 마운트했습니다. 두 호스트 모두 전용 기가비트

RAID 1 + 0을 사용하여 결합 된 HP ML370 G5, Smart Array P400, SAS 디스크에서 Openfiler 2.3을 사용하고 있습니다.

Openfiler의 웹 기반 구성을 사용하여 ext3 파티션에서 NFS 공유를 설정했으며 다른 호스트에서 공유를 마운트했습니다. 두 호스트 모두 전용 기가비트 링크를 사용하여 연결됩니다.

다음을 사용하는 간단한 벤치 마크 dd:

 $ dd if=/dev/zero of=outfile bs=1000 count=2000000
 2000000+0 records in
 2000000+0 records out
 2000000000 bytes (2.0 GB) copied, 34.4737 s, 58.0 MB/s

적당한 전송 속도 (58.0MB / s)를 달성 할 수 있습니다.

그러나 총 크기 ~ 300MB의 작은 파일 ( .php및 파일 .jpg당 약 1-4kB)이 포함 된 디렉토리를 복사하면 cp약 10 분 후에 프로세스가 종료됩니다.

위의 경우처럼 NFS가 작은 파일 전송에 적합하지 않습니까? 아니면 조정해야 할 매개 변수가 있습니까?



답변

하나의 큰 파일을 전송하는 것보다 많은 작은 파일을 전송하는 것이 항상 느린 이유는 여러 가지가 있습니다. 읽기의 경우 파일이 디스크 주위에 흩어질 가능성이 높으므로 파일을 가져 오기 위해 모든 곳에서 탐색해야합니다. Evan이 언급했듯이 NFS의 경우 관련된 메타 데이터도 있습니다 (또는 그 문제에 대한 다른 파일 시스템!).

NFS 마운트로 rsizewsize매개 변수를 늘려서 성능에 약간 도움이되는지 확인할 수 있습니다. 또한 작은 파일 전송의 경우 도움이되는 유용한 조언이 많으므로 최소 대기 시간을 위해 NFS 조정에 대한이 질문 을 확인하십시오 .


답변

NFS에 대한 경험은 많지 않지만 다른 네트워크 파일 공유 프로토콜에 대한 경험에 따르면 “많은 작은 파일”시나리오에서 성능이 거의 보편적으로 저하됩니다. 왕복 대기 시간이 발생하고 대기 시간이 길어지는 많은 파일 그룹이 발생합니다.


답변

XFS와 같은 다른 파일 시스템을 사용해 보셨습니까? 대량의 작은 iSCSI 블록 전송을 수행 할 때 모든 문제를 해결했습니다. 왜 그런지 모르겠다.

또한 iSCSI / NFS는 일반적으로 매우 큰 데이터 프레임 (점보 프레임 등)으로 구성되므로 작은 파일을 한 번에 하나씩 복사하면 손상 될 수 있습니다. 아마도 tar’ing하고 옮기는 것이 도움이 될 것입니다.


답변

TCP 연결을 사용하고 있는지 확인하십시오 ( mount -t nfs -o tcp host : / mount / target ). 최신 시스템의 성능에는 영향을 미치지 않지만 네트워크가로드되면 작은 IO가 크게 향상 될 수 있습니다.

그리고 다른 파일 시스템도 시도해야합니다. ext3는 기본적으로 가장 느립니다. 견고하고 잘 알려져 있지만 파일 서버에는 적합하지 않습니다. XFS가 훨씬 우수하고 작은 IO에서는 reiserfs가 훨씬 우수합니다.


답변

작은 파일의 큰 디렉토리 트리를 NFS를 통해 전송하고 서버에 로그인 할 수있는 가장 좋은 방법은 다음과 같이 클라이언트에서 자동으로 추출되는 tar 파일을 만드는 것입니다.

tar c mydirectory | ssh user @ host tar -xf–C destdir

이렇게하면 단일 “파일”만 네트워크를 통해 전송되고 모든 파일을 호스트에 즉시 가져옵니다.


답변

Evan의 답변에 추가하기 위해 복사하려는 각 파일에 대한 메타 데이터 (디렉토리 항목 등)를 작성하는 오버 헤드도 있습니다.


답변

Chris의 대답 과 비슷한 솔루션은 파일을 클라이언트에 주기적으로 재 동기화하는 것입니다. 양방향 변경을 원한다면 일제히 사용할 수도 있습니다.