Jump to content
Калькуляторы

Intel 82599 и LRO + ряд вопросов по softirq

Доброго всем дня! Решил не создавать отдельную ветку, вопрос про irq.

Имеется 82599ES, с-но один порт на вход, второй на выход.

Система:

Linux 4.9.16-gentoo #1 SMP Tue Apr 18 04:41:07 MSK 2017 x86_64 Intel(R) Xeon(R) CPU E5-2609 v3 @ 1.90GHz GenuineIntel GNU/Linux

2х 6-ти ядерника, HT выключен, итого 12 ядер. PPPOE+NAT+SHAPER, 1000+ абонентов.

 

Настройки при загрузке:

module_ixgbe_args="RSS=6,6 FdirMode=0,0"

setpci -v -d 8086:10fb e6.b=2e
ethtool -G ether2 rx 4096 tx 4096
ethtool -G ether3 rx 4096 tx 4096
ethtool -A ether2 autoneg off rx off tx off
ethtool -A ether3 autoneg off rx off tx off
ethtool -K ether2 rx off tx off rxvlan off txvlan off gro off lro off gso off
ethtool -K ether3 rx off tx off rxvlan off txvlan off gro off lro off gso off
ifconfig ether2 txqueuelen 10000
ifconfig ether3 txqueuelen 10000

set_irq_affinity -x 0-5 ether3
set_irq_affinity -x 6-11 ether2

 

Проблема заключается в следующем - один порт (ether2) нормально разносится по ядрам, второй упирается в первое ядро, и никак не удается это победить.

 

Детали:

 

itop:

                                       IRQs/Second
                           Device (IRQ)      TOTAL
                    ether2-TxRx-0 ( 48):     10720
                    ether2-TxRx-1 ( 49):      8325
                    ether2-TxRx-2 ( 50):      9663
                    ether2-TxRx-3 ( 51):     12064
                    ether2-TxRx-4 ( 52):      7473
                    ether2-TxRx-5 ( 53):     12201
                           ether2 ( 54):         0
                    ether3-TxRx-0 ( 56):     14284
                    ether3-TxRx-1 ( 57):      9786
                    ether3-TxRx-2 ( 58):      6921
                    ether3-TxRx-3 ( 59):      6197
                    ether3-TxRx-4 ( 60):      5650
                    ether3-TxRx-5 ( 61):      9028
                           ether3 ( 62):         0

 

top:

%Cpu0  :  0,4 us,  0,8 sy,  0,0 ni, 63,5 id,  0,4 wa,  0,0 hi, 35,0 si,  0,0 st
%Cpu1  :  0,0 us,  0,0 sy,  0,0 ni,100,0 id,  0,0 wa,  0,0 hi,  0,0 si,  0,0 st
%Cpu2  :  0,0 us,  0,0 sy,  0,0 ni, 99,7 id,  0,0 wa,  0,0 hi,  0,3 si,  0,0 st
%Cpu3  :  0,0 us,  0,0 sy,  0,0 ni,100,0 id,  0,0 wa,  0,0 hi,  0,0 si,  0,0 st
%Cpu4  :  0,0 us,  0,0 sy,  0,0 ni,100,0 id,  0,0 wa,  0,0 hi,  0,0 si,  0,0 st
%Cpu5  :  0,0 us,  0,0 sy,  0,0 ni,100,0 id,  0,0 wa,  0,0 hi,  0,0 si,  0,0 st
%Cpu6  :  0,0 us,  1,4 sy,  0,0 ni, 89,5 id,  0,0 wa,  0,0 hi,  9,1 si,  0,0 st
%Cpu7  :  0,4 us,  0,0 sy,  0,0 ni, 95,7 id,  0,0 wa,  0,0 hi,  3,9 si,  0,0 st
%Cpu8  :  0,4 us,  0,0 sy,  0,0 ni, 96,1 id,  0,0 wa,  0,0 hi,  3,5 si,  0,0 st
%Cpu9  :  0,0 us,  0,4 sy,  0,0 ni, 94,1 id,  0,0 wa,  0,0 hi,  5,5 si,  0,0 st
%Cpu10 :  0,0 us,  0,0 sy,  0,0 ni, 94,0 id,  0,0 wa,  0,0 hi,  6,0 si,  0,0 st
%Cpu11 :  0,7 us,  0,4 sy,  0,0 ni, 93,7 id,  0,0 wa,  0,0 hi,  5,3 si,  0,0 st

 

