성태의 닷넷 이야기
홈 주인
모아 놓은 자료
프로그래밍
질문/답변
사용자 관리
사용자
메뉴
아티클
외부 아티클
유용한 코드
온라인 기능
MathJax 입력기
최근 덧글
[정성태] Working with Rust Libraries from C#...
[정성태] Detecting blocking calls using asyn...
[정성태] 아쉽게도, 커뮤니티는 아니고 개인 블로그입니다. ^^
[정성태] 질문이 잘 이해가 안 됩니다. 우선, 해당 소스코드에서 ILis...
[양승조
] var대신 dinamic으로 선언해서 해결은 했습니다. 맞는 해...
[양승조
] 또 막혔습니다. ㅠㅠ var list = props[i].Ge...
[양승조
] 아. 감사합니다. 어제는 안됐던것 같은데....정신을 차려야겠네...
[정성태] "props[i].GetValue(props[i])" 코드에서 ...
[정성태] 저렇게 조각 코드 말고, 실제로 재현이 되는 예제 프로젝트를 압...
[정성태] Modules 창(Ctrl+Shift+U)을 띄워서, 해당 Op...
글쓰기
제목
이름
암호
전자우편
HTML
홈페이지
유형
제니퍼 .NET
닷넷
COM 개체 관련
스크립트
VC++
VS.NET IDE
Windows
Team Foundation Server
디버깅 기술
오류 유형
개발 환경 구성
웹
기타
Linux
Java
DDK
Math
Phone
Graphics
사물인터넷
부모글 보이기/감추기
내용
<div style='display: inline'> <h1 style='font-family: Malgun Gothic, Consolas; font-size: 20pt; color: #006699; text-align: center; font-weight: bold'>Wireshark로 확인하는 LSO(Large Send Offload), RSC(Receive Segment Coalescing) 옵션</h1> <p> 지난번에 윈도우 환경에서 MSS 패킷 테스트를 하면서,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Wireshark + C#으로 확인하는 TCP 통신의 MSS(Maximum Segment Size) - 윈도우 환경 ; <a target='tab' href='https://www.sysnet.pe.kr/2/0/12528#lso_option'>https://www.sysnet.pe.kr/2/0/12528#lso_option</a> </pre> <br /> 가령, send(10KB)를 하면 다음과 같이 MSS=1460 크기를 (리눅스와는 달리) 무시하고,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > // 3-way handshake 1 0.000000 ..client_ip... ..server_ip... TCP 66 2872 → 15000 [SYN] Seq=0 Win=64240 Len=0 <span style='color: blue; font-weight: bold'>MSS=1460</span> WS=256 SACK_PERM=1 2 0.004824 ..server_ip... ..client_ip... TCP 66 15000 → 2872 [SYN, ACK] Seq=0 Ack=1 Win=65535 Len=0 <span style='color: blue; font-weight: bold'>MSS=1460</span> WS=256 SACK_PERM=1 3 0.004898 ..client_ip... ..server_ip... TCP 54 2872 → 15000 [ACK] Seq=1 Ack=1 Win=262656 Len=0 // send(10KB) <span style='color: blue; font-weight: bold'>4 1.722068 ..client_ip... ..server_ip... TCP 10294 2872 → 15000 [PSH, ACK] Seq=1 Ack=1 Win=262656 Len=10240</span> 5 1.726845 ..server_ip... ..client_ip... TCP 60 15000 → 2872 [ACK] Seq=1 Ack=2921 Win=131328 Len=0 6 1.726845 ..server_ip... ..client_ip... TCP 60 15000 → 2872 [ACK] Seq=1 Ack=5841 Win=131328 Len=0 7 1.728553 ..server_ip... ..client_ip... TCP 60 15000 → 2872 [ACK] Seq=1 Ack=8761 Win=131328 Len=0 8 1.728553 ..server_ip... ..client_ip... TCP 60 15000 → 2872 [ACK] Seq=1 Ack=10241 Win=131328 Len=0 </pre> <br /> 10KB 데이터를 통째로 하나의 패킷으로 캡처되는 것을 확인할 수 있었습니다. 원인이 뭘까 궁금해서 네트워크 어댑터의 옵션 창을 살펴봤더니 왠지 느낌이 오는 옵션이 하나 있습니다. ^^<br /> <br /> <img alt='rsc_network_setting_0.png' src='/SysWebRes/bbs/rsc_network_setting_0.png' /><br /> <br /> "Large Send Offload Version 2"라는 이름에서 벌써 신뢰를 주는데요, 설명을 보면 정확히 저 현상으로 해석이 됩니다.<br /> <br /> <div style='BACKGROUND-COLOR: #ccffcc; padding: 10px 10px 5px 10px; MARGIN: 0px 10px 10px 10px; FONT-FAMILY: Malgun Gothic, Consolas, Verdana; COLOR: #005555'> LSO is a technology in which the work of segmenting data into network frames is performed by the network adapter instead of by the TCP/IP stack. With LSO, TCP/IP sends very large data packets down to the network adapter driver and the network adapter hardware. The network adapter separates the data into smaller network-sized frames.<br /> </div><br /> <br /> 즉, TCP/IP 스택을 구현한 device driver는 (MSS 단위로 분할하지 않은) 대형 TCP 패킷을 NIC 장치로 내려보낼 수 있다는 것으로, 따라서 NIC 장치가 MSS 단위로 분할해 송신하는 작업을 대행해 주기 때문에 CPU의 부담을 덜어줄 수 있는 기술입니다.<br /> <br /> 정말 그런지 테스트를 해봐야겠지요. ^^<br /> <br /> 이 옵션을 네트워크 속성 창에서 제어하는 것도 가능하지만 PowerShell을 이용할 수도 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Enable-NetAdapterLso ; <a target='tab' href='https://learn.microsoft.com/en-us/powershell/module/netadapter/enable-netadapterlso'>https://learn.microsoft.com/en-us/powershell/module/netadapter/enable-netadapterlso</a> Disable-NetAdapterLso ; <a target='tab' href='https://learn.microsoft.com/en-us/powershell/module/netadapter/disable-netadapterlso'>https://learn.microsoft.com/en-us/powershell/module/netadapter/disable-netadapterlso</a> Get-NetAdapterLso ; <a target='tab' href='https://learn.microsoft.com/en-us/powershell/module/netadapter/get-netadapterlso'>https://learn.microsoft.com/en-us/powershell/module/netadapter/get-netadapterlso</a> </pre> <br /> 따라서 다음과 같이 비활성화시키면,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > PS C:\WINDOWS\system32> <span style='color: blue; font-weight: bold'>Get-NetAdapterLso -Name "*"</span> Name Version V1IPv4Enabled IPv4Enabled IPv6Enabled ---- ------- ------------- ----------- ----------- Ethernet LSO Version 2 False True True vEthernet (MyTestHyperVsw) LSO Version 2 False <span style='color: blue; font-weight: bold'>True True</span> PS C:\WINDOWS\system32> <span style='color: blue; font-weight: bold'>Disable-NetAdapterLso -Name "vEthernet (MyTestHyperVsw)"</span> PS C:\WINDOWS\system32> <span style='color: blue; font-weight: bold'>Get-NetAdapterLso -Name "*"</span> Name Version V1IPv4Enabled IPv4Enabled IPv6Enabled ---- ------- ------------- ----------- ----------- Ethernet LSO Version 2 False True True vEthernet (MyTestHyperVsw) LSO Version 2 False <span style='color: blue; font-weight: bold'>False False</span> </pre> <br /> 잠깐 네트워크 연결이 리셋되고는, 이후 동일하게 send(10KB)하면 다음과 같이 MSS 단위로 보기 좋게 패킷이 캡처되는 것을 확인할 수 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > 1 0.000000 ..client_ip... ..server_ip... TCP 66 2606 → 15000 [SYN] Seq=0 Win=64240 Len=0 <span style='color: blue; font-weight: bold'>MSS=1460</span> WS=256 SACK_PERM=1 2 0.004987 ..server_ip... ..client_ip... TCP 66 15000 → 2606 [SYN, ACK] Seq=0 Ack=1 Win=65535 Len=0 <span style='color: blue; font-weight: bold'>MSS=1460</span> WS=256 SACK_PERM=1 3 0.005055 ..client_ip... ..server_ip... TCP 54 2606 → 15000 [ACK] Seq=1 Ack=1 Win=262656 Len=0 4 1.266381 ..client_ip... ..server_ip... TCP 1514 2606 → 15000 [ACK] Seq=1 Ack=1 Win=262656 <span style='color: blue; font-weight: bold'>Len=1460</span> 5 1.266381 ..client_ip... ..server_ip... TCP 1514 2606 → 15000 [ACK] Seq=1461 Ack=1 Win=262656 <span style='color: blue; font-weight: bold'>Len=1460</span> 6 1.266381 ..client_ip... ..server_ip... TCP 1514 2606 → 15000 [ACK] Seq=2921 Ack=1 Win=262656 <span style='color: blue; font-weight: bold'>Len=1460</span> 7 1.266381 ..client_ip... ..server_ip... TCP 1514 2606 → 15000 [ACK] Seq=4381 Ack=1 Win=262656 <span style='color: blue; font-weight: bold'>Len=1460</span> 8 1.266381 ..client_ip... ..server_ip... TCP 1514 2606 → 15000 [ACK] Seq=5841 Ack=1 Win=262656 <span style='color: blue; font-weight: bold'>Len=1460</span> 9 1.266381 ..client_ip... ..server_ip... TCP 1514 2606 → 15000 [ACK] Seq=7301 Ack=1 Win=262656 <span style='color: blue; font-weight: bold'>Len=1460</span> 10 1.266381 ..client_ip... ..server_ip... TCP 1514 2606 → 15000 [ACK] Seq=8761 Ack=1 Win=262656 <span style='color: blue; font-weight: bold'>Len=1460</span> 11 1.266381 ..client_ip... ..server_ip... TCP 74 2606 → 15000 [PSH, ACK] Seq=10221 Ack=1 Win=262656 Len=20 12 1.273309 ..server_ip... ..client_ip... TCP 60 15000 → 2606 [ACK] Seq=1 Ack=2921 Win=131328 Len=0 13 1.273309 ..server_ip... ..client_ip... TCP 60 15000 → 2606 [ACK] Seq=1 Ack=5841 Win=131328 Len=0 14 1.273309 ..server_ip... ..client_ip... TCP 60 15000 → 2606 [ACK] Seq=1 Ack=8761 Win=131328 Len=0 15 1.273309 ..server_ip... ..client_ip... TCP 60 15000 → 2606 [ACK] Seq=1 Ack=10241 Win=131328 Len=0 </pre> <br /> 테스트가 끝나면 돌려놓는 것도 잊지 마시고. ^^<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > PS C:\WINDOWS\system32> <span style='color: blue; font-weight: bold'>Enable-NetAdapterLso -Name "vEthernet (MyTestHyperVsw)"</span> </pre> <br /> 그러고 보니, 리눅스에서는 그냥 MSS 단위로 보냈던 것은 아마도 <a target='tab' href='https://www.sysnet.pe.kr/0/0/280'>해당 PC가 구형</a>이어서 그 시절의 NIC 카드에는 LSO 기능이 없어서 그런 것 같습니다.<br /> <br /> <hr style='width: 50%' /><br /> <br /> 기왕 시작했으니 네트워크 설정 창에 있는 다른 옵션도 살펴보겠습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Receive Segment Coalescing (RSC) ; <a target='tab' href='https://learn.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2012-r2-and-2012/hh997024(v=ws.11)'>https://learn.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2012-r2-and-2012/hh997024(v=ws.11)</a> RSC in the vSwitch ; <a target='tab' href='https://learn.microsoft.com/en-us/windows-server/networking/technologies/hpn/rsc-in-the-vswitch'>https://learn.microsoft.com/en-us/windows-server/networking/technologies/hpn/rsc-in-the-vswitch</a> </pre> <br /> <img alt='rsc_network_setting_1.png' src='/SysWebRes/bbs/rsc_network_setting_1.png' /><br /> <br /> 전송 시에 LSO가 있다면 수신 시에 RSC가 있는 듯한데요, 다음의 문서를 보면,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Windows 가상 시스템의 VMXNET3 어댑터에서 LRO 사용 또는 사용 안 함 ; <a target='tab' href='https://docs.vmware.com/kr/VMware-vSphere/7.0/com.vmware.vsphere.networking.doc/GUID-ECC80415-442C-44E9-BA7A-852DDB174B9F.html'>https://docs.vmware.com/kr/VMware-vSphere/7.0/com.vmware.vsphere.networking.doc/GUID-ECC80415-442C-44E9-BA7A-852DDB174B9F.html</a> </pre> <br /> 다른 환경에서는 RSC라는 이름 대신 LRO라고 알려진 기술이라고 소개합니다. 실제로 설명을 보면, LSO의 대칭인 기술로 보입니다. ^^<br /> <br /> <div style='BACKGROUND-COLOR: #ccffcc; padding: 10px 10px 5px 10px; MARGIN: 0px 10px 10px 10px; FONT-FAMILY: Malgun Gothic, Consolas, Verdana; COLOR: #005555'> Receive segment coalescing (RSC). RSC takes multiple packets received within the same interrupt period and combines the packets into a single large package to be processed by the network stack. <br /> </div><br /> <br /> 이 옵션도 Powershell로 제어 가능하고,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Get-NetAdapterRsc ; <a target='tab' href='https://learn.microsoft.com/en-us/powershell/module/netadapter/get-netadapterrsc'>https://learn.microsoft.com/en-us/powershell/module/netadapter/get-netadapterrsc</a> Disable-NetAdapterRsc ; <a target='tab' href='https://learn.microsoft.com/en-us/powershell/module/netadapter/disable-netadapterrsc'>https://learn.microsoft.com/en-us/powershell/module/netadapter/disable-netadapterrsc</a> Enable-NetAdapterRsc ; <a target='tab' href='https://learn.microsoft.com/en-us/powershell/module/netadapter/enable-netadapterrsc'>https://learn.microsoft.com/en-us/powershell/module/netadapter/enable-netadapterrsc</a> </pre> <br /> (disable/enable은 네트워크가 리셋되니 유의하시고) 사용법은 LSO 제어와 옵션 설정 방식이 같습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > PS C:\WINDOWS\system32> <span style='color: blue; font-weight: bold'>Get-NetAdapterRsc -Name "*"</span> Name IPv4Enabled IPv6Enabled IPv4Operational IPv6Operational IPv4FailureReason IPv6FailureR State State eason ---- ----------- ----------- --------------- --------------- ----------------- ------------ vEthernet (Default Switch) True True True True NoFailure NoFailure vEthernet (MyTestHyperVsw) True True <span style='color: blue; font-weight: bold'>True True</span> NoFailure NoFailure </pre> <br /> 기본값으로는 enable 상태인데, 실제로 테스트를 하면 wireshark에서 LSO처럼 합쳐진 패킷으로 안 보이고 MSS 단위로 개별 패킷이 캡처됩니다. 이상하군요, 약간의 짐작을 더해 보면 100%라고 말할 수는 없으나, 이 옵션의 활성 상태와 상관없이 해당 NIC 장치에서 이것을 지원해야만 하는 것으로 보입니다.<br /> <br /> 다음의 글을 보면,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Performance Tuning Windows 2012: Network Subsystem Part 1 ; <a target='tab' href='https://www.monitis.com/blog/performance-tuning-windows-2012-network-subsystempart-1/'>https://www.monitis.com/blog/performance-tuning-windows-2012-network-subsystempart-1/</a> </pre> <br /> RSC 관련 통계 값을 구하는 방법이 나오는데,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > PS C:\WINDOWS\system32> <span style='color: blue; font-weight: bold'>$x = Get-NetAdapterStatistics "vEthernet (MyTestHyperVsw)"</span> PS C:\WINDOWS\system32> <span style='color: blue; font-weight: bold'>$x.rscstatistics</span> CoalescedBytes : 0 CoalescedPackets : 0 CoalescingEvents : 0 CoalescingExceptions : 0 PSComputerName : </pre> <br /> 제 컴퓨터에서는 0으로만 나오고 있으므로 NIC 장치가 RSC를 지원하는 유형은 아닌 것 같습니다. 참고로, 윈도우에 hyper-v가 설치되어 있으면 그런 경우에도 RSC 지원이 호스트와 VM 머신 간에 달라지는 경우가 있다고 합니다.<br /> <br /> <div style='BACKGROUND-COLOR: #ccffcc; padding: 10px 10px 5px 10px; MARGIN: 0px 10px 10px 10px; FONT-FAMILY: Malgun Gothic, Consolas, Verdana; COLOR: #005555'> If the host adapter is not bound to the virtual switch, RSC is supported on the physical host. If the adapter is bound to the virtual switch, Windows 2012 will disable RSC on the physical host. RSC can be enabled for a virtual machine when SR-IOV is enabled. In this case, virtual functions will support RSC capability; hence, virtual machines will also get the benefit of RSC.<br /> </div><br /> <br /> 아쉽지만 wireshark에서의 재현은 나중으로 미뤄야겠습니다. ^^<br /> <br /> <hr style='width: 50%' /><br /> <a name='offload'></a> <br /> 근래에는 CPU의 부하를 줄이기 위해 어떻게든 통신 부하를 NIC(Network Interface Controller)에 전가하는 offload 기능들이 나오고 있습니다. 아래의 문서에서 이에 대한 설명을 담고 있으며,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Performance in Network Adapters ; <a target='tab' href='https://learn.microsoft.com/en-us/windows-hardware/drivers/network/performance-in-network-adapters'>https://learn.microsoft.com/en-us/windows-hardware/drivers/network/performance-in-network-adapters</a> TCP/IP Offload Overview ; <a target='tab' href='https://learn.microsoft.com/en-us/windows-hardware/drivers/network/tcp-ip-offload'>https://learn.microsoft.com/en-us/windows-hardware/drivers/network/tcp-ip-offload</a> TCP/IP Task Offload Overview ; <a target='tab' href='https://learn.microsoft.com/en-us/windows-hardware/drivers/network/task-offload'>https://learn.microsoft.com/en-us/windows-hardware/drivers/network/task-offload</a> </pre> <br /> 리눅스의 경우 다음과 같은 명령어로 기능의 on/off를 확인할 수 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > $ ethtool -k eth0 | grep offload tcp-segmentation-offload: on generic-segmentation-offload: on generic-receive-offload: on large-receive-offload: off rx-vlan-offload: on [fixed] tx-vlan-offload: on [fixed] l2-fwd-offload: off [fixed] hw-tc-offload: off [fixed] esp-hw-offload: off [fixed] esp-tx-csum-hw-offload: off [fixed] rx-udp_tunnel-port-offload: off [fixed] tls-hw-tx-offload: off [fixed] tls-hw-rx-offload: off [fixed] macsec-hw-offload: off [fixed] hsr-tag-ins-offload: off [fixed] hsr-tag-rm-offload: off [fixed] hsr-fwd-offload: off [fixed] hsr-dup-offload: off [fixed] </pre> </p><br /> <br /><hr /><span style='color: Maroon'>[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]</span> </div>
첨부파일
스팸 방지용 인증 번호
1032
(왼쪽의 숫자를 입력해야 합니다.)