#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=4163mtu 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% потерянных пакетов (согласно внутреннему счётчику). Потери возможно из-за того, что карточка на стороне клиента чуть круче, чем на стороне сервера.
Комментариев нет:
Отправить комментарий