NFS 쓰기 성능 저하


20

10Gbit 이더넷으로 연결된 두 대의 컴퓨터가 있습니다. 그중 하나는 NFS 서버이고 다른 하나는 NF 클라이언트입니다.

TCP를 통한 네트워크 속도 테스트 iperf는 양방향에서 ~ 9.8Gbit / s 처리량 을 보여 주므로 네트워크는 정상입니다.

NFS 서버의 디스크 성능 테스트 :

dd if=/dev/zero of=/mnt/test/rnd2 count=1000000

결과는 ~ 150 MBytes / s이므로 디스크 쓰기에 적합합니다.

서버 /etc/exports는 :

/mnt/test 192.168.1.0/24(rw,no_root_squash,insecure,sync,no_subtree_check)

클라이언트는 /mnt/test다음 옵션 을 사용하여이 공유를 로컬에 마운트합니다 .

node02:~ # mount | grep nfs
192.168.1.101:/mnt/test on /mnt/test type nfs4 (rw,relatime,sync,vers=4.0,rsize=1048576,wsize=1048576,namlen=255,hard,proto=tcp,port=0,timeo=600,retrans=2,sec=sys,clientaddr=192.168.1.102,local_lock=none,addr=192.168.1.101)

NFS 공유에서 클라이언트 시스템에 큰 파일 (~ 5Gb)을 다운로드하려고하면 서버의 로컬 디스크 성능에 가까운 ~ 130-140 MBytes / s 성능을 얻으므로 만족합니다.

그러나 NFS 공유에 큰 파일을 업로드하려고하면 업로드가 ~ 1.5 Mbytes / s에서 시작하여 천천히 18-20 Mbytes / s까지 증가하고 증가가 멈 춥니 다. 때때로 업로드가 실제로 시작되기 전에 몇 분 동안 공유가 중단됩니다. 즉 호스트 간의 트래픽이 0에 가까워지고 실행 ls /mnt/test하면 1-2 분 동안 반환되지 않습니다. 그런 다음 ls명령이 돌아가고 초기 1.5Mbit / s 속도로 업로드가 시작됩니다.

업로드 속도가 최대 (18-20 Mbytes / s)에 도달 iptraf-ng하면 네트워크 인터페이스에서 ~ 190 Mbit / s 트래픽을 표시하므로 네트워크는 서버의 HDD뿐만 아니라 병목 현상이 없습니다.

내가 시도한 것 :

1. 100Mbit 이더넷 NIC로만 연결된 세 번째 호스트에 NFS 서버를 설정하십시오. 결과는 비슷합니다. DL은 우수한 성능과 거의 100Mbit의 네트워크 사용률을 보여 주며 업로드는 초당 수백 킬로바이트보다 빠르지 않으므로 네트워크 사용률이 매우 낮습니다 (에 따라 2.5Mbit / s iptraf-ng).

2. NFS 매개 변수를 조정하려고했습니다.

  • sync 또는 async

  • noatime

  • 아니 hard

  • rsize그리고 wsize내가 8192까지 여러 단계를 줄일려고, 그래서 내 예제에서 최대이다

3. 클라이언트와 서버 시스템을 전환하려고했습니다 (이전 클라이언트에서 NFS 서버를 설정하거나 그 반대로). 또한 동일한 구성의 서버가 6 개 더 있으므로 다른 변형으로 서로 마운트하려고했습니다. 같은 결과입니다.

4. MTU = 9000, MTU = 9000 및 802.3ad 링크 집계, MTU = 1500을 사용한 링크 집계.

5. sysctl 조정 :

node01:~ # cat /etc/sysctl.conf 
net.core.wmem_max=16777216
net.core.rmem_max=16777216
net.ipv4.tcp_rmem= 10240 873800 16777216
net.ipv4.tcp_wmem= 10240 873800 16777216
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_timestamps = 1
net.ipv4.tcp_sack = 1
net.core.netdev_max_backlog = 5000

같은 결과입니다.

6. localhost에서 마운트하십시오.

node01:~ # cat /etc/exports
/mnt/test *(rw,no_root_squash,insecure,sync,no_subtree_check)
node01:~ # mount -t nfs -o sync localhost:/mnt/test /mnt/testmount/

다운로드에서이 : 그리고 여기 같은 결과를 얻을 /mnt/testmount/업로드에, 빠르고 /mnt/testmount/, 매우 느리게하지보다 빠른 22 메가 바이트 / s의 및 전송이 실제로 시작하기 전에 약간의 지연이있다. 네트워크 스택이 완벽하게 작동하고 문제가 NFS에 있다는 것을 의미합니까?

이 모든 것이 도움이되지 않았으며 결과는 기본 구성과 크게 다르지 않았습니다. echo 3 > /proc/sys/vm/drop_caches모든 테스트 전에 실행되었습니다.

3 개의 모든 호스트에서 모든 NIC의 MTU는 1500이며 비표준 네트워크 조정은 수행되지 않습니다. 이더넷 스위치는 Dell MXL 10 / 40Gbe입니다.

OS는 CentOS 7입니다.

node01:/mnt/test # uname -a
Linux node01 3.10.0-123.20.1.el7.x86_64 #1 SMP Thu Jan 29 18:05:33 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux

어떤 설정이 누락 되었습니까? 중단없이 NFS 쓰기를 빠르게하는 방법은 무엇입니까?


