Linux, NFS performance issues check
- 언제가 NAS에 연결된 이미지 웹 서비스 지연이 발생했던 과거 자료를 찾아 다시 정리한 노트 (Update: Apr 26, 2021)
환경 구성
- Client: CentOS 6
- Web service: Nginx (NFS mounted)
1. 문제 현상
- 이미지 웹 서비스 간헐적 오류
- 불규칙하게 NAS에 저장된 샘플 파일의 속성을 읽을 때 지연 발생
- client 간 네트웍 연결 상태, Local file 호출 등은 언제든 정상
2. 문제 해소를 위한 설정들
- 웹 서비스를 하는 (NFS) client의 설정
- 문제 해소를 위해 구글링하며 적용했던 설정으로 최적화를 위해 사후 테스트를 더 해보고 싶었으나 진행 여건이 안되어 무의미하거나 부적합한 부분이 있을 수 있음
- 수 년간 서비스를 해오던 NAS장비라 (NFS) Server측 수정은 일단 보류
[USER1@SVR1 ~]$ cat /etc/fstab
# Created by anaconda on Wed Feb 6 00:13:32 2014
/dev/sda3 / ext3 defaults 1 1
(...생략...)
img1.nas:/ifs/img1nas /mnt/img1nas nfs bg,soft,rw,nfsvers=3,rsize=1048576,wsize=1048576,actimeo=30,timeo=6,retrans=5 0 0
(...생략...)
[USER1@SVR1 ~]$ nfsstat --version
nfsstat: 1.2.3
[USER1@SVR1 ~]$ nfsstat -m
(...생략...)
/mnt/img1nas from img1.nas:/ifs/img1nas
Flags: rw,relatime,vers=3,rsize=1048576,wsize=1048576,namlen=255,acregmin=30,acregmax=30,acdirmax=30,soft,proto=tcp,timeo=6,retrans=5,sec=sys,mountaddr=192.168.100.51,mountvers=3,mountport=300,mountproto=udp,local_lock=none,addr=192.168.100.51
(...생략...)
[USER1@SVR1 ~]$ nfsstat -r
Client rpc stats:
calls retrans authrefrsh
968117362 280883 968171794
[USER1@SVR1 ~]$ nfsstat -c
Client rpc stats:
calls retrans authrefrsh
968117362 280883 968171794
Client nfs v3:
null getattr setattr lookup access readlink
0 0% 561576 0% 0 0% 365603330 37% 467643682 48% 0 0%
read write create mkdir symlink mknod
134295360 13% 0 0% 0 0% 0 0% 0 0% 0 0%
remove rmdir rename link readdir readdirplus
0 0% 0 0% 0 0% 0 0% 0 0% 0 0%
fsstat fsinfo pathconf commit
42669 0% 6 0% 3 0% 0 0%
[USER1@SVR1 ~]$ nfsstat -o net
Client packet stats:
packets udp tcp tcpconn
0 0 0 0
# You can also check dropped packet by running the following command on both the server and the client.
# https://www.redhat.com/sysadmin/using-nfsstat-nfsiostat
[USER1@SVR1 ~]$ nfsiostat
(...생략...)
img1.nas:/ifs/img1nas mounted on /mnt/img1nas :
op/s rpc bklog
247.48 0.00
read: ops/s kB/s kB/op retrans avg RTT (ms) avg exe (ms)
34.320 11576.200 337.304 109856 (0.1%) 24.065 24.585
write: ops/s kB/s kB/op retrans avg RTT (ms) avg exe (ms)
0.000 0.000 0.000 0 (0.0%) 0.000 0.000
(...생략...)
[USER1@SVR1 ~]$ sar 1 10
Linux 2.6.32-642.15.1.el6.x86_64 (SVR1) 04/26/2021 _x86_64_ (8 CPU)
12:01:25 PM CPU %user %nice %system %iowait %steal %idle
12:01:26 PM all 0.00 0.00 0.25 3.14 0.00 96.61
(... 생략...)
Average: all 0.04 0.00 0.25 4.06 0.00 95.65
[USER1@SVR1 ~]$ vmstat 1 10
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 0 120104 141996 6926004 0 0 2 4 1 1 0 0 95 5 0
0 1 0 138316 142004 6906660 0 0 0 120 1195 989 0 0 97 3 0
0 0 0 134844 142004 6910028 0 0 0 0 1120 1006 0 0 97 3 0
(...생략...)
[USER1@SVR1 ~]$ cat /etc/sysctl.conf
net.ipv4.ip_local_port_range = 1024 65535
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 15
net.ipv4.tcp_syncookies=0
net.ipv4.tcp_max_syn_backlog = 2048
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1
net.ipv4.tcp_keepalive_time = 300
net.ipv4.tcp_keepalive_probes = 5
net.ipv4.tcp_keepalive_intvl = 15
net.ipv4.tcp_rmem = 8192 87380 33554432
net.ipv4.udp_rmem_min = 16384
net.ipv4.tcp_wmem = 8192 65536 33554432
net.ipv4.udp_wmem_min = 16384
net.core.rmem_default = 31457280
net.core.rmem_max = 33554432
net.core.wmem_default = 31457280
net.core.wmem_max = 33554432
net.core.somaxconn = 65535
net.core.netdev_max_backlog = 65536
net.core.optmem_max = 25165824
;NAS nfsstat
img1nas1-1# nfsstat
NFS server global statistics:
Read/write throughput (bytes):
Read Read ZC Written Written ZC
2339145483409 2339145001333 579153243117092 579153242172988
Errors:
Authentication Decode No Procedure No Program Program Version System Error Weak Auth
0 0 0 7126 640 0 437
Total
8203
TCP Connections:
Current Max
0 0
Requests:
Current Max UDP TCP Duplicates Total
0 0 9004 0 7339550 9004
Miscellaneous:
Replies SeqID Upcalls
18214141862 18221493762 22
NFSv3 Server:
RPC Errors Server Errors Total Errors
0 0 0
NFSv3 Server Operation Counts:
Null Getattr Setattr Lookup Access Readlink Read
23 732893981 3089 5985029814 7010963343 0 3758544285
Write Create Mkdir Symlink Mknod Remove Rmdir
1075 1035 0 0 0 608953217 2479
Rename Link Readdir Readdir+ Fsstat Fsinfo Pathconf
1 0 5144754 827715 765914 24 12
Commit Total
28 18103130789
NFSv3 Read Request Sizes:
0-512 512-1K 1K-2K 2k-4K 4K-8K 8K-16K 16K-32K
35280910 14289084 18384064 19863212 57873139 198725246 174021882
32K-64K 64K-128K 128K+ Total
320244996 609638703 2310223054 3758544290
NFSv3 Write Request Sizes:
0-512 512-1K 1K-2K 2k-4K 4K-8K 8K-16K 16K-32K
0 0 6 0 1 0 0
32K-64K 64K-128K 128K+ Total
10 10 1048 1075
NFSv4 Server:
RPC Errors Server Errors Total Errors
0 0 0
NFSv4 Server Clients:
Current Clients Total Clients Open Owners Opens Lock Owners Locks Delegates
3 11920 3 8 0 0 0
VOP Writes Cleanups
0 0
NFSv4 Server Operation Counts:
Null Compound Illegal
2 110367493 0
Access Close Commit Create Delpurge Delretrn Getattr
64512139 41667713 0 0 0 0 107336747
Getfh Link Lock Lockt Locku Lookup Lookupp
42633457 0 0 0 0 958510 0
Nverify Open Openattr Openconf Opendngd Putfh Putpubfh
0 41717505 0 11909 0 110331033 0
Putrtfh Read Readdir Readlink Remove Rename Renew
1 2870826 68983 0 0 0 12621
Restorfh Savefh Secinfo Setattr Setclid Stcidcnf Verify
0 0 0 0 11920 11917 0
Write Rlslkown Bkchnctl Bindconn Exchid Crtsesn Dstrsesn
0 0 0 0 0 0 0
Freestid Gdirdlg Gdevinfo Gdevlist Laycmt Layget Layret
0 0 0 0 0 0 0
Secinfnn Sequence Setssv Teststid Wantdel Dstrclid Reclcplt
0 0 0 0 0 0 0
Total
412145281
NFSv4 Read Request Sizes:
0-512 512-1K 1K-2K 2k-4K 4K-8K 8K-16K 16K-32K
7544 8084 17554 43727 628889 433907 655075
32K-64K 64K-128K 128K+ Total
483306 311596 281144 2870826
NFSv4 Write Request Sizes:
0-512 512-1K 1K-2K 2k-4K 4K-8K 8K-16K 16K-32K
0 0 0 0 0 0 0
32K-64K 64K-128K 128K+ Total
0 0 0 0
NLM Server Operation Counts:
Null Test Lock Cancel Unlock Granted Testmsg
0 0 0 0 0 0 0
Lockmsg Cancelmsg Unlockmsg Grantedmsg Testres Lockres Cancelres
0 0 0 0 0 0 0
Unlockres Grantedres Share Unshare Nmlock Freeall Total
0 0 0 0 0 0 0
img1nas1-1#
3. 테스트로 검토했던 내용들
1) NFS file-attribute cache tuning
; NFS는 최근에 액세스 한 디렉토리 및 파일의 속성에 대한 캐시를 각 클라이언트 시스템에 유지합니다.
mount 명령을 사용하여 여러 매개 변수를 설정하여 주어진 항목이 캐시에 보관되는 기간을 제어 할 수 있습니다. 업데이트 후 파일 및 디렉토리 항목이 파일 속성 캐시에 보관되는 절대 시간입니다. 지정된 경우 이 값들 모두 actimeo 값으로 효과적으로 설정됩니다.
2-1) Read and write size adjustments
; NFS 파일 시스템이 기가비트 이더넷과 같은 고속 네트워크에 마운트 된 경우 읽기 및 쓰기 패킷 크기가 클수록 NFS 파일 시스템 성능이 향상 될 수 있습니다. NFS 버전 3 및 NFS 버전 4를 사용하면 네트워크 전송이 TCP 일 때 rsize 및 wsize 값을 65536까지 설정할 수 있습니다. 기본값은 32768입니다. NFS 버전 2에서 rsize 및 wsize 옵션의 최대 값은 기본값이기도 한 8192입니다.
2-2) NFS read size (rsize) and write size (wsize)
; Timeout: The timeout period is specified by the mount parameter timeo and is expressed in deciseconds (tenths of a second). By default, for NFS over TCP the default timeo value is 600 (60 seconds). The NFS client performs linear back
; Result shows in Figure 5 while mounting NFS with options nfsvers=4,rsize=1048576,wsize=1048576, which is the default value advised by OneFS. And leaves the other mount options as default
2-3) Common NFS mount options in Linux
; 클라이언트와 서버간에 패킷이 삭제되는 경우 rsize를 4096 또는 2048로 줄입니다. 패킷 삭제 여부를 확인하려면 HP-UX 프롬프트에서 “nfsstat -rc"명령을 실행합니다. 이 명령에 의해 반환 된 시간 초과 및 재전송 값이 높지만 badxid 번호가 0에 가까우면 패킷이 네트워크의 어딘가에서 삭제됩니다.
3-1) Unnecessary retransmits
; 시간 초과 및 badxid의 총계의 5 % 이상과 같이 상당한 수를보고하면 mount 명령을 사용하여 timeo 매개 변수를 늘릴 수 있습니다. 기본 시간은 0.7 초, timeo = 7 입니다.
; 타임 아웃을 더 길게 또는 더 짧게 만드는 올바른 방법은 할당 된 시간에 패킷이 도착하지 않는 이유에 따라 다릅니다. 패킷이 늦어지고 마침내 도착한 경우 timeo 변수를 더 길게 만들어 요청이 다시 전송되기 전에 응답이 반환 될 기회를 제공 할 수 있습니다. 그러나 패킷이 삭제되어 클라이언트에 도착하지 않을 경우 응답을 기다리는 데 소요 된 시간이 낭비되므로 시간을 단축 할 수 있습니다.
; 취할 옵션을 추정하는 한 가지 방법은 클라이언트의 nfsstat -cr 출력을보고 클라이언트가 많은 badxid 수를보고하는지 확인하는 것입니다. badxid 값은 RPC 클라이언트가 예상했던 것과 다른 호출에 대한 RPC 호출 응답을 수신했음을 의미합니다. 일반적으로 이것은 클라이언트가 이전에 재전송 된 호출에 대해 중복 응답을 수신했음을 의미합니다. 따라서 패킷이 늦게 도착하므로 시간을 늘려야합니다.
; How to Display NFS Server and Client Statistics
3-2) LAMP 시스템 조율, Part 1: LAMP 아키텍처 이해
; 둘째 열인 retrans가 0인데, 마지막 시동 후 재전송이 필요하지 않음을 보여준다. 이 숫자가 증가하면 NFS 커널 스레드를 높여야 한다.
4) Unused NFS ACL support
; 워크로드가 마운트 된 파일 시스템에서 NFS 액세스 제어 목록 또는 ACL 지원을 사용하지 않는 경우 noacl 옵션을 지정하여 클라이언트와 서버 모두에서 워크로드를 어느 정도 줄일 수 있습니다. options=noacl
5) 그 외 옵션들
Number of necessary biod threads
Performance implications of hard or soft NFS mounts