ESXi는 VM으로부터 vNIC을 통해서 전송하는 Packet과 ESXi 외부에서 들어오는 Packet을 처리하는 Thread가 별도로 생성됩니다.
VM에서 vNIC을 통해 전송될 때 Network IO를 처리하는 Thread를 Tx Thread라고 부르고, 외부로부터 들어오는 Network IO를 처리하는 Thread는 Netpoll Thread라고 부릅니다.
Tx Thread를 통해서 VM이 vNIC을 통해 Virtual Switch로 Packet을 전송하면, 이 후에 Uplink로 전달된 Packet들은 Uplink의 Queue와 연관된 PNIC Tx Thread를 통해서 실제 pNIC으로 Packet을 Queue로부터 보내게 됩니다.
Tx Thread는 기본적으로 VM 별로 하나씩 생성되며, Netpool Thread는 pNIC 별로 하나씩 생성됩니다.
Tx와 Netpoll Thread는 IO 처리가 목적이기 때문에, VMKernel에서 일반적인 Thread인 World로 생성되지 않고, 더 높은 우선 순위를 가지는 Worldlet 이라는 특별한 Thread로 생성됩니다.
Tx Thread는 실제 생성될 때, NetWorld라는 이름을 가지며, 프로세스를 조회해서 개별 VM들이 사용하는 Tx Thread를 확인할 수 있습니다.
# ps -cPTgjstz WID CID WorldName GID PGID SID PCID Type State Wait CPU Time Command ... 2102737 0 NetWorld-VM-2102736 2102735 0 0 0 SA WAIT NET 0-63 5312.886294 ... |
Netpoll Thread의 경우에는 pNIC과 관련이 있기 때문에 Thread의 이름에 pNIC 이름이 붙게 됩니다.
# ps -cPTgjstz
WID CID WorldName GID PGID SID PCID Type State Wait CPU Time Command ... 2098121 0 vmnic0-pollWorldRxTx[00]-0x430093c2e8c0 2097153 0 0 0 S WAIT NET 0-63 744.965934 2098122 0 vmnic0-pollWorldRxTx[01]-0x430093c2f3c0 2097153 0 0 0 S WAIT NET 0-63 10.241449 2098123 0 vmnic0-pollWorldRxTx[02]-0x430093c2fec0 2097153 0 0 0 S WAIT NET 0-63 0.867526 2098124 0 vmnic0-pollWorldRxTx[03]-0x430093c309c0 2097153 0 0 0 S WAIT NET 0-63 6.937962 2098125 0 vmnic0-pollWorldRxTx[04]-0x430093c314c0 2097153 0 0 0 S WAIT NET 0-63 0.13 2098126 0 vmnic0-pollWorldRxTx[05]-0x430093c31fc0 2097153 0 0 0 S WAIT NET 0-63 0.12 2098127 0 vmnic0-pollWorldRxTx[06]-0x430093c32ac0 2097153 0 0 0 S WAIT NET 0-63 0.12 2098128 0 vmnic0-pollWorldRxTx[07]-0x430093c335c0 2097153 0 0 0 S WAIT NET 0-63 0.18 2098129 0 vmnic0-pollWorldRxTx[08]-0x430093c340c0 2097153 0 0 0 S WAIT NET 0-63 634.403272 2098130 0 vmnic0-pollWorldRxTx[09]-0x430093c34bc0 2097153 0 0 0 S WAIT NET 0-63 0.73235 2098131 0 vmnic0-pollWorldRxTx[10]-0x430093c356c0 2097153 0 0 0 S WAIT NET 0-63 0.74037 2098132 0 vmnic0-pollWorldRxTx[11]-0x430093c361c0 2097153 0 0 0 S WAIT NET 0-63 5.875612 ... |
마지막으로 PNIC Tx Thread는 실제 pNIC의 Queue 별로 생성되기 때문에 pNIC에서 Queue를 몇 개 지원하느냐에 따라서 생성되는 Thread의 개수가 달라지게 됩니다.
# ps -cPTgjstz WID CID WorldName GID PGID SID PCID Type State Wait CPU Time Command ... 2098485 0 vmnic0-0-tx 2097153 0 0 0 S WAIT NET 0-63 0.11 2098486 0 vmnic0-1-tx 2097153 0 0 0 S WAIT NET 0-63 0.6 2098487 0 vmnic0-2-tx 2097153 0 0 0 S WAIT NET 0-63 0.4 2098488 0 vmnic0-3-tx 2097153 0 0 0 S WAIT NET 0-63 0.7 2098489 0 vmnic0-4-tx 2097153 0 0 0 S WAIT NET 0-63 0.7 2098490 0 vmnic0-5-tx 2097153 0 0 0 S WAIT NET 0-63 0.6 2098491 0 vmnic0-6-tx 2097153 0 0 0 S WAIT NET 0-63 0.7 2098492 0 vmnic0-7-tx 2097153 0 0 0 S WAIT NET 0-63 0.7 2098493 0 vmnic0-8-tx 2097153 0 0 0 S WAIT NET 0-63 0.7 2098494 0 vmnic0-9-tx 2097153 0 0 0 S WAIT NET 0-63 0.6 2098495 0 vmnic0-10-tx 2097153 0 0 0 S WAIT NET 0-63 0.6 2098496 0 vmnic0-11-tx 2097153 0 0 0 S WAIT NET 0-63 0.6 |
이렇게 생성된 Thread 중에 Tx Thread와 Netpoll Thread는 성능 향상을 위해 Scaling이 가능합니다.
Tx Thread의 경우에는 위에서 말씀드린 NetWorld 라는 이름의 Thread로 생성이 되는데, 해당 Thread의 CPU 사용률이 지속적으로 높은 경우 Scaling을 고려해 볼 수 있습니다.
Tx Thread의 경우에는 기본적으로 VM 별로 하나의 Thread만 생성된다고 말씀드렸습니다.
하지만, Scaling을 위해서 VM이 사용하는 vNIC 별로 Thread를 추가 생성하거나, vNIC에서 사용할 수 있는 Queue 별로도 Thread를 추가 생성되도록 설정을 할 수 있습니다.
이는 VM Configuration에 있는 설정 값인 ethernetX.ctxPerDev를 이용하게 되며,
ethernetX.ctxPerDev=1이면 vNIC 별로 TX Thread를 생성하게 되고,
ethernetX.ctxPerDev=2이면 Queue 별로 Tx Thread를 생성하게 됩니다.
vNIC 별로 Tx Thread가 생성되는 경우에는 NetWorld Thread의 이름이 “225.NetWdt-Dev-33554450 or NetWorld-Dev-50331656-Tx" 식으로 생성되며,
Queue 별로 Tx Thread가 생성되는 경우에는 "NetWorld-Dev-50331656-0-Tx"(0은 Queue 번호) 식으로 이름을 부여하게 됩니다.
마찬가지로 Netpoll Thread의 경우에도 기본적으로 pNIC 별로 하나의 Thread만 생성되는데, 만약 pNIC이 NetQueue나 RSS 기능을 지원하는 경우에는 Queue 별로 Netpoll Thread가 생성될 수 있습니다.
참고로 수신된 Packet을 처리하는 Performance를 확인하기 위해서는 Netpoll Thread 자체가 아닌, Netpoll Thread를 통해 Packet을 수신 받고 있는 VM의 vmx 프로세스가 보여주는 %SYS metric 값을 봐야 합니다.
특정 VM의 vmx 프로세스가 보여주는 %SYS metric이 높은 경우에는 Network Packet을 수신 처리하는데 많은 자원을 사용하고 있다고 볼 수 있습니다.
'Networking' 카테고리의 다른 글
[Socket Programming #1] Server/Client based on TCP (0) | 2023.05.18 |
---|---|
TCP 3-way handshake fails due to missing routing entry (0) | 2023.05.08 |
Driver/Firmware Check - Network Adapter (0) | 2023.03.18 |
Address Resolution Protocol(ARP) (0) | 2022.08.11 |
Network Time Protocol(NTP) (0) | 2022.08.11 |