perf top -U:

   PerfTop:    9663 irqs/sec  kernel:98.4%  exact: 98.4% [4000Hz cycles:ppp],  (all, 12 CPUs)
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

   10.05%  [kernel]       [k] _raw_spin_lock
    5.20%  [kernel]       [k] default_idle_call
    4.87%  [kernel]       [k] tcp_in_window
    4.61%  [ixgbe]        [k] ixgbe_clean_rx_irq
    3.26%  [kernel]       [k] ip_forward_finish
    2.94%  [kernel]       [k] skb_scrub_packet
    2.85%  [kernel]       [k] __kmalloc_reserve.isra.47
    2.63%  [kernel]       [k] __local_bh_disable_ip
    2.54%  [kernel]       [k] __skb_flow_dissect
    2.48%  [kernel]       [k] __get_item
    2.33%  [kernel]       [k] fib_table_lookup
    2.33%  [kernel]       [k] __dev_queue_xmit
    2.05%  [kernel]       [k] ip_route_input_noref
    2.02%  [kernel]       [k] ipt_do_table
    2.02%  [kernel]       [k] _raw_spin_lock_irqsave
    1.83%  [kernel]       [k] __netif_receive_skb_core
    1.74%  [kernel]       [k] htb_change_class_mode
    1.72%  [ixgbe]        [k] ixgbe_poll
    1.60%  [kernel]       [k] nf_hook_slow
    1.51%  [kernel]       [k] _raw_spin_lock_bh
    1.51%  [kernel]       [k] find_busiest_group
    1.47%  [kernel]       [k] __qdisc_run
    1.45%  [kernel]       [k] rcu_needs_cpu
    1.26%  [kernel]       [k] ip_set_test
    1.24%  [kernel]       [k] __d_lookup_rcu
    1.21%  [kernel]       [k] __nf_conntrack_find_get
    1.19%  [kernel]       [k] nf_nat_ipv4_in
    1.15%  [kernel]       [k] u32_classify
    1.05%  [kernel]       [k] __free_page_frag

 

Как это победить?

Share this post


Link to post
Share on other sites

PPPOE

второй упирается в первое ядро, и никак не удается это победить.

PPPoE по очередям не раскидывается.

 

хотя, судя постатистике, у вас там не только PPPoE (перекос в 2 раза всего лишь, обычно где-то на порядок и больше).

 

Как это победить?

для PPPoE - только RPS.

Share this post


Link to post
Share on other sites

Покажи egrep -e "(eth|CPU)" /proc/interrupts

            CPU0       CPU1       CPU2       CPU3       CPU4       CPU5       CPU6       CPU7       CPU8       CPU9       CPU10      CPU11
 48:      15147     865280          0          0          0          0 1015013603          0     140624     307692          0          0   PCI-MSI 1048576-edge      ether2-TxRx-0
 49:          1      12643          0    1014745          0          0          0 1141993944          0     138394     323332          0   PCI-MSI 1048577-edge      ether2-TxRx-1
 50:          1          0      12348          0          0     896272          0          0 1139256416          0     186202     420580   PCI-MSI 1048578-edge      ether2-TxRx-2
 51:          1          0          0      11954          0          0          0     982643          0 1215149644          0     153160   PCI-MSI 1048579-edge      ether2-TxRx-3
 52:          1          0          0          0      12160          0          0          0     148365    1298287 1132568455          0   PCI-MSI 1048580-edge      ether2-TxRx-4
 53:          1          0          0          0          0      12246          0          0          0     129458          0 1141997859   PCI-MSI 1048581-edge      ether2-TxRx-5
 54:      11949          0          0          0          0          0          0          0          0          0          0          0   PCI-MSI 1048582-edge      ether2
 56: 1892157325   49115157    5365607    4007596          0          0     249151          0          0          0          0          0   PCI-MSI 1050624-edge      ether3-TxRx-0
 57:          1  855324187   26097996    1756477    4053009          0          0      89268          0          0          0          0   PCI-MSI 1050625-edge      ether3-TxRx-1
 58:          1          0  860627247   24716537    2500908    3206707     800055          0     178290          0          0          0   PCI-MSI 1050626-edge      ether3-TxRx-2
 59:          1          0          0  868045932   23766601    2181595     544890          0     644243          0          0          0   PCI-MSI 1050627-edge      ether3-TxRx-3
 60:          1          0    1648303          0  837993560   23753560          0     108367     385440          0     626193          0   PCI-MSI 1050628-edge      ether3-TxRx-4
 61:          1   30960096     631465    1682488          0  879432499          0          0     151204          0     383591          0   PCI-MSI 1050629-edge      ether3-TxRx-5
 62:         66          0          0          0          0          0          0          0          0          0          0          0   PCI-MSI 1050630-edge      ether3

 