1
당신은 꽤 다방면의 테스트 사례를 가지고 있지만 서버 자체에 마운트하고 거기서 쓰기를 시도하여 NFS 스택 또는 네트워킹 스택에 결함이 있는지 알아낼 수 있습니다. 또한 서버와 클라이언트를 전환하고 (클라이언트에서 내보내기, 서버에 마운트) 다른 클라이언트를 사용하십시오. 서버 / 클라이언트 프로세스를 추적해도 아무것도 공개되지 않았습니까?
달리 보르 카를로 비치

@ DaliborKarlović 나는 strace를 제외한 모든 것을 시도하고 질문에 정보를 추가했습니다. localhost에서의 마운트가 느리게 작동하므로 네트워킹 스택 및 스위치에 결함이없는 것 같습니다. 커널 공간 NFS Operation not permitted를 사용하고 strace를 NFS 프로세스에 연결하려고 시도합니다.
Sergey

이것은 네트워킹 스택을 완전히 배제 할 수 있다고 가정합니다 (그러나 strace를 첨부해야합니다). 특정 버그 에 부딪치지 않으면 모든 프로세스를 루트 사용자로 추적 할 수 있어야합니다 .
달리 보르 카를로 비치

@ DaliborKarlović 확실히 나는 뿌리로 strace를 시도합니다. 모든 사용자 공간 프로세스에 연결할 수 있지만 커널 공간 프로세스에는 연결할 수 없습니다. 그러나 출력에서 ​​얻을 수있는 정보는 무엇입니까? NFS에 연결하고 업로드를 시작하면 수십만 줄의 출력을 생성한다고 가정합니다. 0이 아닌 반환 값에주의해야합니까?
Sergey

당신이 옳습니다, 나는 그것이 비 사용자 프로세스라고 생각하지 않았습니다. 전송이 시작될 때 "중지"되는 동안 수행 한 작업을 볼 것으로 예상됩니다. 잘못 구성된 역방향 DNS 조회와 같은 사소한 것일 수 있습니다.
달리 보르 카를로 비치

답변:


3

내보내기 문에서 sync-option을 사용합니다. 이는 서버가 실제로 디스크에 기록 된 후에 만 ​​쓰기 작업을 확인 함을 의미합니다. 회전하는 디스크가있는 경우 (즉, SSD가없는 경우) 쓰기 작업 당 평균 디스크 회전의 평균 1/2 이상이 필요합니다. 이것이 속도 저하의 원인입니다.

비동기 설정을 사용하면 서버는 처리되었지만 아직 디스크에 기록되지 않은 경우 클라이언트에 대한 쓰기 작업을 즉시 승인합니다. 예를 들어, 클라이언트가 발생하지 않은 작업에 대한 ack을 받았을 때 정전이 발생한 경우에는 좀 더 신뢰할 수 없습니다. 그러나 쓰기 성능이 크게 향상되었습니다.

방금 당신이 이미 비동기 대 동기화 옵션을 테스트 한 것을 보았습니다. 그러나 이것이 성능 저하 문제의 원인이라고 확신합니다. 한 번은 동일한 설정으로 정확히 동일한 표시가있었습니다. 어쩌면 다시 테스트 해 볼 수도 있습니다. 서버의 내보내기 명령문과 클라이언트의 마운트 조작에서 비동기 옵션을 동시에 제공 했습니까?


+1 대부분의 설명은 동기화가 올바르게 비활성화되지 않았다는 것입니다.
David Schwartz

2

패킷 크기 및 대기 시간과 관련된 문제 일 수 있습니다. 다음을 시도하십시오 :

결과를 다시보고합니다.


MTU = 9000으로 점보 프레임을 시도했지만 결과는 동일합니다. 또한 802.3ad로 링크 집계를 시도했지만 변경 사항이 없습니다. 그래서 가능한 한 기본 상태에 가까워 지도록 이러한 모든 설정을 되돌 렸습니다. 또한 그 net.core.*net.ipv4.*sysctls 를 조정하려고했지만 실험이 너무 적었습니다. 좋아, 좀 더 테스트하고보고 할게
Sergey

서버와 클라이언트 모두에서 sysctls를 조정하기 위해 한 번 더 시도했지만 도움이되지 않았습니다.
Sergey

전송 프로토콜로 UDP를 사용해 보셨습니까?
shodanshok

UDP (마운트 옵션에서 proto = udp)를 시도했지만 TCP보다 1-2MBytes / s까지 느리게 작동합니다. 결과는 localhost와 원격 호스트에서 동일한 마운트입니다.
Sergey

2

http://veerapen.blogspot.com/2011/09/tuning-redhat-enterprise-linux-rhel-54.html

하드웨어 RAID가있는 시스템에서 Linux 스케줄러를 구성하고 기본값을 [cfq]에서 [noop]으로 변경하면 I / O가 향상됩니다.

읽기 / 쓰기 백분율을 계산하려면 nfsstat 명령을 사용하십시오. 일치하도록 RAID 컨트롤러 캐시 비율을 설정하십시오.

워크로드가 많은 경우 NFS 서버 스레드 수를 늘려야합니다.

no_delay 옵션을 사용하여 디스크에 지연없이 쓰도록 nfs 스레드를 구성하십시오.

쓰기가 가능한 한 작게 유지되도록 Linux 커널에 가능한 빨리 플러시하도록 지시하십시오. Linux 커널에서 더티 페이지 쓰기 저장 빈도는 두 개의 매개 변수로 제어 할 수 있습니다.

디스크 쓰기 속도를 높이려면 filesystem data = journal 옵션을 사용하고 파일 액세스 시간이 업데이트되지 않아 디스크에 추가 데이터가 기록되는 것을 방지하십시오. 이 모드는 다른 모든 모드를 능가하는 동시에 데이터를 디스크에서 읽고 디스크에 기록해야 할 때 가장 빠릅니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.