목차/09. Multi-Queue

09Multi-QueueMulti-Queue

Multi-Queue한 네트워크 인터페이스에 트래픽 큐를 여러 개 둬, 그 인터페이스의 수신·가속 작업을 여러 CPU 코어가 나눠 처리하게 만드는 기술입니다. CoreXL·SecureXL과 맞물려, 노는 코어까지 가속에 동원해 성능을 끌어올립니다.

기본적으로 네트워크 인터페이스 하나는 트래픽 큐 하나를 한 CPU 코어가 처리 합니다. 이 때문에 가속(SND)에 쓸 수 있는 코어 수가, 트래픽을 처리하는 인터페이스 수를 넘을 수 없 다는 한계가 생깁니다. 인터페이스는 적은데 코어가 많은 장비라면 SND 코어가 놀게 됩니다. Multi-Queue 는 한 인터페이스에 큐를 여러 개 만들어 여러 코어가 그 인터페이스의 트래픽을 함께 받게 함으로써 이 한계를 풉니다.

이 장은 Multi-Queue를 쓰기 위한 요구사항과 한계, 켤지 말지 판단하는 절차, Expert mode와 Gaia Clish/gClish에서의 기본 구성, 특수 시나리오, 그리고 문제 해결 까지 원문의 모든 절차·표·파라미터·명령·참고를 빠짐없이 담습니다.

요구사항과 제한

Multi-Queue를 쓰려면 먼저 환경이 조건을 만족해야 합니다. 원문이 나열한 요구사항과 한계는 다음과 같습니다.

  • CPU 코어가 2개 이상 인 Security Gateway / Cluster Member 에서만 동작합니다.
  • 인터페이스가 아래에 나열된 드라이버 중 하나를 쓸 때만 지원합니다.
  • 현재 down 상태인 인터페이스는 Multi-Queue가 사용하지 않 습니다.
  • 만들 수 있는 트래픽 큐 수는 CPU 코어 수와 인터페이스 드라이버 종류에 따라 제한 됩니다(아래 두 번째 표).
  • Cluster에서는 모든 Cluster Member를 동일하게 구성 해야 합니다.

지원하는 인터페이스 드라이버

Multi-Queue는 다음 드라이버를 쓰는 인터페이스만 지원합니다.

드라이버최대 속도설명
igb1 GbpsIntel PCIe 1기가비트 이더넷 네트워크 어댑터 드라이버
ixgbe10 GbpsIntel PCIe 10기가비트 이더넷 네트워크 어댑터 드라이버
i40e40 GbpsIntel PCIe 40기가비트 이더넷 네트워크 어댑터 드라이버
i40evf40 GbpsIntel i40e의 가상 함수(Virtual Function) 네트워크 장치용 드라이버
ice25 GbpsIntel E810 시리즈 장치용 네트워크 어댑터 드라이버
mlx5_core40 GbpsMellanox ConnectX mlx5 코어 드라이버
ena20 GbpsAmazon EC2의 Elastic Network Adapter
virtio_net10 GbpsKVM의 VirtIO 반가상화(paravirtualized) 장치 드라이버
vmxnet310 GbpsVMware의 VMXNET Generation 3 드라이버

드라이버별 최대 RX 큐 수

같은 드라이버라도 만들 수 있는 수신(RX) 큐 수가 다릅니다.

인터페이스 드라이버최대 RX 큐 수
igb2~16개(인터페이스에 따라 다름)
ixgbe16개
i40e64개
i40evf4개
ice64개
mlx5_core60개
ena자동 구성됨
virtio_net자동 구성됨
vmxnet3자동 구성됨

활성화 판단하기

무작정 켜지 말고, 이득이 있을지 먼저 판단 합니다. 이 절은 Multi-Queue로 효과를 볼 수 있는 환경인지 가려내는 과정입니다.

1단계 — 인터페이스가 Multi-Queue를 지원하는지 확인

요구사항과 제한의 드라이버 목록에 있는 네트워크 카드만 Multi-Queue를 지원합니다.

