Страницы

Поиск по вопросам

четверг, 5 декабря 2019 г.

Настройка 10Gb сетевой карты под Linux при работе с ethernet фреймами

#linux #сокет #lan #ethernet #raw_socket


Не уверен, что вопрос соответствует правилам, но всё же.  

Есть 10Gb карточка (марка не важна, т.к. результат повторялся и на двух других, отличных
от этой) и Debian Buster, соединенный оптикой напрямую с машинкой-источником данных.
Организован поток данных ~9Gb, состоящий из ethernet фреймов размера ~9000 байт, в
которых кроме MAC отравителя, МАС получателя, кастомного EtherType и счетчика пакетов
ничего нет.

Замеры утилитами wireshark, tshark, tcpdump (хотя они всё равно все работают через
одну библиотеку) показывают пропуск примерно каждого второго пакета. Самописный кривой
код показывает примерно то же. При этом под Windows 7 тот же wireshark (при большом
выделенном буфере) ловит все пакеты.

Проверка пропускной способности сети утилитой iperf3 на TCP трафике даёт стабильные
9.8Gb.

# uname -a

Linux debian 4.19.0-6-amd64 #1 SMP Debian 4.19.67-2 (2019-08-28) x86_64 GNU/Linux


# ifconfig enp1s0

enp1s0: flags=4163  mtu 12000
        inet 10.0.0.1  netmask 255.255.255.0  broadcast 10.0.255.255
        inet6 fe80::b2c5:54ff:feff:f37f  prefixlen 64  scopeid 0x20
        ether b0:c5:54:ff:f3:7f  txqueuelen 3000  (Ethernet)
        RX packets 1501482032  bytes 13216245041216 (12.0 TiB)
        RX errors 0  dropped 1501472982  overruns 0  frame 0
        TX packets 75  bytes 7809 (7.6 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
        device interrupt 34  memory 0x90400000-90410000  



# ethtool -g enp1s0

Ring parameters for enp1s0:
Pre-set maximums:
RX:     1365
RX Mini:    0
RX Jumbo:   0
TX:     2048
Current hardware settings:
RX:     1365
RX Mini:    0
RX Jumbo:   0
TX:     2048

# ethtool -k enp1s0

Features for enp1s0:
rx-checksumming: on
tx-checksumming: on
    tx-checksum-ipv4: on
    tx-checksum-ip-generic: off [fixed]
    tx-checksum-ipv6: off [fixed]
    tx-checksum-fcoe-crc: off [fixed]
    tx-checksum-sctp: off [fixed]
scatter-gather: on
    tx-scatter-gather: on
    tx-scatter-gather-fraglist: on
tcp-segmentation-offload: on
    tx-tcp-segmentation: on
    tx-tcp-ecn-segmentation: off [fixed]
    tx-tcp-mangleid-segmentation: off
    tx-tcp6-segmentation: off [fixed]
udp-fragmentation-offload: off
generic-segmentation-offload: on
generic-receive-offload: on
large-receive-offload: off [fixed]
rx-vlan-offload: on
tx-vlan-offload: on
ntuple-filters: off [fixed]
receive-hashing: on
highdma: on
rx-vlan-filter: on
vlan-challenged: off [fixed]
tx-lockless: off [fixed]
netns-local: off [fixed]
tx-gso-robust: off [fixed]
tx-fcoe-segmentation: off [fixed]
tx-gre-segmentation: off [fixed]
tx-gre-csum-segmentation: off [fixed]
tx-ipxip4-segmentation: off [fixed]
tx-ipxip6-segmentation: off [fixed]
tx-udp_tnl-segmentation: off [fixed]
tx-udp_tnl-csum-segmentation: off [fixed]
tx-gso-partial: off [fixed]
tx-sctp-segmentation: off [fixed]
tx-esp-segmentation: off [fixed]
tx-udp-segmentation: off [fixed]
fcoe-mtu: off [fixed]
tx-nocache-copy: off
loopback: off [fixed]
rx-fcs: off [fixed]
rx-all: off [fixed]
tx-vlan-stag-hw-insert: off [fixed]
rx-vlan-stag-hw-parse: off [fixed]
rx-vlan-stag-filter: off [fixed]
l2-fwd-offload: off [fixed]
hw-tc-offload: off [fixed]
esp-hw-offload: off [fixed]
esp-tx-csum-hw-offload: off [fixed]
rx-udp_tunnel-port-offload: off [fixed]
tls-hw-tx-offload: off [fixed]
tls-hw-rx-offload: off [fixed]
rx-gro-hw: off [fixed]
tls-hw-record: off [fixed] 


Я плохо знаю сетевой стек и откровенно "плаваю" при настройке сети, поэтому прошу
помощи сообщества или хотя бы вектора, в котором необходимо копать. Особенно интересует
эта строка RX errors 0  dropped 1501472982  overruns 0  frame 0
    


Ответы

Ответ 1



В большинстве случаев в linux требуется подтюнить драйвер, настройки ядра и, возможно, перераспределить прерывания по ядрам. Ниже представлены примеры рабочих параметров с 10g машин под debian. # cat /etc/modprobe.d/ixgbe.conf options ixgbe MQ=1,1 options ixgbe RSS=8,8 options ixgbe InterruptThrottleRate=1,1 options ixgbe DCA=2,2 options ixgbe FCoE=0,0 options ixgbe LRO=0,0 # cat /etc/sysctl.conf # Kernel sysctl configuration file for Red Hat Linux # # For binary values, 0 is disabled, 1 is enabled. See sysctl(8) and # sysctl.conf(5) for more details. # Controls IP packet forwarding net.ipv4.ip_forward = 1 # Controls source route verification net.ipv4.conf.default.rp_filter = 0 # Do not accept source routing net.ipv4.conf.default.accept_source_route = 0 # Controls the System Request debugging functionality of the kernel kernel.sysrq = 0 # Controls whether core dumps will append the PID to the core filename. # Useful for debugging multi-threaded applications. kernel.core_uses_pid = 1 # Controls the use of TCP syncookies net.ipv4.tcp_syncookies = 1 # Controls the default maxmimum size of a mesage queue kernel.msgmnb = 65536 # Controls the maximum size of a message, in bytes kernel.msgmax = 65536 # Controls the maximum shared segment size, in bytes kernel.shmmax = 68719476736 # Controls the maximum number of shared memory segments, in pages kernel.shmall = 4294967296 # No swappiness vm.swappiness = 0 net.core.rmem_default = 8388608 net.core.wmem_default = 8388608 net.core.rmem_max = 8388608 net.core.wmem_max = 8388608 net.netfilter.nf_conntrack_max = 30000000 net.netfilter.nf_conntrack_tcp_timeout_established = 1800 net.ipv4.conf.all.arp_announce = 1 net.ipv4.conf.lo.arp_announce = 1 net.ipv4.tcp_keepalive_intvl = 15 net.ipv4.tcp_fin_timeout = 20 net.core.netdev_max_backlog = 8192 net.ipv4.tcp_tw_recycle = 1 net.ipv4.tcp_timestamps = 1 net.core.somaxconn = 16384 net.ipv4.tcp_window_scaling = 1 net.ipv4.tcp_max_orphans = 65536 net.ipv4.ip_local_port_range = 1024 65535 net.ipv4.tcp_max_syn_backlog = 4096 net.ipv4.tcp_tw_reuse = 1 net.ipv4.conf.all.rp_filter = 0 net.ipv4.tcp_orphan_retries = 0 net.ipv4.udp_mem = 51200 76800 102400 net.ipv4.tcp_mem = 51200 76800 102400 net.ipv4.tcp_keepalive_probes = 5 net.ipv4.conf.all.accept_source_route = 0 net.ipv4.tcp_congestion_control = htcp net.ipv4.tcp_keepalive_time = 1800 net.ipv4.tcp_synack_retries = 2 net.ipv6.conf.all.disable_ipv6 = 1 vm.zone_reclaim_mode = 1 vm.min_free_kbytes = 512000 net.ipv4.neigh.default.gc_thresh1 = 512 net.ipv4.neigh.default.gc_thresh2 = 1024 net.ipv4.neigh.default.gc_thresh3 = 2048 kernel.panic = 60 Прерывания можно перераспределить скриптом от intel: https://github.com/majek/ixgbe/blob/master/scripts/set_irq_affinity

Ответ 2



На данном этапе вопрос закрыт: я слишком доверял утилитам (wireshark, tshark, tcpdump) в сочетании со строкой dropped 1501472982 от ifconfig. Что на самом деле такое эти dropped (присутствующие также в выводе упомянутых программ), нужно разбираться в каждом случае отдельно, но это не безвозвратно потерянные пакеты. В моём случае достаточно было увеличения этих параметров ядра: net.core.rmem_max net.core.wmem_max net.core.rmem_default net.core.wmem_default net.core.optmem_max На имеющемся потоке данных самописный код (немного модифицированная версия вот этого https://github.com/hundeboll/rawsend) ловит каждый пакет, попытка замерить максимальную пропускную способность дала ~9.9Gb с ~0.4% потерянных пакетов (согласно внутреннему счётчику). Потери возможно из-за того, что карточка на стороне клиента чуть круче, чем на стороне сервера.

Комментариев нет:

Отправить комментарий