2019/12/09

NFS 설정 및 속도 튜닝.

NFS
1.1 개요
NFS는 Sun Microsystems를 제외하고 분산파일 시스템 프로토콜이다.

    - 동기화(Synchronous): 데이터 안정성 +, 성능 -

    - 비동기화(Asynchronous): 데이터 안정성 -, 성능 +

    - NFS Client mount 시 -o rw,async 비동기화 사용

1.1.1 데몬 설정
기본 데몬은 8개 설정.
cd /etc
vi ./init.d/nfs-kernel-server
28:RPCNFSDCOUNT=8
103:                --exec $PREFIX/sbin/rpc.nfsd -- $RPCNFSDCOUNT

cd /etc
vi ./default/nfs-kernel-server
2:RPCNFSDCOUNT=8

   
1.2. nfs 설치.
apt-get install nfs-kernel-server

1.1.2 블록 크기 설정
- NFS Client mount시 RPC 최대 읽기버퍼(rsize), 최대 쓰기버퍼(wsize) 설정 가능
- Default 설정은 NFS Version 과 Kernel Version에 의해 정해짐
-- Linux Kernel 4.6 기준, fs/nfsd/nfsd.h에 define
-- NFSSVC_MAXBLKSIZE  (1*1024*1024u) = 1048576 = 1M

- RPC 통신시 Packet Payload 크기
- rsize, wsize를 줄리면 요청이 늘어남
-- - 1MB 데이터를 전송 할 경우
--- 32KB Block Size: 32 번의 요청
--- 64KB Block Size: 16 번의 요청

1.1.3 Timeout, Re-transmission
- timeo: 클라이언트가 패킷을 재 전송해야 한다는 결론데 도달하기 전까지 클라이언트가 대기애햐 하는 시간
- retrans: timeo 만큼 기다린 후 재시도 횟수
-- retrans 값이 3(count)라면 "서버를 사용할 수 없다"라는 결론을 내기 위해 timeo 만큼 기다리고 재시도 3회 반복
-- 3번 반복 후에도 응답이 없으면 에러 메세지 발생하고 retrans 값 재설정(3) 계속 시도
-- rsize, wsize, MTU 조정 등은 서버로 부터 응답이 지연되거나 서버로부터 응답이 없는 경우 클라이언트가 서버에 시도하는 재시도 횟수에 영향을 줌.

- timeo은 1/10 second 단위로 설정
-- time0 값이 5(초) 라면 5/10 초를 기다린 다는 의미

- 클라이언트가 서버로부터 응답이 지연되면(retrans가 너무 자주 발생하는 경우) timeo 값을 늘릴 수 있음
-- timeo 값을 늘리면 성능이 약간 향상 됨을 볼 수 있음

모니터링
nfsstat -r
Server rpc stats:
calls      badcalls   badfmt     badauth    badclnt
212        14         2          12         0     

1.1.4 FS-Cache
- kernel source/documentation/filesystems/caching/fscache.txt
- -o fsc 옵션 사용하여 NFS Client Mount
- Network 를 통해 받은 데이터를 로컬 디스크에 저장 하여 활용
- Read시 장정이 있을 수 있음
-- 로컬 디스크에 저장된 데이터를 읽기 때문에 네트워크 트래픽 감속
-- 무조건 Read 성능이 향상 된다고 볼 수는 없음.

1.1.5 Filesystem mount options
- noatime: Inode access times are not updated on the filesystem
-- Application에서 Access time이 필요 없을때 사용.

- nodiratime: The directory inode is not updated on the filesystem when it is accessed.
- relatime: Inode access times are relative to the modify or change time for the file, so the access time is updated only if the previous atime was earier than the modify or change time.

noacl: ACL(Access Control List) 비활성
-- 전동적인 nFS는 Write-through 캐시를 가짐
-- 두개 이상의 client가 같은 파일에 대해 Write 요청시 어떤 데이터가 남아 있는지 알 수 없음.
-- close-to-open cache coherence semantics는 이를 해결
-- 두 개 이상의 client가 같은 파일에 대해 수정하는 것을 방지
-- Open 요청 시 해당 파일 다른 Client가 Open 하지 않았는지 먼저 쿼리
-- nocto를 사용하는 경우는 Read Only 시 사용.

- lookupcache
-- kernel 2.6.28 이후 지원
-- mount point 대상으로 dentry cache를 관리 방법 명시
-- Linux NFS Client는 NFS LOOKUP request에 대한 cache 유지.
-- lookupcache=all 혹은 따로 지정 되지 않으면
-- lookupcache=pos or positive
-- lookupcache=none
--- 바로 바로 파일 변경 상태 확인 가능
--- Server 성능에 영향을 줌.