인터페이스가 어떤 드라이버를 쓰는지는 Expert mode 에서 확인합니다.

  • Security Gateway(각 Cluster Member)에서:
  ethtool -i <Name of Interface>
  
  • Scalable Platform Security Group에서:
  g_ethtool -i <Name of Interface>
  

또한 새 인터페이스를 설치했다면 Expert mode에서 다음 두 명령을 실행해야 합니다.

  • Security Gateway(각 Cluster Member)에서:
  mq_mng --reconf
  reboot
  
  • Scalable Platform Security Group에서:
  g_all mq_mng --reconf
  g_reboot -a
  

2단계 — SecureXL이 켜져 있는지 확인

Multi-Queue는 SecureXL과 함께 동작하므로, SecureXL이 켜져 있어야 합니다.

  1. Security Gateway / 각 Cluster Member / Scalable Platform Security Group의 명령줄에 접속합니다.
  2. Gaia Clish 또는 Expert mode 에 로그인합니다. > 참고 — Scalable Platform(Maestro·Chassis)에서는 Gaia gClish 또는 Expert mode를 써야 합니다.
  3. SecureXL 상태를 확인합니다(fwaccel stat).
    • Security Gateway(각 Cluster Member)에서 Gaia Clish 또는 Expert mode로:
     fwaccel stat
     
  • Scalable Platform Security Group에서 Gaia gClish로:
     fwaccel stat
     
  • Scalable Platform Security Group에서 Expert mode로:
     g_fwaccel stat
     
  1. Status 열을 봅니다. 비(非)VSX 게이트웨이의 출력 예시는 다음과 같습니다.
   [Expert@MyGW:0]# fwaccel stat
   +-----------------------------------------------------------------+
   |Id|Name |Status  |Interfaces |Features                           |
   +-----------------------------------------------------------------+
   |0 |KPPAK|enabled |eth0,eth1  |Acceleration,Cryptography          |
   |  |     |        |           |Crypto: Tunnel,UDPEncap,MD5,SHA1,  |
   |  |     |        |           |3DES,DES,AES-128,AES-256,ESP,      |
   |  |     |        |           |LinkSelection,DynamicVPN,          |
   |  |     |        |           |NatTraversal,AES-XCBC,SHA256,      |
   |  |     |        |           |SHA384,SHA512                      |
   +-----------------------------------------------------------------+
   Accept Templates : enabled
   Drop Templates   : disabled
   NAT Templates    : enabled
   LightSpeed Accel : disabled
   [Expert@MyGW:0]#
   
  1. SecureXL이 disabled라면 켭니다(fwaccel on).
    • Security Gateway(각 Cluster Member)에서 Gaia Clish 또는 Expert mode로:
     fwaccel on
     
  • Scalable Platform Security Group에서 Gaia gClish로:
     fwaccel on
     
  • Scalable Platform Security Group에서 Expert mode로:
     g_fwaccel on
     

3단계 — CPU 역할 할당 살펴보기

어떤 코어가 CoreXL SND 인스턴스를 돌리는지 확인합니다.

  1. 명령줄에 접속합니다.
  2. Gaia Clish 또는 Expert mode에 로그인합니다(Scalable Platform에서는 Gaia gClish 또는 Expert mode).
  3. CPU 역할 목록을 가져옵니다(fw ctl affinity).
    • Security Gateway(각 Cluster Member)에서 Gaia Clish 또는 Expert mode로:
     fw ctl affinity -l [-a] [-v] [-r]
     
  • Scalable Platform Security Group에서 Gaia gClish로:
     fw ctl affinity -l [-a] [-v] [-r]
     
  • Scalable Platform Security Group에서 Expert mode로:
     g_fw ctl affinity -l [-a] [-v] [-r]
     

아래 예에서는 CPU0, CPU1 이 CoreXL SND 인스턴스를 돌리고 있습니다.

   [Expert@GW:0]# fw ctl affinity -l
   Mgmt: CPU 0
   eth1-04: CPU 1
   eth1-05: CPU 0
   eth1-06: CPU 1
   eth1-07: CPU 0
   fw_0: CPU 5
   fw_1: CPU 4
   fw_2: CPU 3
   fw_3: CPU 2
   [Expert@GW:0]#
   

