기본적으로 네트워크 인터페이스 하나는 트래픽 큐 하나를 한 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는 다음 드라이버를 쓰는 인터페이스만 지원합니다.
| 드라이버 | 최대 속도 | 설명 |
|---|---|---|
| igb | 1 Gbps | Intel PCIe 1기가비트 이더넷 네트워크 어댑터 드라이버 |
| ixgbe | 10 Gbps | Intel PCIe 10기가비트 이더넷 네트워크 어댑터 드라이버 |
| i40e | 40 Gbps | Intel PCIe 40기가비트 이더넷 네트워크 어댑터 드라이버 |
| i40evf | 40 Gbps | Intel i40e의 가상 함수(Virtual Function) 네트워크 장치용 드라이버 |
| ice | 25 Gbps | Intel E810 시리즈 장치용 네트워크 어댑터 드라이버 |
| mlx5_core | 40 Gbps | Mellanox ConnectX mlx5 코어 드라이버 |
| ena | 20 Gbps | Amazon EC2의 Elastic Network Adapter |
| virtio_net | 10 Gbps | KVM의 VirtIO 반가상화(paravirtualized) 장치 드라이버 |
| vmxnet3 | 10 Gbps | VMware의 VMXNET Generation 3 드라이버 |
드라이버별 최대 RX 큐 수
같은 드라이버라도 만들 수 있는 수신(RX) 큐 수가 다릅니다.
| 인터페이스 드라이버 | 최대 RX 큐 수 |
|---|---|
| igb | 2~16개(인터페이스에 따라 다름) |
| ixgbe | 16개 |
| i40e | 64개 |
| i40evf | 4개 |
| ice | 64개 |
| mlx5_core | 60개 |
| 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이 켜져 있어야 합니다.
- Security Gateway / 각 Cluster Member / Scalable Platform Security Group의 명령줄에 접속합니다.
- Gaia Clish 또는 Expert mode 에 로그인합니다. > 참고 — Scalable Platform(Maestro·Chassis)에서는 Gaia gClish 또는 Expert mode를 써야 합니다.
- 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
- 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]#
- 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 인스턴스를 돌리는지 확인합니다.
- 명령줄에 접속합니다.
- Gaia Clish 또는 Expert mode에 로그인합니다(Scalable Platform에서는 Gaia gClish 또는 Expert mode).
- 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 코어 사용률 살펴보기
각 코어가 얼마나 바쁜지 봅니다.
- 명령줄에 접속합니다.
- 로그인합니다(앞 단계와 동일).
- CPU 코어 사용률을 확인합니다.
- Security Gateway(각 Cluster Member)에서 Expert mode로:
top - Scalable Platform Security Group에서 Gaia Clish로:
top - Scalable Platform Security Group에서 Expert mode로:
g_top
- Security Gateway(각 Cluster Member)에서 Expert mode로:
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 autoeth1·eth2를 수동 모드로, CPU 코어 0,1,2,4,5,6에 배정:
mq_mng -s manual -i eth1 eth2 -c 0-2 4-6Gaia 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,0eth2의 자세한 구성 보기:
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 autoeth2를 수동 모드로, 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 이상으로 확보하세요.