- NFS Module Parameters
- prcmode Module Parameters

1.2.1 디렉토리 생성
1.2.1.1 모든 권한 부여
sudo mkdir -p /mnt/sharedfolder
sudo chown nobody:nogroup /mnt/sharedfolder
sudo chmod 777 /mnt/sharedfolder

1.3 공유 디렉토리 설정
1.3.1 예제

단일 클라이언트 설정.
/mnt/sharedfolder clientIP(rw,sync,no_subtree_check)

여러 클라이언트 설정.
/mnt/sharedfolder client1IP(rw,sync,no_subtree_check)
/mnt/sharedfolder client2IP(rw,sync,no_subtree_check)

클라이언트 세브넷 설정.
/mnt/sharedfolder subnetIP/24(rw,sync,no_subtree_check)

1.3.2 실 적용.
vi /etc/exports

접근할 윈도우 IP 주소 설정
/home/linuxlee/Shinobi/videos 172.16.1.17(rw,sync,no_subtree_check)

네트워크 대역 접근 주소 설정
/home/linuxlee/Shinobi/videos 172.16.1.0/255.255.255.0(rw,sync,no_subtree_check)

2. 디렉토리 공유 정보 활성화.
sudo exportfs -a

3. 데몬 구동
방법1.
sudo service nfs-kernel-server restart

방법2.
sudo systemctl restart nfs-kernel-server

4. 방화벽 설정
sudo ufw allow from [clientIP or clientSubnetIP] to any port nfs
udo ufw allow from 192.168.100/24 to any port nfs

4.1 방화벽 상택 확인
sudo ufw status

nfs 상태 확인.
exportfs -u

2. 윈도우 설정.
PC: Windows 10 에서의 설정

2.1 NFS 클라이언트 설정
제어판 -> 프로그램 -> Windows 기능 켜기/끄기
NFS 서비스
- NFS 용 서비스(활성화)
-- NFS용 클라이언트(활성화)
-- 관리도구(활성화)

2.2 네트워크 드라이버 연결
내 pc 오른쪽 마우스 클릭 -> 네트워크 드라이브 연결

드라이브: 설정
폴더위치: \\172.16.1.167\home\linuxlee\Shinobi\videos

CLI 확인
cmd 도스 창 열기
mount

3. NFS 성능 튜닝
- system memory
- input, output Socket Queue

-- 대용량 파일 전송 시 서버에서 많은 메모리 필요
-- 네트워크 전송에 Linux는 기본적으로 파일 전송용으로 많은 메모리 할당 하지 않음
--- 여러 Application이 구동되는 환경이기 때문
-- 네트워크를 통한 대용량 입/출력이 있다면 높은 메모리 할당 가능
- Socket Queue
-- 서버에 16개의 프로세스, 각 프로세스에서 클라이언트 용총 대기 가정
-- 각 프로세스틑 동일한 소켓 입/출력 Queue 사용
--- 다른 application도 같은 Queue 사용
--- 따라서 Socket Queue가 크면 모든 프로세스에서 효율적으로 처리 가능
-- 조정 가능 한 값
--- Socket Input Queue: 요청을 처리해야 하는 대기열
--- socket Output Queue: 요청을 하는 대기열

3.1 방법.
// input queue: nfs 재시작 필요
# echo 219136 > /proc/sys/net/core/rmem_default
# echo 219136 > /proc/sys/net/core/rmem_max

// output queue: nfs 재시작 필요
# echo 219136 > /proc/sys/net/core/wmem_default
# echo 219136 > /proc/sys/net/core/wmem_max

// reboot 후에도 적용하려면
#echo 'net.core.wmem_max=219136' >> /etc/sysctl.conf
#echo 'net.core.rmem_max=219136' >> /etc/sysctl.conf


3.2 MTU 조정
MTU 확인.
netstat -i

- NFS 설정인 Block size(rsize, wsize) 만큼 MTU 설정 되어야 함
- rsize, wsize가 8K, MTU가 1500 B인 경우 fragmente 발생
- rsize, wsize가 8K, MTU가 1500 B인 경우 fragmente 발생
- Server, Client 모두 변경 되어야 함

3.3 확인.
cat /proc/mounts

192.168.0.103:/data /mnt nfs rw,vers=3,rsize=32768,wsize=32768,hard,proto=tcp,timeo=600,retrans=2,sec=sys,addr=192.168.0.103 0 0

rsize=32768및 wsize=32768 RPC 패킷이 소요되는 데이터 조각의 크기를 지정,조정하면 성능 향상 또는 정하 ㅚㄷㄹ 수 있다.