4단계 — CPU 코어 사용률 살펴보기

각 코어가 얼마나 바쁜지 봅니다.

  1. 명령줄에 접속합니다.
  2. 로그인합니다(앞 단계와 동일).
  3. CPU 코어 사용률을 확인합니다.
    • Security Gateway(각 Cluster Member)에서 Expert mode로: top
    • Scalable Platform Security Group에서 Gaia Clish로: top
    • Scalable Platform Security Group에서 Expert mode로: g_top
  4. top 화면에서 1 을 눌러 모든 CPU 코어를 펼쳐 봅니다.

아래 예시에서는 CoreXL SND 인스턴스가 도는 CPU0·CPU1이 약 30%만 idle (즉 바쁨), CoreXL Firewall 인스턴스가 도는 코어는 약 70% idle (즉 한가함)입니다 — 전형적인 Multi-Queue 적용 후보입니다.

   top - 18:02:33 up 8 days, 1:18, 1 user, load average: 1.22, 1.38, 1.48
   Tasks: 137 total, 3 running, 134 sleeping, 0 stopped, 0 zombie
   Cpu0 : 2.0%us, 0.0%sy, 0.0%ni, 28.7%id, 5.9%wa, 0.0%hi, 63.4%si, 0.0%st
   Cpu1 : 0.0%us, 1.0%sy, 0.0%ni, 27.6%id, 0.0%wa, 0.0%hi, 71.4%si, 0.0%st
   Cpu2 : 2.0%us, 2.0%sy, 0.0%ni, 66.5%id, 0.0%wa, 4.0%hi, 25.5%si, 0.0%st
   Cpu3 : 1.0%us, 2.0%sy, 0.0%ni, 71.3%id, 0.0%wa, 0.0%hi, 25.7%si, 0.0%st
   Cpu4 : 5.0%us, 1.0%sy, 0.0%ni, 69.0%id, 0.0%wa, 0.0%hi, 25.0%si, 0.0%st
   ...
   

5단계 — SND 코어를 더 늘릴 수 있는지 판단

활성 네트워크 인터페이스 수가 CoreXL SND 인스턴스를 돌리는 코어 수보다 많다면, SND 인스턴스를 돌릴 코어를 더 배정할 수 있습니다. 정리하면 Multi-Queue는 다음 두 조건이 모두 맞을 때 권장됩니다.

  • (a) CoreXL SND 인스턴스가 CPU를 많이 쓴다 (idle < 20%).
  • (b) CoreXL Firewall 인스턴스는 CPU를 적게 쓴다 (idle > 50%).

기본 구성

Multi-Queue는 Expert mode, Gaia Clish, 또는 Scalable Platform의 Gaia gClish 중 한 셸에서 구성합니다.

Expert mode — mq_mng 유틸리티

mq_mng 유틸리티는 지원 인터페이스의 Multi-Queue를 보여 주고 구성합니다. 이 명령들은 반드시 Expert mode에서 실행합니다.

mq_mng {-h | --help}                              # 내장 도움말 보기

mq_mng {-o | --show} [{-v | -vv}] [-a]            # 현재 구성 보기

mq_mng {-s | --set-mode}                          # 지정 드라이버에 Multi-Queue 구성
      auto
      manual {-i | --interface} <Names of Interfaces> {-c | --core} <IDs of CPU Cores>
      off [{-i | --interface} <Names of Interfaces>]

mq_mng {-r | --reconf}                            # 기존 Multi-Queue 정책 적용

각 파라미터의 뜻은 다음과 같습니다.

파라미터설명
`-h \--help`내장 도움말을 보여 줍니다.
`-o \--show`현재 Multi-Queue 구성을 보여 줍니다.
`-v \-vv`자세히(verbose) 출력합니다.
-a출력에 모든 인터페이스 를 포함합니다.
`-s \--set-mode`Multi-Queue 모드를 구성합니다(아래 세 모드).
`-r \--reconf`기존 Multi-Queue 정책을 적용합니다.

