기가비트 본드가 최소 150MB / s의 처리량을 제공하지 않는 이유는 무엇입니까?


17

두 개의 서로 다른 PCIe 어댑터에서 두 개의 PowerEdge 6950 크로스 오버 (직선 사용)를 직접 연결했습니다.

이러한 각 라인에서 기가비트 링크를 얻습니다 (1000MBit, 전이중, 양방향 양방향 제어).

이제 양쪽에서 rr 알고리즘을 사용하여 이러한 인터페이스를 bond0에 연결하려고합니다 (단일 IP 세션에 대해 2000MBit을 얻고 싶습니다).

tdd 모드에서 dd bs = 1M 및 netcat을 사용하여 / dev / zero를 / dev / null로 전송하여 처리량을 테스트하면 150MB / s 이상이 아닌 70MB / s의 처리량을 얻습니다.

단일 라인을 사용할 때 각 라인에 다른 방향을 사용하면 각 라인에 약 98MB / s가 표시됩니다. 단일 회선을 사용할 때 트래픽이 "동일한"방향으로 진행되면 회선에서 70MB / s 및 90MB / s를 얻습니다.

bond-readme (/usr/src/linux/Documentation/networking/bonding.txt)를 읽은 후 다음 섹션이 유용하다는 것을 알았습니다. (13.1.1 단일 스위치 토폴로지에 대한 MT 본딩 모드 선택)

balance-rr :이 모드는 단일 TCP / IP 연결로 여러 인터페이스에서 트래픽을 스트라이핑 할 수있는 유일한 모드입니다. 따라서 단일 TCP / IP 스트림이 둘 이상의 인터페이스 처리량을 활용할 수있는 유일한 모드입니다. 그러나 비용이 발생합니다. 스트라이핑은 종종 피어 시스템이 패킷을 순서대로 수신하지 못하게하여 TCP / IP의 정체 제어 시스템이 종종 세그먼트를 재전송함으로써 시작되도록합니다.

    It is possible to adjust TCP/IP's congestion limits by
    altering the net.ipv4.tcp_reordering sysctl parameter. The
    usual default value is 3, and the maximum useful value is 127.
    For a four interface balance-rr bond, expect that a single
    TCP/IP stream will utilize no more than approximately 2.3
    interface's worth of throughput, even after adjusting
    tcp_reordering.

    Note that this out of order delivery occurs when both the
    sending and receiving systems are utilizing a multiple
    interface bond.  Consider a configuration in which a
    balance-rr bond feeds into a single higher capacity network
    channel (e.g., multiple 100Mb/sec ethernets feeding a single
    gigabit ethernet via an etherchannel capable switch).  In this
    configuration, traffic sent from the multiple 100Mb devices to
    a destination connected to the gigabit device will not see
    packets out of order.  However, traffic sent from the gigabit
    device to the multiple 100Mb devices may or may not see
    traffic out of order, depending upon the balance policy of the
    switch.  Many switches do not support any modes that stripe
    traffic (instead choosing a port based upon IP or MAC level
    addresses); for those devices, traffic flowing from the
    gigabit device to the many 100Mb devices will only utilize one
    interface.

이제 모든 라인 (4)의 연결된 두 서버에서 해당 매개 변수를 3에서 127로 변경했습니다.

다시 결합한 후 약 100MB / s를 얻지 만 여전히 그 이상은 아닙니다.

어떤 아이디어가 있습니까?

업데이트 : 하드웨어 세부 정보 lspci -v:

24:00.0 Ethernet controller: Intel Corporation 82571EB Gigabit Ethernet Controller (rev 06)
        Subsystem: Intel Corporation PRO/1000 PT Dual Port Server Adapter
        Flags: bus master, fast devsel, latency 0, IRQ 24
        Memory at dfe80000 (32-bit, non-prefetchable) [size=128K]
        Memory at dfea0000 (32-bit, non-prefetchable) [size=128K]
        I/O ports at dcc0 [size=32]
        Capabilities: [c8] Power Management version 2
        Capabilities: [d0] MSI: Mask- 64bit+ Count=1/1 Enable-
        Capabilities: [e0] Express Endpoint, MSI 00
        Kernel driver in use: e1000
        Kernel modules: e1000

최종 결과 업데이트 :

8589934592 바이트 (8.6GB) 복사, 35.8489 초, 240MB / s

많은 tcp / ip 및 저수준 드라이버 옵션을 변경했습니다. 여기에는 네트워크 버퍼의 확대가 포함됩니다. 이것이 dd이제 200MB / s보다 큰 숫자를 표시하는 이유입니다 . dd는 전송 대기 중 (전송 버퍼에서) 여전히 출력이있는 동안 종료됩니다.

