예전에 테스트 했던 내용을 정리해서 적어본다.
일반적인 시스템에서는 1개의 장치에서 1개의 queue 를 가지고 처리를 한다.
CPU 에 갯수가 물리적으로 2개이상이거나 여러개의 코어를 가지고 있다면 그 갯수만큼 CPU에 작업을 할당하여 처리를 하면 보다 효율적인 진행이 가능하나 리눅스에서는 하나의 queue 를 가지고 있으므로 1개의 cpu 코어만을 사용한다.
일반적인 intel 랜카드 칩셋(e1000)
[root@elcap-G1-A ~]# cat /proc/interrupts
CPU0 CPU1 CPU2 CPU3
225: 4186925883 0 0 0 PCI-MSI eth1
233: 1048493217 0 0 0 PCI-MSI eth2
CPU 코어가 4개가 존재하지만 네트워크 작업을 하는것은 CPU0 만을 이용하고 있다.
이에 CPU 코어갯수만큼 QUEUE 갯수를 늘려서 병렬로 작업을 처리할수 있게하는게 Multiqueue 이다.
multiqueue
----------
In this mode, a separate MSI-X vector is allocated for each queue and one
for "other" interrupts such as link status change and errors. All
interrupts are throttled via interrupt moderation. Interrupt moderation
must be used to avoid interrupt storms while the driver is processing one
interrupt. The moderation value should be at least as large as the expected
time for the driver to process an interrupt. multiqueue is off by default.
MSI-X support is required for multiqueue. If MSI-X is not found, the system
will fallback to MSI or to Legacy interrupts.
REQUIREMENTS: MSI-X support is required for multiqueue. If MSI-X is not
found, the system will fallback to MSI or to Legacy interrupts.
This driver supports multiqueue in kernel versions 2.6.24 and
greater.
This driver supports receive multiqueue on all kernels that support MSI-X,
with the driver in non-NAPI mode.
NOTE: Do not use MSI-X with the 2.6.19 or 2.6.20 kernels.
To enable a separate vector for TX, use:
# make CFLAGS_EXTRA=-DCONFIG_IGB_SEPARATE_TX_HANDLER
This will allocate a separate handler for tx cleanups. This might be useful
if you have a lot of CPU cores under heavy load and want to spread the
processing load around.
With this option, you would get three MSI-X vectors: one for TX, one for RX,
and one for link.
CONFIG_INET_LRO=y
igb: eth0: igb_probe: Using MSI-X interrupts. 4 rx queue(s), 4 tx queue(s)
Multiqueue (82575 기반 네트워크 연결 전용)
이 모드에서는 각 대기열 및 링크 상태 변경 및 오류와 같은 "다른" 인터럽트에 대해 별도의 MSI-X 벡터가 한 개씩 할당됩니다.
모든 인터럽트는 인터럽트 조절을 통해 추진됩니다.
인터럽트 조절은 드라이버가 하나의 인터럽트를 처리하는 동안 인터럽트 스톰을 방지하는데 사용해야 합니다.
조절 값은 적어도 인터럽트를 처리하는 드라이버에 대해 예상한 시간만큼 커야 합니다.
Multiqueue의 기본값은 Off입니다.
Multiqueue에는 MSI-X 지원이 필요합니다.
MSI-X가 없는 경우 시스템은 MSI 또는 레거시 인터럽트로 폴백합니다. 참고: 2.6.19 또는 2.6.20 커널을 사용하는 MSI-X를 사용하지 마십시오.
Multiqueue는 다음과 같은 컴파일 플래그를 사용하여 활성화할 수 있습니다.
# make CFLAGS_EXTRA=-DCONFIG_IGB_MQ_RX
동적 인터럽트 조절에 단순 적응성 알고리즘을 사용하여 AIM 없이 최대 네 개의 수신 대기열을 사용할 수 있습니다.
수용 가능한 처리량을 제공하지만 추가 인터럽트로 인해 단일 대기열 모드 보다 CPU 사용률이 높습니다.
여러 소형 패킷을 사용하여 다중 연결을 처리하는 경우 및 CPU 사용률과 무관한 경우 이 모드가 유용합니다. 참고: 전송 클린업은 수신 과정 중에 처리됩니다.
이 옵션을 사용하면 최대 다섯 개의 MSI-X 벡터를 얻을 수 있습니다.
네 개의 수신 대기열 당 하나 링크 당 하나
보유할 수 있는 수신 대기열의 수는 시스템의 CPU 수와 직접 관련이 있습니다.
예를 들어 듀얼 프로세서 시스템의 경우 두 개의 수신 대기열을 얻을 수 있습니다.
TX에 별도의 벡터를 활성화하려면 다음을 사용합니다.
# make CFLAGS_EXTRA=-DCONFIG_IGB_SEPARATE_TX_HANDLER
전송 클린업 시 별도의 핸들러를 할당합니다.
로드 및 CPU 코어가 많은 상황에서 CPU 코어 간에 로드 처리를 배포하려는 경우 유용합니다.
이 옵션을 사용하면 3개의 MSI-X 벡터를 얻게 됩니다.
TX 당 하나 RX 당 하나
링크 당 하나 이전 두 개의 옵션이 결합될 수 있습니다.
# make CFLAGS_EXTRA="-DCONFIG_IGB_RX_MQ -DCONFIG_IGB_SEPARATE_TX_HANDLER"
AIM을 비활성화하고 최대 6개의 MSI-X 벡터를 제공합니다.
각 수신 대기열(최대 4개) 당 하나
전송 클린업 시 하나 링크 당 하나
현재 여러 전송 대기열에 지원되는 커널이 없습니다.
두서없이 적었지만.... intel 82575, 82576 이상에서는 지원이 되는 부분이며 e1000 랜카드에서는
IntterruptThrottleRate 옵션을 통해서 지원이 가능합니다.
/etc/modprobe.conf
alias eth1 igb
alias eth2 igb
options igb IntMode=3,3 InterruptThrottleRate=0,0
CPU0 CPU1 CPU2 CPU3
212: 0 0 1 0 PCI-MSI-edge eth1
213: 8817173 11665252 9292331 28324 PCI-MSI-edge eth1-TxRx-3
214: 8974070 11896347 9238982 38707 PCI-MSI-edge eth1-TxRx-2
215: 8848535 12015568 8922508 37493 PCI-MSI-edge eth1-TxRx-1
216: 9 409695 13 144210439 PCI-MSI-edge eth1-TxRx-0
217: 0 0 1 0 PCI-MSI-edge eth0
multiqueue 지원여부에 따라서 네트워크카드 퍼포먼스 차이가 확실히 느껴진다.
한번 테스트해서 적용해보시길......