-s | --set-mode 가 받는 세 가지 모드는 이렇습니다.

  • auto — 자동 모드(기본값). Multi-Queue가 지원되는 모든 인터페이스의 affinity를 CoreXL SND 인스턴스가 도는 코어에 자동 으로 맞춥니다.
  • manual — 수동 모드. 관리자가 인터페이스를 어느 SND 코어에 붙일지 직접 정합니다. 인터페이스만, 코어만, 또는 둘 다 지정할 수 있습니다.
  • off — 모든 또는 지정한 지원 인터페이스에서 Multi-Queue를 끕니다.

인터페이스 지정 방법{-i | --interface} <Names of Interfaces> 형식입니다. 인터페이스를 지정하지 않으면 지원되는 모든 인터페이스에 적용 됩니다. 하나만 지정하려면 이름을 적고(예: -i eth2), 여러 개는 공백으로 구분합니다(예: -i eth2 eth4).

CPU 코어 지정 방법{-c | --core} <IDs of CPU Cores> 형식이며, 여기에는 CoreXL SND 인스턴스가 도는 코어 의 ID를 적습니다. 하나는 ID 하나(예: -c 1), 떨어진 여러 개는 공백이나 쉼표로(예: -c 1 3 또는 -c 1,3), 연속된 범위는 하이픈으로(예: -c 3-6) 지정합니다.

구성에 참고할 명령들도 있습니다.

fw ctl affinity                    # 현재 CoreXL affinity 구성 보기
fw ctl multik stat                 # CoreXL Firewall 인스턴스와 사용 코어 보기
cat /proc/cpuinfo | grep processor # 사용 가능한 모든 CPU 코어 보기

mq_mng 출력 예시

모든 인터페이스의 현재 구성 보기:

[Expert@MyGW:0]# mq_mng --show
Total 8 cores. Multiqueue 2
cores i/f      type   state   config   cores
--------------------------------------------------------------
      eth1     igb    Up      Auto     0,4
      eth2     igb    Up      Auto     0,4
      eth2-01  igb    Up      Auto     0,4
[Expert@MyGW:0]#

모든 인터페이스의 자세한(verbose) 구성 보기 — 코어별 큐·IRQ·RX/TX 패킷 수까지 나옵니다:

[Expert@MyGW:0]# mq_mng --show -v
Total 8 cores. Multiqueue 2 cores: 0,4
i/f      type  state  config  cores
--------------------------------------------------------------
eth1     igb   Up     Auto    0(58),4(78)
eth2     igb   Up     Auto    4(62),0(79)
eth2-01  igb   Up     Auto    0(42),4(86)
core  interfaces  queue           irq  rx packets  tx packets
--------------------------------------------------------------
0     eth1        eth1-TxRx-0     58   2350        3012
      eth2        eth2-TxRx-1     79   0           0
      eth2-01     eth2-01-TxRx-0  42   0           45
4     eth1        eth1-TxRx-1     78   652         764
      eth2        eth2-TxRx-0     62   0           0
      eth2-01     eth2-01-TxRx-1  86   0           12
[Expert@MyGW:0]#

인터페이스 eth2 하나만 자세히 보기 — 카드의 최대/현재 큐 수(max 8 cur 2)와 컨트롤러 정보도 함께 나옵니다:

[Expert@MyGW:0]# mq_mng --show -v -i eth2
Total 8 cores. Multiqueue 2 cores: 0,4
i/f   type  state  config  cores
--------------------------------------------------------------
eth2  igb   Up     Auto    4(62),0(79)
--------------------------------------------------------------
eth2 <igb> max 8 cur 2
06:00.2 Ethernet controller: Intel Corporation 82580 Gigabit Network Connection (rev 01)
core  interfaces  queue        irq  rx packets  tx packets
--------------------------------------------------------------
0     eth2        eth2-TxRx-1  79   4212        3965
4     eth2        eth2-TxRx-0  62   0           0
[Expert@MyGW:0]#

모든 인터페이스에 자동 모드 설정:

mq_mng --set-mode auto

eth1·eth2를 수동 모드로, CPU 코어 0,1,2,4,5,6에 배정:

mq_mng -s manual -i eth1 eth2 -c 0-2 4-6

Gaia Clish / Gaia gClish

같은 작업을 Gaia Clish(Scalable Platform에서는 Gaia gClish)에서도 할 수 있습니다. 이 명령들은 반드시 Gaia Clish / Gaia gClish에서 실행합니다.

show interface <Name of Interface> multi-queue [verbose]   # 현재 구성 보기

set interface <Name of Interface> multi-queue              # 구성하기
      auto
      manual core <IDs of CPU Cores that run CoreXL SND Instances>
      off
파라미터설명
<Name of Interface>대상 인터페이스를 지정합니다.
verbose자세히 출력합니다. 트래픽 큐의 IRQ 번호큐별 RX/TX 패킷 총수 까지 포함합니다.
auto자동 모드(기본값). 지정 인터페이스의 affinity를 SND 코어에 자동으로 맞춥니다.
manual core <IDs>수동 모드. 관리자가 지정 인터페이스를 어느 SND 코어에 붙일지 정합니다.
off지정 인터페이스에서 Multi-Queue를 끕니다.

수동 모드에서 코어를 적는 규칙은 mq_mng와 거의 같지만 구분자에 주의 합니다. 하나는 ID 하나(예: manual core 1), 떨어진 여러 개는 쉼표로, 공백 없이 (예: manual core 1,3), 연속 범위는 하이픈(예: manual core 3-6)으로 적습니다. 참고 명령(fw ctl affinity, fw ctl multik stat, cat /proc/cpuinfo | grep processor)은 위와 동일합니다.

Clish 출력 예시

eth2의 구성 보기:

MyGW> show interface eth2 multi-queue
Total 8 cores. Multiqueue 2 cores
i/f   type  state  config  cores
--------------------------------------------------------------
eth2  igb   Up     Auto    4,0

eth2의 자세한 구성 보기:

MyGW> show interface eth2 multi-queue verbose
Total 8 cores. Multiqueue 2 cores: 0,4
i/f   type  state  config  cores
--------------------------------------------------------------
eth2  igb   Up     Auto    4(62),0(79)
core  interfaces  queue        irq  rx packets  tx packets
--------------------------------------------------------------
0     eth2        eth2-TxRx-1  79   212         80
4     eth2        eth2-TxRx-0  62   16232       18901
MyGW>

eth2에 자동 모드 설정:

set interface eth2 multi-queue auto

eth2를 수동 모드로, CPU 코어 0,1,2,4,5,6에 배정:

set interface eth2 multi-queue manual core 0-2,4-6

특수 시나리오

원문은 특별한 상황에서의 구성을 따로 다룹니다.

활성 RX 큐의 기본 개수

게이트웨이 모드

게이트웨이 모드에서 Multi-Queue는 최적 성능을 위해 활성 RX 큐의 기본 개수를 다음 공식으로 계산합니다.

활성 RX 큐 수 = (CPU 코어 수) - (CoreXL Firewall 인스턴스 수)

이 값은 Multi-Queue를 구성할 때 자동으로 설정 됩니다. 그리고 CoreXL Firewall 인스턴스 수를 바꾸면, 수동으로 고정해 두지 않은 한 활성 RX 큐 수도 자동으로 따라 바뀝니다.

VSX 모드

VSX 모드에서는 FWK 프로세스가 배정된 CPU 코어 수를 바꿀 때 가 관건입니다. 이때 활성 RX 큐의 기본 개수는 다른 공식을 씁니다.

활성 RX 큐 수 = FWK 프로세스가 배정된 가장 낮은 CPU ID

아래 예에서는 활성 RX 큐 수가 2로 설정됩니다(FWK가 도는 가장 낮은 CPU ID가 2이므로). 이 값 역시 Multi-Queue 구성 시 자동으로 설정되지만, Virtual System의 affinity를 바꿔도 자동으로 갱신되지는 않 습니다.