2011-08-05 업데이트 : 목표를 달성하기 위해 변경된 설정 ( /etc/sysctl.conf ) :

# See http://www-didc.lbl.gov/TCP-tuning/linux.html
# raise TCP max buffer size to 16 MB. default: 131071
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
# raise autotuninmg TCP buffer limits
# min, default and max number of bytes to use
# Defaults:
#net.ipv4.tcp_rmem = 4096 87380 174760
#net.ipv4.tcp_wmem = 4096 16384 131072
# Tuning:
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
# Default: Backlog 300
net.core.netdev_max_backlog = 2500
#
# Oracle-DB settings:
fs.file-max = 6815744
fs.aio-max-nr = 1048576
net.ipv4.ip_local_port_range = 9000 65500
kernel.shmmax = 2147659776
kernel.sem = 1250 256000 100 1024
net.core.rmem_default = 262144
net.core.wmem_default = 262144
#
# Tuning for network-bonding according to bonding.txt:
net.ipv4.tcp_reordering=127

본드 장치의 특수 설정 (SLES : / etc / sysconfig / network / ifcfg-bond0 ) :

MTU='9216'
LINK_OPTIONS='txqueuelen 10000'

가장 큰 MTU를 설정하는 것이 솔루션의 핵심이었습니다.

관련된 네트워크 카드의 rx / tx 버퍼 조정 :

/usr/sbin/ethtool -G eth2 rx 2048 tx 2048
/usr/sbin/ethtool -G eth4 rx 2048 tx 2048

/proc/net/bonding/bond0실제로 balance-rr 로 설정되어 있는지 확인 했습니까 ? 4 인터페이스 본드에 대해 붙여 넣은 문서는 2.3 인터페이스 가치의 처리량 만 제공한다는 사실을 알고 계셨습니까? 이 메모가 주어지면 원하는 2000mb / s에 가까이 갈 가능성은 거의 없습니다.
Zoredache

LACP / Bonding이 여러 개의 물리적 링크에서 단일 TCP 세션을 분할 할 수 있는지 잘 모르겠습니다.
Kedare

@Kedare, 이것은 LACP가 아니며, 단일 TCP 세션에 여러 링크를 사용할 수있는 Linux 본딩 모듈 고유의 라운드 로빈 패킷 스케줄러입니다.
larsks

1
링크에서 처리량을 테스트하는 더 좋은 방법은 사용하는 것 nuttcp입니다. 단일 연결 또는 다중 연결을 쉽게 테스트하십시오.
MikeyB

답변:


8

나는 몇 시간 전에 두 개의 기가비트 링크에서 drbd 동기화의 속도를 높이려는 비슷한 문제가있었습니다. 결국 나는 약 150MB / 초의 동기화 속도를 얻었습니다. 이들은 두 노드에 적용한 설정입니다.

ifconfig bond0 mtu 9000
ifconfig bond0 txqueuelen 10000
echo 3000 > /proc/sys/net/core/netdev_max_backlog

당신은 또한 당신이 이미 (로 네트워크 카드를 가지고 있지 않은 경우 인터럽트 유착을 가능하게 시도 할 수 ethtool을 --coalesce )


모르겠어요 내 경우에는 필요하지 않았습니다. 그 매개 변수를 설정하는 것으로 충분했습니다. 그러나 당신이 그것을 설정하면 다 치지 않을 것 같아요. 전송률이 향상 되었습니까?
user842313

1
나는 현재 그것을 테스트 할 수는 없지만 가장 가능성이 높습니다. "coalescence"에 대한 힌트가 적절하게 표시됩니다. "고속 이더넷"설정에 대한 흥미로운 기사 (독일어)를 찾았습니다. 점보 프레임은 같은 방향으로 진행됩니다. 이는 작업 부하를 전송하는 데 필요한 pci 인터럽트 수를 줄이는 것입니다.
Nils

인터럽트 제한과 같은 hw 병목 현상을 생각하고 있다면 수집 과 같은 도구 가 약간 도움이 될 것입니다. 예를
들어이

0

스위치에서이 양방향 트렁크를 구성 했습니까? 그렇지 않으면 그렇게 작동하지 않습니다. 액티브 / 패시브 모드에서만 작동하고 1Gbps 링크 중 하나만 사용합니다.


관련된 네트워크 장치가 없습니다. 이들은 직접 크로스 오버 케이블입니다.
Nils