rsize, wsize 네트워크 용량뿐 아니라 클라이언트와 서버의 처리 성능 능력을 유지하여 수행해야 한다.
마운트시 rsize 크기를 줄이면 wsize 전송해야하는 데이터의 양과 관계없이 동일하게 된다.
rpc 패킷의 크기를 줄이면 동일한 양의 데이터를 전달하기 위해, 전송해야 할 총 네트워크 IP 패킷 수가 증가한다.

예를 들어, 전송할 데이터가 1MB인 경우, 이를 동일한 청크 32KB로 나누면 32개의 청크를 보내야 한다(32 * 32 = 1024),
동일한 1MB의 데이터를 64KB 보낸다면 16청크를 보내야 함(64 * 64  = 1024),
네트워크를 통해 전송 된 모든 패킷은 TCP/IP 동작으로 인해 약간의 오버 헤드가 발생하므로 32*32KB 패킷보다 16*64KB 패킷을 전송하는 것이 더 효율적이다.

따라서 이 매개 변수 수정에 대한 결정은 항상 네트워크 기능에 딸라 달라진다.
NFS 서버 및 클라이언트에 1 기가비트 포트가 있고 이 서버를 연결하는 네트워크 스위치가 해당 포트에서 1 기가 비트도 가능하면
이 매개 변소를 더 높은 값으로 저정하는 것이 좋다.

rsize, wsize 값 조정
mount 192.168.0.104:/data  /mnt -o rsize=65536,wsize=65536
또는
mount 192.168.0.104:/data  /mnt -o rsize=524288,wsize=524288

4096
8192
16384
35768
65536
524288

매개 변수 값을 테스트 해 최상의 값을 /etc/fstab 지정해 사용할 수 있다.

3.3.1 MTU 값
NIC의 MTU 값은 rsize 및 wsize 값이 8kb 이고 1500 바이트 mtu 크기를 사용하는 경우 최대 크기가 1500 바이트이므로 전송하는 동안 데이터가 조각화된다고 가정해야 한다.
mtu 크기가 9000 바이트로 수정하면 조각화없이 전체 8kb를 한 프레임으로 전송할 수 있다.
그러나 이렇게하면 서버와 클라이언트 사이의 모든 장치를 9000 mtu로 구성해야 한다.
여기에는 네트워크 스위치, 방화벽도 포함된다.
이렇게 하지 않으면 잘린 패킷과 장치 간 통신 손실이 발생할 수 있다.

카메라 mtu 값 변경.
보안장비 mtu 값 변경.
넷기어 스위치 mtu 값 변경.
시스코 장비 mtu 값 변경.

참고: mtu 크기를 변경하면 핸재 실행중인 응용 프로그램에 영향을 줄 수 있음.
일부 ISP는 지정된 MTU 크기보다 큰 프레임을 허용하지 않음.

보안장비 외부망은 DHCP 자동으로 활당 시키고,
뒤 로컬망 MTU 변경.

3.3.2 timeo및 retransNFS의 옵션
위에 설명 되어 지만 조금더 깊게 들어가 본다.