с перебросом прерываний по ядрам игрался, поэтому здесь статистика не чистая

Edited by TeCHNoiD

Share this post


Link to post
Share on other sites

Модифицировал скрипт от интела set_irq_affinity, добавил:

                printf "%s %d %s -> /sys/class/net/%s/queues/rx-%d/rps_cpus\n" $IFACE $core $MASK $IFACE $((n-1))

ситуация с прерываниями не изменилась (

 

p.s. cat /usr/src/linux/.config | grep RPS

CONFIG_RPS=y

Edited by TeCHNoiD

Share this post


Link to post
Share on other sites

ситуация с прерываниями не изменилась (

Вы принципиально не читаете ответы которые не нравятся?

PPPoE по очередям не раскидывается.

Не будет кина.

 

Для включения кина нужно настроить RPS, он включается не опцией ядра, а параметрами для каждой очереди нужной сетевки в /proc, погуглите.

Share this post


Link to post
Share on other sites

ситуация с прерываниями не изменилась (

Вы принципиально не читаете ответы которые не нравятся?

PPPoE по очередям не раскидывается.

Не будет кина.

 

Для включения кина нужно настроить RPS, он включается не опцией ядра, а параметрами для каждой очереди нужной сетевки в /proc, погуглите.

 

А если bonding используется, нужно на нём прибивать RPS или на дочерних?

 

cat /sys/class/net/bond0/queues/rx-*/rps_cpus
0000
0000
0000
0000
0000
0000
0000
0000
0000
0000
0000
0000
0000
0000
0000
0000

Share this post


Link to post
Share on other sites

Я все понимаю, RPS конечно же гуглил, вроде как прописал всё что нужно везде и включил (rps_sock_flow_entries в proc, rps_cpus в sys), попробовал заодно irqbalance, но не помогает. Забыл уточнить еще момент, может дело во вланах? то есть связка vlan+pppoe (без ip), валит все на первое ядро? я просто понять не могу, почему судя по itop прерывания равномерно распределяются по ядрам (то есть по сути rps норм работает), а top показывает загрузку только одного ядра, причем в пиках доходит до 95% и начинаются лаги, это глюк такой, или из-за какого нибудь nat+shaper? или лыжи не едут, или супермикро мозг выносит? может я неправильно rps настраиваю, перерыл весь форум, хабр, коментарии, зарубежные сайты вместе с мылоархивами, рекомендации интел, все попробовал. на гиговых сетевушках все норм, на десятке не могу победить. ixgbe последний поставил 5.0.4 (https://sourceforge.net/projects/e1000/files/ixgbe%20stable/5.0.4/).

Share this post


Link to post
Share on other sites

может дело во вланах? то есть связка vlan+pppoe (без ip), валит все на первое ядро?

 

pppoe, ixgbe

Безымянный.png

Share this post


Link to post
Share on other sites

Разобрался, всем спасибо, ларчик просто открывался - нужно писать правильные значения в rps_cpus.

 

echo fff > /sys/class/net/ether3/queues/rx-0/rps_cpus

 

именно все (нужные) ядра в нулевой поток

Edited by TeCHNoiD

Share this post


Link to post
Share on other sites

TeCHNoiD

Т.к. у вас трафик падает именно в 0 очередь - логично что ей и нужно дать все ядра.

Share this post


Link to post
Share on other sites

Всем добрый день! 
У меня возникла похожая проблема , но советы которые есть здесь мне почему то не помогли.
Возможно есть еще какие то нюансы при настройке RPS на Linux?

 

Имеется HP ProLiant DL360e Gen8, 2хE5-2430L в суме 12 ядер , сетевая 82599ES.

 

Система:

Linux bras 3.16.36 #1 SMP Wed Sep 12 11:00:27 EEST 2018 x86_64 GNU/Linux

Параметры при загрузке:

/sbin/ethtool -G eth1 tx 4096 rx 4096
/sbin/ethtool -G eth4 tx 4096 rx 4096
/sbin/ethtool -K eth1 tx off rx off sg off tso off gso off gro off lro off
/sbin/ethtool -K eth4 tx off rx off sg off tso off gso off gro off lro off
/sbin/ifconfig eth1 txqueuelen 10000
/sbin/ifconfig eth4 txqueuelen 10000

RPS включаю следующим образом:

echo fff > /sys/class/net/eth1/queues/rx-0/rps_cpus

но данные настройки не дают никакого эффекта

 

egrep -e "(eth|CPU)" /proc/interrupts

Spoiler

          CPU0       CPU1       CPU2       CPU3       CPU4       CPU5       CPU6       CPU7       CPU8       CPU9       CPU10      CPU11
 107:       9041          0          0          0          0          0          0          0          0          0          0          0   PCI-MSI-edge      eth1-TxRx-0
 108:       1716          0          0          0          0          0          0          0          0          0          0          0   PCI-MSI-edge      eth1-TxRx-1
 109:       1862          0          0          0          0          0          0          0          0          0          0          0   PCI-MSI-edge      eth1-TxRx-2
 110:       1672          0          0          0          0          0          0          0          0          0          0          0   PCI-MSI-edge      eth1-TxRx-3
 111:       3471          0          0          0          0          0          0          0          0          0          0          0   PCI-MSI-edge      eth1-TxRx-4
 112:       1714          0          0          0          0          0          0          0          0          0          0          0   PCI-MSI-edge      eth1-TxRx-5
 113:       1699          0          0          0          0          0          0          0          0          0          0          0   PCI-MSI-edge      eth1-TxRx-6
 114:       1816          0          0          0          0          0          0          0          0          0          0          0   PCI-MSI-edge      eth1-TxRx-7
 115:       2375          0          0          0          0          0          0          0          0          0          0          0   PCI-MSI-edge      eth1-TxRx-8
 116:       1646          0          0          0          0          0          0          0          0          0          0          0   PCI-MSI-edge      eth1-TxRx-9
 117:       1692          0          0          0          0          0          0          0          0          0          0          0   PCI-MSI-edge      eth1-TxRx-10
 118:       1671          0          0          0          0          0          0          0          0          0          0          0   PCI-MSI-edge      eth1-TxRx-11
 119:          3          0          0          0          0          0          0          0          0          0          0          0   PCI-MSI-edge      eth1
 138:      15833          0          0          0          0          0          0          0          0          0          0          0   PCI-MSI-edge      eth4-TxRx-0
 139:       1599          0          0          0          0          0          0          0          0          0          0          0   PCI-MSI-edge      eth4-TxRx-1
 140:       2001          0          0          0          0          0          0          0          0          0          0          0   PCI-MSI-edge      eth4-TxRx-2
 141:       1564          0          0          0          0          0          0          0          0          0          0          0   PCI-MSI-edge      eth4-TxRx-3
 142:       1619          0          0          0          0          0          0          0          0          0          0          0   PCI-MSI-edge      eth4-TxRx-4
 143:       1597          0          0          0          0          0          0          0          0          0          0          0   PCI-MSI-edge      eth4-TxRx-5
 144:       1924          0          0          0          0          0          0          0          0          0          0          0   PCI-MSI-edge      eth4-TxRx-6
 145:       1667          0          0          0          0          0          0          0          0          0          0          0   PCI-MSI-edge      eth4-TxRx-7
 146:       1563          0          0          0          0          0          0          0          0          0          0          0   PCI-MSI-edge      eth4-TxRx-8
 147:       1608          0          0          0          0          0          0          0          0          0          0          0   PCI-MSI-edge      eth4-TxRx-9
 148:       1560          0          0          0          0          0          0          0          0          0          0          0   PCI-MSI-edge      eth4-TxRx-10
 149:       1572          0          0          0          0          0          0          0          0          0          0          0   PCI-MSI-edge      eth4-TxRx-11
 150:          2          0          0          0          0          0          0          0          0          0          0          0   PCI-MSI-edge      eth4

 

Share this post


Link to post
Share on other sites

А если так?

eth2smp.sh:

#!/bin/bash

NUM=0
CPUS=
for ARG in "$@"
do
        if [ $NUM -eq 0 ]; then INTERFACE=$ARG; fi
        if [ $NUM -gt 0 ]; then CPUS[$[$NUM-1]]=$ARG; fi
        let NUM++
done

if [ "$INTERFACE" != "" ] && [ "${CPUS[0]}" -ge 0 ]
then
        CPU_INDEX=0
        for irq in `cat /proc/interrupts | grep $INTERFACE | awk '{print $1}' | sed s/\://g`
        do
                f="/proc/irq/$irq/smp_affinity"
                test -r "$f" || continue
                if [ "${CPUS[$CPU_INDEX]}" != "" ] && [ ${CPUS[$CPU_INDEX]} -ge 0 ]
                then
                        MASK=`printf %x $[2 ** ${CPUS[$CPU_INDEX]}]`
                        printf "\nAssign SMP affinity: %-5s  IRQ: %-2d  CPU: %2d  MASK: 0x%s" $INTERFACE $irq ${CPUS[$CPU_INDEX]} $MASK
                        echo "$MASK" > "$f"
                fi
                let CPU_INDEX++
        done
        printf "\n"
fi

eth2smp.sh eth1 0 1 2 3 4 5 6 7 8 9 10 11 0

eth2smp.sh eth4 0 1 2 3 4 5 6 7 8 9 10 11 1

 

Share this post


Link to post
Share on other sites
15 minutes ago, pppoetest said:

А если так?

eth2smp.sh:


#!/bin/bash

NUM=0
CPUS=
for ARG in "$@"
do
        if [ $NUM -eq 0 ]; then INTERFACE=$ARG; fi
        if [ $NUM -gt 0 ]; then CPUS[$[$NUM-1]]=$ARG; fi
        let NUM++
done

if [ "$INTERFACE" != "" ] && [ "${CPUS[0]}" -ge 0 ]
then
        CPU_INDEX=0
        for irq in `cat /proc/interrupts | grep $INTERFACE | awk '{print $1}' | sed s/\://g`
        do
                f="/proc/irq/$irq/smp_affinity"
                test -r "$f" || continue
                if [ "${CPUS[$CPU_INDEX]}" != "" ] && [ ${CPUS[$CPU_INDEX]} -ge 0 ]
                then
                        MASK=`printf %x $[2 ** ${CPUS[$CPU_INDEX]}]`
                        printf "\nAssign SMP affinity: %-5s  IRQ: %-2d  CPU: %2d  MASK: 0x%s" $INTERFACE $irq ${CPUS[$CPU_INDEX]} $MASK
                        echo "$MASK" > "$f"
                fi
                let CPU_INDEX++
        done
        printf "\n"
fi

eth2smp.sh eth1 0 1 2 3 4 5 6 7 8 9 10 11 0

eth2smp.sh eth4 0 1 2 3 4 5 6 7 8 9 10 11 1

 

egrep -e "(eth|CPU)" /proc/interrupts

 

Spoiler

           CPU0       CPU1       CPU2       CPU3       CPU4       CPU5       CPU6       CPU7       CPU8       CPU9       CPU10      CPU11
 107:      11105          0          0          0          0          0          0          0          0          0          0          0   PCI-MSI-edge      eth1-TxRx-0
 108:       2912         72          0          0          0          0          0          0          0          0          0          0   PCI-MSI-edge      eth1-TxRx-1
 109:       2871          0         70          0          0          0          0          0          0          0          0          0   PCI-MSI-edge      eth1-TxRx-2
 110:       2817          0          0         74          0          0          0          0          0          0          0          0   PCI-MSI-edge      eth1-TxRx-3
 111:       2870          0          0          0         70          0          0          0          0          0          0          0   PCI-MSI-edge      eth1-TxRx-4
 112:       4239          0          0          0          0        117          0          0          0          0          0          0   PCI-MSI-edge      eth1-TxRx-5
 113:       4185          0          0          0          0          0        116          0          0          0          0          0   PCI-MSI-edge      eth1-TxRx-6
 114:       3142          0          0          0          0          0          0         75          0          0          0          0   PCI-MSI-edge      eth1-TxRx-7
 115:       2875          0          0          0          0          0          0          0         69          0          0          0   PCI-MSI-edge      eth1-TxRx-8
 116:       2805          0          0          0          0          0          0          0          0         72          0          0   PCI-MSI-edge      eth1-TxRx-9
 117:       3618          0          0          0          0          0          0          0          0          0        495          0   PCI-MSI-edge      eth1-TxRx-10
 118:       2850          0          0          0          0          0          0          0          0          0          0         75   PCI-MSI-edge      eth1-TxRx-11
 119:          4          0          0          0          0          0          0          0          0          0          0          0   PCI-MSI-edge      eth1
 138:      43353          0          0          0          0          0          0          0          0          0          0          0   PCI-MSI-edge      eth4-TxRx-0
 139:       2743         60          0          0          0          0          0          0          0          0          0          0   PCI-MSI-edge      eth4-TxRx-1
 140:       3098          0         57          0          0          0          0          0          0          0          0          0   PCI-MSI-edge      eth4-TxRx-2
 141:       3063          0          0         57          0          0          0          0          0          0          0          0   PCI-MSI-edge      eth4-TxRx-3
 142:       2805          0          0          0         61          0          0          0          0          0          0          0   PCI-MSI-edge      eth4-TxRx-4
 143:       3900          0          0          0          0         60          0          0          0          0          0          0   PCI-MSI-edge      eth4-TxRx-5
 144:       3069          0          0          0          0          0         57          0          0          0          0          0   PCI-MSI-edge      eth4-TxRx-6
 145:       2838          0          0          0          0          0          0         61          0          0          0          0   PCI-MSI-edge      eth4-TxRx-7
 146:       3026          0          0          0          0          0          0          0         72          0          0          0   PCI-MSI-edge      eth4-TxRx-8
 147:       2955          0          0          0          0          0          0          0          0         57          0          0   PCI-MSI-edge      eth4-TxRx-9
 148:       2721          0          0          0          0          0          0          0          0          0         58          0   PCI-MSI-edge      eth4-TxRx-10
 149:       4252          0          0          0          0          0          0          0          0          0          0         57   PCI-MSI-edge      eth4-TxRx-11
 150:          2          0          0          0          0          0          0          0          0          0          0          0   PCI-MSI-edge      eth4
 

 

Привязка разных очередей к ядрам работает нормально. Но в моем случае необходимо именно RPS так как нужно обрабатывать pppoe трафик.

Share this post


Link to post
Share on other sites

@Allin 

А что вы хотите увидеть в interrupts? Все правильно, прерывания приходят на 1 ядро.

RPS вы той командой включили, изменения увидите в top'e или в в proc/sofirqs или как там оно.

Share this post


Link to post
Share on other sites
On 13.09.2018 at 5:27 PM, kayot said:

@Allin 

А что вы хотите увидеть в interrupts? Все правильно, прерывания приходят на 1 ядро.

RPS вы той командой включили, изменения увидите в top'e или в в proc/sofirqs или как там оно.

Ожидал увидеть что все прерывания распределяются по всем ядрам , но оказалось был не прав.

Спасибо Вам за совет , посмотрел proc/sofirqs и top и увидел что нагрузка распределяется так как я ожидал.

Share this post


Link to post
Share on other sites

@Allin 

В /proc/interrupts аппаратные прерывания, на них мы можем повлиять только сменив сетевку/драйвер.

RPS же раскидывает дальнейшую обработку пакета по ядрам, это уже уровень soft irq.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this