• 언제가 NAS에 연결된 이미지 웹 서비스 지연이 발생했던 과거 자료를 찾아 다시 정리한 노트 (Update: Apr 26, 2021)

환경 구성

  • Client: CentOS 6
  • Web service: Nginx (NFS mounted)  

1. 문제 현상

  1. 이미지 웹 서비스 간헐적 오류
  2. 불규칙하게 NAS에 저장된 샘플 파일의 속성을 읽을 때 지연 발생
  3. client 간 네트웍 연결 상태, Local file 호출 등은 언제든 정상  

2. 문제 해소를 위한 설정들

  1. 웹 서비스를 하는 (NFS) client의 설정
  2. 문제 해소를 위해 구글링하며 적용했던 설정으로 최적화를 위해 사후 테스트를 더 해보고 싶었으나 진행 여건이 안되어 무의미하거나 부적합한 부분이 있을 수 있음
  3. 수 년간 서비스를 해오던 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
 

4. 참고 글