[NSX] fast-path thread vs. non-fast-path thread
NSX의 Edge appliance에서 Running 되는 여러 Thread 들 중 주요 Thread는 2개의 Category로 구분할 수 있습니다.
하나는 Packet Processing을 위해서 사용되는 fast-path thread이고 다른 하나는 아래에서 설명해드릴 dp-fp 로 시작하지 않는 프로그램들로 non-fast-thread라고 불립니다.
특히, fast-path thread의 경우에는 성능을 위해서 전체 core 중 특정 core에서만 scheduling 되어 사용될 수 있도록 pinning 설정을 이용하고 있습니다.
이렇게 설정된 내용을 어떻게 확인할 수 있는지 알아보겠습니다.
우선, fast-path thread의 실제 이름은 dp-fp로 시작합니다.
개별 thread마다 dp-fp 이름 뒤에 core number를 붙여서 어떤 core에서 scheduling 되는지 알 수 있습니다.
1. 먼저, datapathd 프로세스의 PID를 확인합니다.
# ps -aux | grep datapathd root 4667 11.9 0.5 68570604 184300 ? Sl Sep25 764:24 /opt/vmware/nsx-edge/sbin/datapathd --no-chdir --unixctl=/var/run/vmware/edge/dpd.ctl --pidfile=/var/run/vmware/edge/dpd.pid -vconsole:err -vsyslog:info --syslog-method=udp:127.0.0.1 --cfgfile=/config/vmware/edge/config.json root 3241721 0.0 0.0 6780 2216 pts/0 S+ 10:00 0:00 grep --color=auto datapathd |
2. PID를 이용하여 top command에서 각 개별 thread를 확인할 수 있습니다.
top -H -p <pid of datapathd>
top - 10:02:37 up 4 days, 10:29, 1 user, load average: 0.23, 0.26, 0.27 Threads: 73 total, 1 running, 72 sleeping, 0 stopped, 0 zombie %Cpu(s): 6.5 us, 3.2 sy, 0.0 ni, 90.3 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st KiB Mem : 32572368 total, 10110000 free, 16625688 used, 5836680 buff/cache KiB Swap: 0 total, 0 free, 0 used. 15751084 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ TGID COMMAND 4667 root 20 0 65.4g 184300 61944 S 0.0 0.6 159:56.10 4667 dp-fp:0 4697 root 20 0 65.4g 184300 61944 S 0.0 0.6 0:00.00 4667 eal-intr-thread 4698 root 20 0 65.4g 184300 61944 S 0.0 0.6 0:00.00 4667 rte_mp_handle 4846 root 20 0 65.4g 184300 61944 S 0.0 0.6 127:01.74 4667 dp-fp:1 4847 root 20 0 65.4g 184300 61944 S 0.0 0.6 126:31.83 4667 dp-fp:2 4848 root 20 0 65.4g 184300 61944 S 0.0 0.6 127:35.12 4667 dp-fp:3 4849 root 20 0 65.4g 184300 61944 R 0.0 0.6 84:30.21 4667 dp-fp:4 4850 root 20 0 65.4g 184300 61944 S 0.0 0.6 86:54.93 4667 dp-fp:5 4851 root 20 0 65.4g 184300 61944 S 0.0 0.6 0:00.00 4667 telemetry-v2 4852 root 20 0 65.4g 184300 61944 S 0.0 0.6 0:00.00 4667 telemetry-v1 4853 root 20 0 65.4g 184300 61944 S 0.0 0.6 0:08.98 4667 nsx.disp:1.0 4854 root 20 0 65.4g 184300 61944 S 0.0 0.6 0:00.00 4667 datapathd |
3. fast-path thread를 위해서 할당된 core는 다음과 같은 방법으로 확인할 수 있습니다.
아래 정보에서 전체 core는 0~5까지 있고 이 중 non-fast-thread를 scheduling하기 위해 사용되는 core는 4번과 5번입니다.
즉, "Service_corelist"를 제외한 core인 0~4까지가 fast-path thread를 위해서 사용되는 core 입니다.
# su admin -c "get dataplane" | grep -i corelist | grep -v Fwpurge Tue May 28 2024 UTC 04:19:58.641 Corelist : 0,1,2,3,4,5 Service_corelist : 4,5 |
4. 2번에서 확인했던 내용을 다시 정리해보면 다음과 같습니다.
이 중 fast-path thread는 다른 thread들과 같이 core resource를 공유하지 않고, 해당 core를 독점하여 사용하는 방면에 service core thread의 경우에는 pinning 정보는 있지만 다른 thread들과 해당 core resource를 공유하여 CPU Scheduling을 받게 됩니다.
top - 10:02:37 up 4 days, 10:29, 1 user, load average: 0.23, 0.26, 0.27 Threads: 73 total, 1 running, 72 sleeping, 0 stopped, 0 zombie %Cpu(s): 6.5 us, 3.2 sy, 0.0 ni, 90.3 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st KiB Mem : 32572368 total, 10110000 free, 16625688 used, 5836680 buff/cache KiB Swap: 0 total, 0 free, 0 used. 15751084 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ TGID COMMAND 4667 root 20 0 65.4g 184300 61944 S 0.0 0.6 159:56.10 4667 dp-fp:0 ### <-- !! Fast-path thread 4697 root 20 0 65.4g 184300 61944 S 0.0 0.6 0:00.00 4667 eal-intr-thread 4698 root 20 0 65.4g 184300 61944 S 0.0 0.6 0:00.00 4667 rte_mp_handle 4846 root 20 0 65.4g 184300 61944 S 0.0 0.6 127:01.74 4667 dp-fp:1 ### <-- !! Fast-path thread 4847 root 20 0 65.4g 184300 61944 S 0.0 0.6 126:31.83 4667 dp-fp:2 ### <-- !! Fast-path thread 4848 root 20 0 65.4g 184300 61944 S 0.0 0.6 127:35.12 4667 dp-fp:3 ### <-- !! Fast-path thread 4849 root 20 0 65.4g 184300 61944 R 0.0 0.6 84:30.21 4667 dp-fp:4 ### <-- !! service core thread 4850 root 20 0 65.4g 184300 61944 S 0.0 0.6 86:54.93 4667 dp-fp:5 ### <-- !! service core thread 4851 root 20 0 65.4g 184300 61944 S 0.0 0.6 0:00.00 4667 telemetry-v2 4852 root 20 0 65.4g 184300 61944 S 0.0 0.6 0:00.00 4667 telemetry-v1 4853 root 20 0 65.4g 184300 61944 S 0.0 0.6 0:08.98 4667 nsx.disp:1.0 4854 root 20 0 65.4g 184300 61944 S 0.0 0.6 0:00.00 4667 datapathd |
오늘은 Edge에서 중요한 thread인 fast-path thread가 어떤 설정 값을 토대로 CPU Scheduling을 받는지 확인해봤습니다.
결국, SDN은 x86 OS 에서 여러 thread들이 running 되는 방식이기 때문에 CPU Scheduling이 어떻게 되는지에 따라 성능에도 영향을 주는 케이스들이 발생할 수 있습니다.
SDN을 어떤 특별한 제품이라고 이해하기 보다는 기존 x86 OS에서 실행되는 Application이라는 관점으로 이해하면 OS에서 다루는 CPU Scheduling, Memory Management, Interrupt Handling 등의 기반 지식이 반드시 필요하다는 것을 알 수 있습니다.