[Expert@GW:0]# fw ctl affinity -l
Mgmt: CPU 0
eth1-05: CPU 0
eth1-06: CPU 1
VS_0 fwk: CPU 2 3 4 5
VS_1 fwk: CPU 2 3 4 5
[Expert@GW:0]#

네트워크 인터페이스 추가

Security Gateway / ClusterXL / Scalable Platform Security Group에 네트워크 인터페이스 카드를 새로 꽂으면, 운영체제가 인터페이스를 다시 인덱싱하는 방식 때문에 Multi-Queue 구성이 바뀔 수 있습니다. 카드를 추가했다면 Multi-Queue를 다시 구성하거나, 기존 구성을 다시 적용하세요.

  • Security Gateway(각 Cluster Member)에서 Expert mode로:
  mq_mng --reconf
  
  • Scalable Platform Security Group에서 Expert mode로:
  g_all mq_mng --reconf
  

CoreXL Firewall 인스턴스의 affinity 변경

Monitor Mode 인터페이스에서 순서가 어긋난 패킷 처리

문제 해결

운영 중 자주 마주치는 상황과 대처법입니다.

재부팅 후 엉뚱한 인터페이스에 Multi-Queue가 설정됨

이는 Security Gateway / Scalable Platform Security Group의 물리 인터페이스를 바꾼 뒤 일어날 수 있습니다. 다음 중 하나로 대처합니다.

기존 구성을 다시 적용하고 재부팅: - Security Gateway(각 Cluster Member)에서 Gaia Clish 또는 Expert mode로:

  mq_mng --reconf
  reboot
  
  • Scalable Platform Security Group에서 Gaia gClish로:
  mq_mng --reconf
  reboot
  
  • Scalable Platform Security Group에서 Expert mode로:
  g_all mq_mng --reconf
  g_reboot -a
  

또는 Multi-Queue를 처음부터 다시 구성 합니다.

인터페이스 상태를 바꾸자 모든 IRQ가 CPU 0(또는 전체 코어)으로 몰림

이는 부팅 때마다 도는 자동 affinity 절차가 끝난 뒤, 인터페이스 상태가 UP으로 바뀔 때 생길 수 있습니다. 기존 Multi-Queue 구성을 다시 적용하세요.

  • Security Gateway(각 Cluster Member)에서 Gaia Clish 또는 Expert mode로:
  mq_mng --reconf
  
  • Scalable Platform Security Group에서 Gaia gClish로:
  mq_mng --reconf
  
  • Scalable Platform Security Group에서 Expert mode로:
  g_all mq_mng --reconf
  

VSX 모드에서 fwk 프로세스가 인터페이스 큐와 같은 코어에서 돎

이는 Virtual System의 affinity를 수동으로 바꿨는데 Multi-Queue를 그에 맞춰 다시 구성하지 않았을 때 생깁니다. 다음 중 하나로 대처합니다.

기존 구성을 다시 적용하고 재부팅: - Security Gateway(각 Cluster Member)에서 Gaia Clish 또는 Expert mode로:

  mq_mng --reconf
  reboot
  
  • Scalable Platform Security Group에서 Gaia gClish로:
  mq_mng --reconf
  reboot
  
  • Scalable Platform Security Group에서 Expert mode로:
  g_all mq_mng --reconf
  g_reboot -a
  

또는 활성 RX 큐 수를 수동으로 구성합니다.

게이트웨이 모드에서 CoreXL Firewall 인스턴스 수를 바꾸자 모든 인터페이스에서 Multi-Queue가 꺼짐

CoreXL Firewall 인스턴스 수를 바꾸면, 활성 RX 큐 수가 다음 공식으로 자동으로 다시 계산됩니다.

활성 RX 큐 수 = (CPU 코어 수) - (CoreXL Firewall 인스턴스 수)

그 결과 CPU 코어 수와 CoreXL Firewall 인스턴스 수의 차이가 1이면, Multi-Queue가 비활성화 됩니다. 이 경우 코어를 늘리거나 Firewall 인스턴스 수를 줄여 차이를 2 이상으로 확보하세요.