2019년 11월 4일 월요일

IBM POWER (ppc64le) 아키텍처에서의 RSS (Receive Side Scaling) 확인


IBM POWER 아키텍처에서도 당연히 Redhat의 RSS (Receive Side Scaling)이 지원됩니다.  이는 다음과 같이 /proc/interrupts에서 해당 NIC을 찾아봄으로써 확인하실 수 있습니다.    아래는 POWER8 Minsky 서버에서 수행한 것인데, CPU 개수가 많아서 (2-sockets * 20-cores/socket X 4-threads/core = 160개) 보기가 힘들기 때문에 여기서는 cut 명령으로 일부 column들만 display 했습니다.  아래와 같이 실제 network cable이 연결된 NIC인 enP5p1s0f0에는 1개의 transmit queue와 4개의 receive queue가 설정되어 있는 것이 보입니다.   그리고 그 queue의 interrupt 번호는 104부터 108번까지인 것도 보실 수 있습니다.

[user612@p612-met1 ~]$ egrep 'CPU|enP' /proc/interrupts | cut -c1-40,1760-1820
           CPU0       CPU1       CPU2    CPU159
 65:          0          0          0       0  XIVE-IRQ 2088960 Edge      enP48p1s0f0
 67:          0          0          0       0  XIVE-IRQ 2088962 Edge      enP48p1s0f0-fp-0
 68:          0          0          0       0  XIVE-IRQ 2088963 Edge      enP48p1s0f0-fp-1
 69:          0          0          0       0  XIVE-IRQ 2088964 Edge      enP48p1s0f0-fp-2
 70:          0          0          0       0  XIVE-IRQ 2088965 Edge      enP48p1s0f0-fp-3
 71:          0          0          0       0  XIVE-IRQ 2088966 Edge      enP48p1s0f0-fp-4
 76:          0          0          0       0  XIVE-IRQ 2088967 Edge      enP48p1s0f0-fp-5
 77:          0          0          0       0  XIVE-IRQ 2088968 Edge      enP48p1s0f0-fp-6
 78:          0          0          0       0  XIVE-IRQ 2088969 Edge      enP48p1s0f0-fp-7
 79:          0          0          0       0  XIVE-IRQ 2088970 Edge      enP48p1s0f1
 85:          0          0          0       0  XIVE-IRQ 2088972 Edge      enP48p1s0f1-fp-0
 86:          0          0          0       0  XIVE-IRQ 2088973 Edge      enP48p1s0f1-fp-1
 87:          0          0          0       0  XIVE-IRQ 2088974 Edge      enP48p1s0f1-fp-2
 94:          0          0          0       0  XIVE-IRQ 2088975 Edge      enP48p1s0f1-fp-3
 95:          0          0          0       3  XIVE-IRQ 2088976 Edge      enP48p1s0f1-fp-4
100:          0          0          0       0  XIVE-IRQ 2088977 Edge      enP48p1s0f1-fp-5
101:          0          0          0       0  XIVE-IRQ 2088978 Edge      enP48p1s0f1-fp-6
102:          0          0          0       7  XIVE-IRQ 2088979 Edge      enP48p1s0f1-fp-7
104:          0          0          0       0  XIVE-IRQ 1028096 Edge      enP5p1s0f0-tx-0
105:          0          0          0       0  XIVE-IRQ 1028097 Edge      enP5p1s0f0-rx-1
106:          0          0          0       0  XIVE-IRQ 1028098 Edge      enP5p1s0f0-rx-2
107:          0          0          0       0  XIVE-IRQ 1028099 Edge      enP5p1s0f0-rx-3
108:      24564          0          0       0  XIVE-IRQ 1028100 Edge      enP5p1s0f0-rx-4
109:          0          0          0       0  XIVE-IRQ 1028101 Edge      enP5p1s0f1-tx-0
110:          0          0          0       0  XIVE-IRQ 1028102 Edge      enP5p1s0f1-rx-1
111:          0          0          0       0  XIVE-IRQ 1028103 Edge      enP5p1s0f1-rx-2
112:          0          0          0       0  XIVE-IRQ 1028104 Edge      enP5p1s0f1-rx-3
113:          0          0          0       0  XIVE-IRQ 1028105 Edge      enP5p1s0f1-rx-4


위 정보는 아래와 같은 방법으로도 확인하실 수 있습니다.  먼저 /sys/devices 밑에서 해당 ethernet NIC을 찾습니다.

[user612@p612-met1 ~]$ sudo find /sys/devices -name "enP5p1*"
/sys/devices/pci0005:00/0005:00:00.0/0005:01:00.0/net/enP5p1s0f0
/sys/devices/pci0005:00/0005:00:00.0/0005:01:00.1/net/enP5p1s0f1

그 다음에 msi_irqs directory 속의 interrupt 번호를 확인하면 됩니다.