위 두 옵션은 서버가 응답이 지연되거나 서버에서 응답이 없는 경우 클라이언트가 서버로 재 시도하는 횟수에 영향을 준다.
timeoNFS의 옵션은 클라이언트가 패킷을 재전송해야한다는 결론을 내리기 전에 대기해야하는 시간을 결정
기본값은 0.7입니다 (초당 10 분의 1로 계산된다.
따라서 5 timeo 값을 지정하면 클라이언트가 5/10 초 동안 기다렸다가 패킷을 다시 보내야한다고 결정하게 된다.

두 번째 옵션 인 retrans는 클라이언트가 제한 시간을 초과 한 경우 (제공 한 timeo 초를 기다린 후) 클라이언트가 시도한 총 시도 횟수를 결정한다.
재전송 값을 3으로 지정하면 클라이언트는 서버를 사용할 수 없다는 결론을 내리기 전에 RPC 패킷을 3 번 (그리고 시간 초 동안 대기 할 때마다) 재전송한다.

mount 명령의 옵션으로 timeo 및 retrans 값을 수정가능
mount 192.168.0.102:/data /mnt -o timeo=5,retrans=4

3.3.3 마운트 동기 및 비동기
클라이언트 요청시 버서에서 데이터를 쓰는 방법을 결정한다.

둘 다 장점과 단점이 있다.

NFS 마운트의 동기화 및 비동화가 무엇인지 이해를 해야 한다.
nFS 크라이언트에서 수행하는 작업은 RPC 동등한 적업으로 변환된다.
RPC 프로토콜을 사용하여 서버로 보낼 수 있다.

서버가 쓰기에 대한 RPC 작업을 reieves NFS에 비동기 옵션을 사용하는 경우,
첫음 진입은 VFS(가상 파일 시스템) 작업에서 기본 디스크 시스템에 데이터를 기록한다.

VFS 핸들러가 기본 디스크에 대한 쓰기 작업을 마친과 동시에 쓰기 작업이 완료되었다는 확인을 받기 전에 서버는 추가 RPC쓰기 작업을 수락 할 준비가 된다.
이 경우 NFS 서버는 쓰기 작업을 완료하는 데 필요한 시간을 줄여 쓰기 성능을 향상시킨다.

그러나 기본 디스크 시스템이 작업을 완료하기 전에 NFS 서버가 더 많은 쓰기 작업을 수락하기 때문에 이 방법으로 데이터가 손실되거나 손상 될 수 있다.

동기화 옵션을 사용하면 그 반대가 된다.
이 경우는 서버는 쓰기 작업이 성공적으로 완료된 후에만 응답한다(데이터에 완전히 기록된 후_

중요한 데이터를 다르는 경우 비동기 옵션을 사용하지 않는 것이 좋지만 데이터가 그렇게 중요하지 않은 경우 async를 선택하는 것이 좋다.

mount 192.168.0.101:/data /mnt -o rw,async

4. 최종적 시스템 선택
4.1 NFS 서버 설정
vi /etc/exports
/home/linuxlee/Shinobi/videos   172.16.1.0/255.255.255.0(rw,async,no_subtree_check)

4.2 커널 파라메터 설정.
echo 524288 > /proc/sys/net/core/wmem_default
echo 524288 > /proc/sys/net/core/wmem_max

// reboot 후에도 적용하려면
echo 'net.core.wmem_max=524288' >> /etc/sysctl.conf
echo 'net.core.rmem_max=524288' >> /etc/sysctl.conf

4.3 MTU 조정
이더넷 MTU는 1500 바이트이므로 이더넷 프레임에 포함 할 수있는 가장 큰 IP 패킷 (또는 다른 페이로드)은 1500 바이트이다.
이더넷 헤더에 26 바이트를 추가하면 최대 프레임 (MTU와 동일하지 않음)이 1526 바이트가 됨.
넷기어 장비는 이더넷 헤더를 기본으로 잡는다. 그래서 1526으로 되어있음.

"MTU"라는 용어는 계층 3에서 패킷의 최대 크기만을 정의하기위한 것마은 아니다.
계층 2 MTU를 참조한다.
IP 패킷 (계층 3)의 길이는 IP 헤더에서 16 비트 총 길이 필드의 최대 값으로 제한된다.
IPv4의 경우 최대 페이로드 크기는 65515이다.(= 2^16 - 1 - 20 bytes header).

결국 dhclinet로 적용되는 외부 아이피는, 그 값을 dhcpd에서 주기 때문에. 수동으로 설정해줘야 한다.
처음 정보를 변경할 때는 수동으로 명령을 입력해줘야 한다.
dhcp 상위망 연동 때문에.

ip link show eth0
ip link set eth0 mtu 9000
ip link show eth0

만약 보안장비에서 dhcpd 설정시
템블릿 파일을 수정해 값을 변경할 수가 있다.

subnet.mas 파일 수정
option interface-mtu 9000; 추가.

subnet 192.168.0.0 netmask 255.255.255.0 {
  option broadcast-address 192.168.0.255;
  option routers 192.168.0.1;
  option interface-mtu 9000; ---> 이 값으로 변경.
}

5. 리눅스 마운트 방법.
5.1 클라이언트 설치.
sudo apt-get install nfs-common

4.2 마운트 디렉토리 생성.
sudo mkdir -p /mnt/sharedfolder_client

5.3 마운트
sudo mount serverIP:/exportFolder_server /mnt/mountfolder_client
sudo mount 192.168.100.5:/mnt/sharedfolder /mnt/sharedfolder_client

sudo mount.nfs4 서버주소.com:/서버/마운트/위치 /클라이언트/마운트/위치
sudo mount.nfs4 ranko.local:/mnt/NAS-HGST-1TB /mnt/NFS/ranko@NAS-HGST-1TB/


속도 테스트
dd if=/dev/zero of=/mnt/NFS/ranko@NAS-HGST-1TB/TMP/output bs=1M count=1000

6. 윈도우즈 MTU 설정
윈도우 7 MTU 값에 변경시 네트워크 데이터 문제 발생.
변경시 많은 예외 처리가 있어야 함.

cmd

기존 설정 확인.
netsh interface ipv4 show interfaces
10          25        1500  disconnected  로컬 영역 연결* 2

수정
10 ID 값이 디바이스 선택.
netsh interface ipv4 set subinterface "10" mtu=9000 store=persistent

적용 설정 확인
netsh interface ipv4 show interfaces

댓글 없음:

댓글 쓰기