ESXi의 NFS 데이터 저장소에서 특정 VM에 의해 트리거되는 약 5 초의 fsync 대기 시간이 발생합니다. 가상 IDE 드라이브에서는 발생하지 않기 때문에 NCQ / TCQ를 사용하는 VM으로 인한 것일 수 있습니다.
fsync-tester (Ted Ts'o 제작)와 ioping을 사용하여 재현 할 수 있습니다 . 예를 들어 8GB 디스크와 함께 Grml 라이브 시스템을 사용하는 경우 :
Linux 2.6.33-grml64:
root@dynip211 /mnt/sda # ./fsync-tester
fsync time: 5.0391
fsync time: 5.0438
fsync time: 5.0300
fsync time: 0.0231
fsync time: 0.0243
fsync time: 5.0382
fsync time: 5.0400
[... goes on like this ...]
밀리 초가 아닌 5 초입니다. 이것은 동일한 호스트 및 데이터 저장소에서 실행되는 다른 VM에서 IO 대기 시간을 생성합니다 .
root@grml /mnt/sda/ioping-0.5 # ./ioping -i 0.3 -p 20 .
4096 bytes from . (reiserfs /dev/sda): request=1 time=7.2 ms
4096 bytes from . (reiserfs /dev/sda): request=2 time=0.9 ms
4096 bytes from . (reiserfs /dev/sda): request=3 time=0.9 ms
4096 bytes from . (reiserfs /dev/sda): request=4 time=0.9 ms
4096 bytes from . (reiserfs /dev/sda): request=5 time=4809.0 ms
4096 bytes from . (reiserfs /dev/sda): request=6 time=1.0 ms
4096 bytes from . (reiserfs /dev/sda): request=7 time=1.2 ms
4096 bytes from . (reiserfs /dev/sda): request=8 time=1.1 ms
4096 bytes from . (reiserfs /dev/sda): request=9 time=1.3 ms
4096 bytes from . (reiserfs /dev/sda): request=10 time=1.2 ms
4096 bytes from . (reiserfs /dev/sda): request=11 time=1.0 ms
4096 bytes from . (reiserfs /dev/sda): request=12 time=4950.0 ms
첫 번째 VM을 로컬 스토리지로 옮기면 완벽하게 정상으로 보입니다.
root@dynip211 /mnt/sda # ./fsync-tester
fsync time: 0.0191
fsync time: 0.0201
fsync time: 0.0203
fsync time: 0.0206
fsync time: 0.0192
fsync time: 0.0231
fsync time: 0.0201
[... tried that for one hour: no spike ...]
내가 시도한 것은 아무런 차이가 없었습니다.
- 여러 ESXi 빌드 테스트 : 381591, 348481, 260247
- 다른 하드웨어, 다른 Intel 및 AMD 박스에서 테스트
- 다른 NFS 서버로 테스트 한 결과 모두 동일한 동작을 보여줍니다.
- OpenIndiana b147 (ZFS 동기화 항상 또는 비활성화 : 차이 없음)
- OpenIndiana b148 (ZFS 동기화 항상 또는 비활성화 : 차이 없음)
- Linux 2.6.32 (동기 또는 비동기 : 차이 없음)
- NFS 서버가 동일한 시스템 (가상 스토리지 어플라이언스) 또는 다른 호스트에있는 경우에는 차이가 없습니다.
게스트 OS 테스트, 문제 표시 :
- Windows 7 64 비트 (CrystalDiskMark를 사용하면 대기 시간 스파이크가 대부분 준비 단계에서 발생 함)
- 리눅스 2.6.32 (fsync-tester + ioping)
- 리눅스 2.6.38 (fsync-tester + ioping)
Linux 2.6.18 VM에서이 문제를 재현 할 수 없습니다.
또 다른 해결 방법은 가상 IDE 디스크 (SCSI / SAS)를 사용하는 것이지만 성능과 VM 당 드라이브 수를 제한합니다.
2011-06-30 업데이트 :
응용 프로그램이 fsync 전에 여러 개의 작은 블록으로 쓰면 지연 시간이 더 자주 발생하는 것 같습니다. 예를 들어 fsync-tester는 다음을 수행합니다 (추적 출력).
pwrite(3, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"..., 1048576, 0) = 1048576
fsync(3) = 0
ioping은 파일을 준비하는 동안이를 수행합니다.
[lots of pwrites]
pwrite(3, "********************************"..., 4096, 1036288) = 4096
pwrite(3, "********************************"..., 4096, 1040384) = 4096
pwrite(3, "********************************"..., 4096, 1044480) = 4096
fsync(3) = 0
ioping의 설정 단계는 거의 항상 중단되는 반면 fsync-tester는 정상적으로 작동합니다. fsync-tester를 업데이트하여 여러 개의 작은 블록을 쓸 수 있습니까? 내 C 기술은 빨아;)
2011-07-02 업데이트 :
iSCSI에서는이 문제가 발생하지 않습니다. OpenIndiana COMSTAR iSCSI 서버로 시도했습니다. 그러나 iSCSI를 사용하면 VMDK 파일에 쉽게 액세스 할 수 없으므로 스냅 샷과 rsync를 사용하여 호스트간에 파일을 이동할 수 있습니다.
2011-07-06 업데이트 :
이것은 동일한 vSwitch의 세 번째 VM에 의해 캡처 된 wireshark 캡처의 일부입니다. 이 모든 것은 물리적 호스트가없는 동일한 호스트에서 발생합니다.
20 시간 경에 아이오 핑을 시작했습니다. 5 초 지연이 끝날 때까지 패킷이 전송되지 않았습니다.
No. Time Source Destination Protocol Info
1082 16.164096 192.168.250.10 192.168.250.20 NFS V3 WRITE Call (Reply In 1085), FH:0x3eb56466 Offset:0 Len:84 FILE_SYNC
1083 16.164112 192.168.250.10 192.168.250.20 NFS V3 WRITE Call (Reply In 1086), FH:0x3eb56f66 Offset:0 Len:84 FILE_SYNC
1084 16.166060 192.168.250.20 192.168.250.10 TCP nfs > iclcnet-locate [ACK] Seq=445 Ack=1057 Win=32806 Len=0 TSV=432016 TSER=769110
1085 16.167678 192.168.250.20 192.168.250.10 NFS V3 WRITE Reply (Call In 1082) Len:84 FILE_SYNC
1086 16.168280 192.168.250.20 192.168.250.10 NFS V3 WRITE Reply (Call In 1083) Len:84 FILE_SYNC
1087 16.168417 192.168.250.10 192.168.250.20 TCP iclcnet-locate > nfs [ACK] Seq=1057 Ack=773 Win=4163 Len=0 TSV=769110 TSER=432016
1088 23.163028 192.168.250.10 192.168.250.20 NFS V3 GETATTR Call (Reply In 1089), FH:0x0bb04963
1089 23.164541 192.168.250.20 192.168.250.10 NFS V3 GETATTR Reply (Call In 1088) Directory mode:0777 uid:0 gid:0
1090 23.274252 192.168.250.10 192.168.250.20 TCP iclcnet-locate > nfs [ACK] Seq=1185 Ack=889 Win=4163 Len=0 TSV=769821 TSER=432716
1091 24.924188 192.168.250.10 192.168.250.20 RPC Continuation
1092 24.924210 192.168.250.10 192.168.250.20 RPC Continuation
1093 24.924216 192.168.250.10 192.168.250.20 RPC Continuation
1094 24.924225 192.168.250.10 192.168.250.20 RPC Continuation
1095 24.924555 192.168.250.20 192.168.250.10 TCP nfs > iclcnet_svinfo [ACK] Seq=6893 Ack=1118613 Win=32625 Len=0 TSV=432892 TSER=769986
1096 24.924626 192.168.250.10 192.168.250.20 RPC Continuation
1097 24.924635 192.168.250.10 192.168.250.20 RPC Continuation
1098 24.924643 192.168.250.10 192.168.250.20 RPC Continuation
1099 24.924649 192.168.250.10 192.168.250.20 RPC Continuation
1100 24.924653 192.168.250.10 192.168.250.20 RPC Continuation
두 번째 업데이트 2011-07-06 :
TCP 창 크기에 영향을주는 것 같습니다. FreeBSD 기반 FreeNAS를 NFS 서버로 사용하여이 문제를 재현 할 수 없었습니다. wireshark 캡처는 정기적으로 29127 바이트로 TCP 창 업데이트를 보여주었습니다. OpenIndiana에서는 기본적으로 더 큰 창 크기를 사용하지 않습니다.
OpenIndiana에서 다음 옵션을 설정하고 NFS 서버를 다시 시작하면 더 이상이 문제를 재현 할 수 없습니다.
ndd -set /dev/tcp tcp_recv_hiwat 8192 # default is 128000
ndd -set /dev/tcp tcp_max_buf 1048575 # default is 1048576
그러나 이것은 성능을 저하시킵니다. / dev / zero에서 dd_rescue가있는 파일에 쓰는 것은 170MB / s에서 80MB / s로 진행됩니다.
2011-07-07 업데이트 :
이 tcpdump 캡처를 업로드했습니다 (wireshark로 분석 가능). 이 경우 192.168.250.2는 NFS 서버 (OpenIndiana b148)이고 192.168.250.10은 ESXi 호스트입니다.
이 캡처 중에 테스트 한 사항 :
"ioping -w 5 -i 0.2"시작 시간 30, 설정에서 5 초 정지, 시간 40에서 완료.
"ioping -w 5 -i 0.2"시작 시간 60, 설정에서 5 초 정지, 시간 70에서 완료.
다음 출력과 함께 시간 90에서 "fsync-tester"가 시작되고 시간 120에서 중지되었습니다.
fsync time: 0.0248
fsync time: 5.0197
fsync time: 5.0287
fsync time: 5.0242
fsync time: 5.0225
fsync time: 0.0209
두 번째 업데이트 2011-07-07 :
다른 NFS 서버 VM을 테스트했는데 이번에는 NexentaStor 3.0.5 커뮤니티 에디션 : 동일한 문제를 보여줍니다.
2011-07-31 업데이트 :
새 ESXi 빌드 4.1.0.433742에서도이 문제를 재현 할 수 있습니다.