[user612@p612-met1 ~]$ ls -l /sys/devices/pci0005:00/0005:00:00.0/0005:01:00.0/msi_irqs
total 0
-r--r--r-- 1 root root 65536 Oct 31 20:48 104
-r--r--r-- 1 root root 65536 Oct 31 20:48 105
-r--r--r-- 1 root root 65536 Oct 31 20:48 106
-r--r--r-- 1 root root 65536 Oct 31 20:48 107
-r--r--r-- 1 root root 65536 Oct 31 20:48 108

이렇게 찾아낸 interrupt 번호로 /proc/irq/해당번호/smp_affinity를 확인해보면 아래와 같이 무의미해보이는 숫자열이 보입니다.

[user612@p612-met1 ~]$ cat /proc/irq/104/smp_affinity
00000000,00000000,00000000,00010000,00000000

[user612@p612-met1 ~]$ cat /proc/irq/105/smp_affinity
00000000,00000000,00000000,00000000,00002000

[user612@p612-met1 ~]$ cat /proc/irq/106/smp_affinity
00000000,00000000,00000000,20000000,00000000

[user612@p612-met1 ~]$ cat /proc/irq/107/smp_affinity
00000000,00000000,00000000,00000040,00000000

[user612@p612-met1 ~]$ cat /proc/irq/108/smp_affinity
00000000,00000000,00000000,00000000,00000001


위 숫자 string은 각 숫자 하나하나가 CPU 4개를 가리키는 16진수이며, 가령 /proc/irq/107/smp_affinity의 숫자열을 2진수로 풀어놓으면 다음과 같습니다.   (16진수 4는 2^2이므로 2진수로는 0100 입니다)

(16진수) ..., 00000040, 00000000
(2진수)  ..., 0000 0000 0000 0000 0000 0000 0100 0000, 0000 0000 0000 0000 0000 0000 0000 0000

위와 같이 2진수로 풀어쓴 숫자열의 해석은, 오른쪽부터 0 또는 1 숫자 하나하나가 CPU(정확하게는 logical CPU = hyperthread = SMT)를 가리키며 1로 표시된 것이 해당 interrupt를 처리하는 CPU입니다.   즉 오른쪽부터 39번째 CPU가 해당 interrupt를 처리하는 CPU입니다. 

실제로 거기에 지정된 CPU가 해당 interrupt를 처리하는지 확인해보기 위해 iperf tool을 설치합니다.

[user612@p612-met1 ~]$ sudo yum groupinstall "Development Tools"

[user612@p612-met1 ~]$ wget https://iperf.fr/download/source/iperf-3.1.3-source.tar.gz

[user612@p612-met1 ~]$ tar -xf iperf-3.1.3-source.tar.gz

[user612@p612-met1 ~]$ cd iperf-3.1.3

[user612@p612-met1 iperf-3.1.3]$ ./configure

[user612@p612-met1 iperf-3.1.3]$ make -j8 && sudo make install

[user612@p612-met1 iperf-3.1.3]$ iperf3 -s
-----------------------------------------------------------
Server listening on 5201
-----------------------------------------------------------


이 서버로 제 Windows PC에서 iperf를 client mode로 구동하겠습니다.  (Windows에서는 관리자모드로 iperf를 수행해야 합니다.)

C:\temp\iperf-3.1.3-win64>iperf3.exe -c 129.40.252.187 -P 8


이렇게 iperf client가 접속하면 서버에서는 다음과 같은 정보가 display됩니다.
...
[ 19]   0.00-10.21  sec  0.00 Bytes  0.00 bits/sec                  sender
[ 19]   0.00-10.21  sec  10.1 MBytes  8.32 Mbits/sec                  receiver
[SUM]   0.00-10.21  sec  0.00 Bytes  0.00 bits/sec                  sender
[SUM]   0.00-10.21  sec  82.6 MBytes  67.9 Mbits/sec                  receiver
-----------------------------------------------------------
Server listening on 5201
-----------------------------------------------------------



[user612@p612-met1 ~]$ egrep 'CPU|enP5p1s0f0' /proc/interrupts | cut -c1-40,424-450,1760-1820
           CPU0       CPU1       CPU2         CPU38      CPU39      CPU159
104:          0          0          0            0          0          0  XIVE-IRQ 1028096 Edge      enP5p1s0f0-tx-0
105:          0          0          0            0          0          0  XIVE-IRQ 1028097 Edge      enP5p1s0f0-rx-1
106:          0          0          0            0          0          0  XIVE-IRQ 1028098 Edge      enP5p1s0f0-rx-2
107:          0          0          0        44403          0          0  XIVE-IRQ 1028099 Edge      enP5p1s0f0-rx-3
108:      24714          0          0            0          0          0  XIVE-IRQ 1028100 Edge      enP5p1s0f0-rx-4


정말 107번 interrupt는 39번째 CPU core (CPU38)이 처리하는 것이 맞다는 것을 확인하실 수 있습니다.

댓글 없음:

댓글 쓰기