ZFS로 구성한 볼륨을 iSCSI로 Targetting하고 다른 Clinet에서 iSCSI Initiator로 접근, 마운트하여 단순 테스트를 하는데 10GbE iSCSI로 구성된 네트웍속도가 제대로 나오지 않는듯해서 이렇게 글을 올려봅니다.
환경 구성정보
- ZFS Appliance: XigmaNAS 11.2.0.4
- Client: CentOS 6.10 (iscsi-initiator-utils-6.2.0.873-27.0.3.el6_9.x86_64)
- ZFS Disk: 2TB SAS 3.5" 7K x 5개로 ZFS Stripping (w/o cache, log)
- 10GbE NIC: (ZFS Server) Chelsio T520-LL-CR, (Client) Intel 10G AF, MikroTik CRS317
XigmaNAS의 10GbE 관련 주요 Network parameters
kern.ipc.maxsockbuf=33554432
net.inet.tcp.recvbuf_inc=524288
net.inet.tcp.recvbuf_max=33554432
net.inet.tcp.recvspace=4194304
net.inet.tcp.sendbuf_inc=524288
net.inet.tcp.senduf_max=33554432
net.inet.tcp.sendspace=4194304
(Client인 CentOS 6.10의 관련 네트웍 파라메터도 유사하게 설정됨)
Client에서 ZFS 연동
iSCSI Initiator로 연동하여 EXT4로 포맷하고 마운트 처리. 즉,
mkfs -t ext4 -b 4096 /dev/mapper/330000000c59dbf35
mount -t ext4 /dev/mapper/330000000c59dbf35 /disk11
테스트 결과 #1 (Clinet에서 iSCSI 스토리지의 DD테스트)
Disk Write에 대해서 테스트 수행한 결과이며, bs값을 변경하여 테스트 진행한 결과이며, 이 시점에서 10GbE Network의 대역폭을 모니터링한 화면입니다.
[root@svms4 disk11]# dd if=/dev/zero of=/disk11/ddfile bs=64k count=100k
102400+0 records in
102400+0 records out
6710886400 bytes (6.7 GB) copied, 65.805 s, 102 MB/s
[root@svms4 disk11]# dd if=/dev/zero of=/disk11/ddfile2 bs=128k count=100k
102400+0 records in
102400+0 records out
13421772800 bytes (13 GB) copied, 130.645 s, 103 MB/s
테스트 결과 #2 (ZFS Local에서 ZFS Pool에 대한 DD테스트)
참고로 이 상황에서 ZFS Local에서 ZFS Pool인 hpool1에 대해서 DD 테스트한 결과는 아래와 같이 대단한 처리량을 보여주고 있습니다.
snas9: hpool1# dd if=/dev/zero of=/mnt/hpool1/ddfile bs=64k count=100k
102400+0 records in
102400+0 records out
6710886400 bytes transferred in 5.935975 secs (1130544904 bytes/sec)
snas9: hpool1#
snas9: hpool1# dd if=/dev/zero of=/mnt/hpool1/ddfile2 bs=128k count=100k
102400+0 records in
102400+0 records out
13421772800 bytes transferred in 10.619236 secs (1263911337 bytes/sec)
결론적으로 궁금한 점은
왜 10GbE의 속도가 100MB/s 이상을 넘지 못하는가입니다. 아무리 못해도 500MB/s 전후로 나와줘야 할듯 한데요.
실제로 Samsung 850 Pro NVME PCIE 인터페이스 2개를 ZFS Stripping으로 묶어서 테스트해도 네트웍 속도는 별반 차이가 없더라구요.
리눅스 위에서 ZFS 테스트 하였을땐 그다지 좋지 않았습니다..
http://2cpu.co.kr/bbs/new_view.php?bo_table=lec&wr_id=2862&qstr=
도움 되신다면 좋겠네용
그리고 지금 확인하고자 하는 내용은 ZFS의 문제가 아니라 Client들(Linux, Windows, 기타 등등)이 iSCSI를 이용하여 ZFS Storage를 가져다가 쓸 경우 Disk Write의 속도가 나오지 않아서, 그리고 그 문제가 iSCSI의 문제인듯하고... 이에 대해서 어려움을 겪고 있어요.
저기 스샷들이 iscsi나 nfs로 붙여서 테스트 한겁니다..
esxi에 붙여서 가상머신 만들고 그 안에서 속도 측정한거에용..
nas4free 제약사항? 같은게 아닐까용..
[root@svms4 disk11]# iperf3 -c192.168.20.9 -i1 b10G -t10
Connecting to host 192.168.20.9, port 5201
[ 4] local 192.168.20.4 port 42050 connected to 192.168.20.9 port 5201
[ ID] Interval Transfer Bandwidth Retr Cwnd
[ 4] 0.00-1.00 sec 1.06 GBytes 9.06 Gbits/sec 0 734 KBytes
[ 4] 1.00-2.00 sec 1.06 GBytes 9.13 Gbits/sec 0 813 KBytes
[ 4] 2.00-3.00 sec 1.15 GBytes 9.90 Gbits/sec 0 918 KBytes
[ 4] 3.00-4.00 sec 1.15 GBytes 9.90 Gbits/sec 0 1022 KBytes
[ 4] 4.00-5.00 sec 1.15 GBytes 9.90 Gbits/sec 0 1.12 MBytes
[ 4] 5.00-6.00 sec 1.15 GBytes 9.90 Gbits/sec 0 1.31 MBytes
[ 4] 6.00-7.00 sec 1.15 GBytes 9.91 Gbits/sec 0 1.46 MBytes
[ 4] 7.00-8.00 sec 1.15 GBytes 9.90 Gbits/sec 0 1.46 MBytes
[ 4] 8.00-9.00 sec 1.15 GBytes 9.91 Gbits/sec 0 1.46 MBytes
[ 4] 9.00-10.00 sec 1.15 GBytes 9.90 Gbits/sec 0 1.46 MBytes
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval Transfer Bandwidth Retr
[ 4] 0.00-10.00 sec 11.3 GBytes 9.74 Gbits/sec 0 sender
[ 4] 0.00-10.00 sec 11.3 GBytes 9.74 Gbits/sec receiver
iperf Done.
1. iSCSI Target은 서버단에서 Cacheing을 하지 않습니다.
2. 데이터 cacheing을 하지 하지 않기 때문에 target이 data를 write할때 바로 device에 write를 해야합니다.
3. iSCSI target이 storage device로 사용하는데는 1. Memory, 2. Disk Device, 3. File Device
4. NAS4Free (대부분의 NAS)에서는 3번 File Device를 사용하는데 iSCSI는 이 File Device를 DISK Device인것 처럼 emulation을 합니다. 여기서 20-30%의 성능 감소가 일어납니다. (Target to DISK에서)
또한 File Device임에도 Caching을 못하기 때문에 다시 20%이상의 성능 감소가 일어납니다. (Target to DISK에서)
5. Linux에서 ZFS를 사용하는 방법이 ZFS Kernel Module을 사용하는 방법과 ZFS on FUSE 방식이 있습니다.
설치하신 ZFS는 ZFS on FUSE입니다.
6. 즉, iSCSI가 이미 File을 DISK Device로 emulation을 하는데 그 File이 Native File System도 아니고 FUSE File System입니다. 여기서 다시한번 emulation과 file data에 대한 memory copy가 일어납니다.
7. ZFS on FUSE가 느린 이유중에 하나가 COW (Copy on Write)를 보장해야 하기 때문에 FUSE에서 제공하는 cache 기능을 전혀 사용할 수 없는겁니다.
위 내용들 다 더하면 Linux 기반의 iscsi on zfs 가 왜 느릴지 알 수 있습니다.
또한 일반 iscsi target보다 CPU도 많이 사용합니다.
그러나 저가 설명이 부족한 것인지, 혹은 이해 부족인지 모르지만 내용은 다시 한 번 정리를 해야 할 듯 합니다.
1) NAS4Free에서는 iSCSI의 Target을 설정시 ZFS의 Volume을 Extent로 설정하고, iSCSI의 Target은 'Disk' 타입으로 Extent에서 잡은 Storage를 LUN에 매핑하지요. 아마도 이때 'Disk' 타입 부분이 선생님이 성능 하락이 발생한다고 언급하신 File device를 Disk device로 emulation하는 것이 아닌가 싶습니다.
2) 앞서 언급한 CentOS는 단지 iSCSI Initiator를 이용하여 NAS4Free에서 생성한 Storage 자원을 사용하기 위한 Client에 불가합니다. Linux인 CentOS에서 ZFS를 구성하는 것은 아니기에 'ZFS on FUSE' 혹은 'ZFS on Linux'는 아닙니다. 저 또한 Linux에서 ZFS를 사용할 생각은 전혀 없습니다.
3) 깊지 않은 테스트에 기인할 수도 있겠으나 테스트 결과만을 놓고 보면 10GbE 네트웍에서 데이터 전송 대역이 약 100MB/s에서 병목인듯 보입니다. 이는 ZFS Pool에서 직접 DD로 수행한 결과와 비교해보면 아무리 Disk Cache 불가로 인한 성능 저하를 고려하더라도 말입니다 (참고로 Client인 Linux에서 dd 수행시 'oflag=direct' 옵션을 주지 않고 Client의 메모리 캐쉬를 사용하도록 하여 보다 빠르게 Writing했음에도 불구하고..)
4) 선생님 말대로라면 Disk Writing 측면에서만 고려해 볼 경우에 SAN이나 RAID로 구성한 DAS 형태보다 iSCSI의 장점은 없는 것이 되는걸까요?
Initiator 단에서 ZFS를 사용하지 않으실 계획인건 잘 알겠습니다.
추천하는 방식은 아니지만 NAS4Free에서 ZFS를 Kernel Module로 해보시는것도 가능합니다.
그래야 어디가 문제인지 좀더 뭐위를 줄을 수 있을것 같습니다
4) 성능 측면으로만 보면 당연히 SAN이나 DAS가 더 좋겠죠. 물론 SAN도 SAN 나름이겠지만 보통 iSCSI보다는 더 좋다고 보시는게 맞습니다.
ZFS on FUSE가 아니라 ZFS.ko kernel module을 사용하면 됩니다.
bandwidth야 큰 차이가 없겠지만 random IO나 작은 IO (4K 미만)은 큰 차이가 납니다.
물론 나중에 kernel upgrade등을 하면 제앙이 발생 할 수 있어서 대부분의 NAS들이 사용하지 않는겁니다.