5
아, 그럼 당신은 다른 완전히 다른 이유 때문에 운이 없습니다. 이와 같은 LACP / 이더 채널 트렁크는 대상 MAC의 첫 번째 (적절한 두 번째 및 세 번째) 최하위 비트의 차이에 의존하여 해당 MAC과 통신하는 데 사용되는 트렁크 멤버를 정의합니다. 각 엔드에 트렁크에 대해 하나의 MAC 만있을 것이므로 둘 이상의 링크를 사용하지 않습니다.
Chopper3

2
그는 etherchannel / 802.3ad를 사용하지 않고 balance-rr을 사용하고 있으며 정확히 말하자면 스위치 지원이 필요하지 않습니다.
the-wabbit

@ Chopper3 : 그렇다면 MAC 문제가 RR에 귀하의 의견으로 나타나지 않아야합니까?
Nils

2
언급하기에 충분히 알지 못합니다. 좀 앞서 언급했지만 마음에 들지 않기를 바랍니다.
Chopper3

0

PowerEdge 6950은 전체 버스에서 공유되는 최대 133MB / s의 PCI 슬롯으로 제한됩니다. 시스템 버스 아키텍처 자체에 I / O 제한이있을 수 있습니다.

테스트 할 하드웨어 및 I / O 아키텍처가 다른 다른 시스템을 사용하는 것 외에도 케이블 연결도 가능합니다. 일부 가능한 조합은 길이뿐만 아니라 다른 등급 (5e 대 6)의 선을 따라있을 수 있습니다 (짧은 것이 항상 더 좋은 것은 아닙니다).


동시 단일 회선을 사용하여 이미 160MB / s를 얻었습니다. 그러나 이것은 결합시 100MB / s로 떨어집니다. 각 단일 회선에서 거의 100MB / s를 얻으므로 케이블도 문제가되지 않습니다.
Nils

PowerEdge 6950에 대한 PCIe 지원이없는 것 같습니다. PCI 버스와 "다른"것이 있습니까? 그럼에도 불구하고 PowerEdge 6950에 대한 IO 버스 사양을 검색 할 수 있습니다.
user48838

lspci의 출력으로 질문을 업데이트했습니다. 이것은 병목 현상이 아니 었습니다. 지금 200MB / s를 얻습니다.
Nils

0

점보 프레임?

ifconfig <interface> mtu 9000

CPU 부하를 줄여야합니까? 이 테스트 중에 CPU가 무엇을하고 있는지 궁금합니다.
SpacemanSpiff

1
1500 대신 MTU가 9000 인 경우 동일한 양의 데이터를 전송하는 데 필요한 tcp 데이터 패킷 수를 줄입니다 (페이로드가 더 큼). 따라서 적은 양의 패킷 처리를 양측 및 양측에서 수행하고 더 많은 데이터를 전송합니다.
Julien Vehent

시도해 볼 가치가있는 것 같습니다. 전송 중에 CPU가 유휴 상태입니다. 그러나 커널이 다른 물리적 링크에서 다음 패킷을 보내기 전에 하나의 물리적 링크가 ACK를 기다리고 있다고 생각합니다.
Nils

결과도 궁금합니다. 또한 각 NIC를 CPU 코어에 바인딩하십시오. 최근 커널이 제대로 처리해야하지만 본딩과 어떻게 작동하는지 잘 모르겠습니다. 모든 패킷에 대해 l2 캐시에서 다른 캐시로 전환하는 것을 피하는 것이 좋습니다.
Julien Vehent

CPU로드는 문제가되지 않습니다. 모든 오프로드 옵션이 켜져 있습니다 ...
Nils

0

스위치와 닉스가 지원하는 한 점보 프레임을 사용하는 것은 큰 도움이됩니다. 비 관리 형 siwtch가있는 경우 대역폭에 대해 원하는 곳을 얻지 못할 가능성이 높지만 스위치에서 포트를 함께 바인딩하는 경우에는 해당되지 않습니다. 여기에 오래 전에 배운 것이 있는데, 65 %의 시간, 물리적 인 문제입니다. cat6 케이블을 사용하고 있습니까?


0

당신이 당신의 nics에 점보 프레임을 구성했다면 그것의 모양으로 당신은 높은 MTU를 지원하도록 스위치를 구성했는지 확인하십시오.

점보 프레임은 기가비트 네트워크에서 뛰어난 성능을 제공하지만 끝과 끝 (소스 및 대상 서버와 네트워크 스위치 모두)을 구성했는지 확인해야합니다.


이 특별한 경우에는 네트워크 장치가 없습니다. (직접 교차 선). RR 알고리즘을 사용하여 단일 세션의 모든 회선에서로드를 공유 할 수있는 유일한 경우입니다.
Nils
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.