NFS 쓰기 성능 저하 5Gb)을 다운로드하려고하면

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 쓰기를 빠르게하는 방법은 무엇입니까?



답변

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

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

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


답변

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

결과를 다시보고합니다.


답변

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 옵션을 사용하고 파일 액세스 시간이 업데이트되지 않아 디스크에 추가 데이터가 기록되는 것을 방지하십시오. 이 모드는 다른 모든 모드를 능가하는 동시에 데이터를 디스크에서 읽고 디스크에 기록해야 할 때 가장 빠릅니다.


답변