Перейти к содержимому
Калькуляторы

Перенос BGP(quagga) с FreeBSD на Linux проблема с маршрутизацией

Добрый день!

Переводим BGP с FreeBSD(8.0 STABLE) на Linux(Debian 2.6.33.20). Столкнулись с такой проблемой - при подключении более одного аплинка, перестает работатать часть ресурсов интернета. Опытным путем удалось установить: если трафик ходит в обе стороны через одного аплинка (один и тот же сетевой интерфейс), то работает. Если же трафик уходит через одного аплинка, а возвращается через другого (тисипидампом видим пакеты), то на интерфейсе, который смотрит в сторону сети виден только исходящий трафик от абонента, а входящего нету. Обратные маршруты в сеть при этом есть.

На FreeBSD такой проблемы не наблюдалось. Настройки BGP на Linux идентичны FreeBSD. ip_forwarding включен. В ядре дополнительных параметров не включали. Единственное, что в /etc/modprobe.d/blacklist.conf добавили:

blacklist ip_conntrack
blacklist nfnetlink
blacklist nf_conntrack_ipv4
blacklist nf_conntrack
blacklist nf_defrag_ipv4
blacklist iptable_nat
blacklist nf_nat

Чтобы не создавались стейты (меньше нагрузка на cpu).

Сначала погрешили на bonding, смотрящий в сеть. Разобрали - не помогло.

Погрешили на 10ГБ сетевуху (Intel Ethernet Server Adapter X520-DA2) - воткнулись в гигабитную сетевуху (Intel Corporation 82576 Gigabit Network Connection), повторили тест - не помогло.

Обе сетевухи тюним так:

/sbin/rmmod igb
/sbin/modprobe igb IntMode=2,2,2,2,2,2,2,2,2,2,2,2 InterruptThrottleRate=1,1,1,1,1,1,1,1,1,1,1,1 RSS=6,6,6,6,6,6,6,6,6,6,6,6 QueuePairs=1,1,1,1,1,1,1,1,1,1,1,1 LLIPort=80
/sbin/rmmod ixgbe
/sbin/modprobe ixgbe IntMode=2,2,2,2,2,2,2,2,2,2,2,2 InterruptThrottleRate=1,1,1,1,1,1,1,1,1,1,1,1 RSS=6,6,6,6,6,6,6,6,6,6,6,6 LLIPort=80

/usr/sbin/service networking restart

# изменить размеры буферов сетевых интерфейсов
/sbin/ethtool -G eth0  tx 2048
/sbin/ethtool -G eth0  rx 2048

/sbin/ethtool -G eth1  tx 2048
/sbin/ethtool -G eth1  rx 2048
/sbin/ethtool -G eth2  tx 2048
/sbin/ethtool -G eth2  rx 2048
/sbin/ethtool -G eth3  tx 2048
/sbin/ethtool -G eth3  rx 2048
......
# Для 10GB сетевухи
/sbin/ethtool -G eth9  tx 4096
/sbin/ethtool -G eth9  rx 4096
# отключить flow control на сетевых интерфейсах
/sbin/ethtool -A eth0  autoneg off rx off tx off
/sbin/ethtool -A eth1  autoneg off rx off tx off
/sbin/ethtool -A eth2  autoneg off rx off tx off
/sbin/ethtool -A eth3  autoneg off rx off tx off
.......
# Для 10GB сетевухи
/sbin/ethtool -A eth9  autoneg off rx off tx off
# изменить размер очереди передаваемых пакетов на сетевых интерфейсах
/sbin/ifconfig eth0  txqueuelen 10000
/sbin/ifconfig eth1  txqueuelen 10000
/sbin/ifconfig eth2  txqueuelen 10000
/sbin/ifconfig eth3  txqueuelen 10000
.......
# Для 10GB сетевухи
/sbin/ifconfig eth9  txqueuelen 10000
# распределяем по разным ЦП прерывания очередей сетевых интерфейсов
/sbin/ifconfig eth0 up
/bin/echo 1   > /proc/irq/`/bin/cat /proc/interrupts | /bin/grep 'eth0-TxRx-0' | /usr/bin/awk -F \: '{printf $1}'| /usr/bin/tr -d ' '`/smp_affinity
/bin/echo 2   > /proc/irq/`/bin/cat /proc/interrupts | /bin/grep 'eth0-TxRx-1' | /usr/bin/awk -F \: '{printf $1}'| /usr/bin/tr -d ' '`/smp_affinity
/bin/echo 4   > /proc/irq/`/bin/cat /proc/interrupts | /bin/grep 'eth0-TxRx-2' | /usr/bin/awk -F \: '{printf $1}'| /usr/bin/tr -d ' '`/smp_affinity
/bin/echo 8   > /proc/irq/`/bin/cat /proc/interrupts | /bin/grep 'eth0-TxRx-3' | /usr/bin/awk -F \: '{printf $1}'| /usr/bin/tr -d ' '`/smp_affinity
/bin/echo 10  > /proc/irq/`/bin/cat /proc/interrupts | /bin/grep 'eth0-TxRx-4' | /usr/bin/awk -F \: '{printf $1}'| /usr/bin/tr -d ' '`/smp_affinity
/bin/echo 20  > /proc/irq/`/bin/cat /proc/interrupts | /bin/grep 'eth0-TxRx-5' | /usr/bin/awk -F \: '{printf $1}'| /usr/bin/tr -d ' '`/smp_affinity
/sbin/ifconfig eth1 up
/bin/echo 40  > /proc/irq/`/bin/cat /proc/interrupts | /bin/grep 'eth1-TxRx-0' | /usr/bin/awk -F \: '{printf $1}'| /usr/bin/tr -d ' '`/smp_affinity
/bin/echo 80  > /proc/irq/`/bin/cat /proc/interrupts | /bin/grep 'eth1-TxRx-1' | /usr/bin/awk -F \: '{printf $1}'| /usr/bin/tr -d ' '`/smp_affinity
/bin/echo 100 > /proc/irq/`/bin/cat /proc/interrupts | /bin/grep 'eth1-TxRx-2' | /usr/bin/awk -F \: '{printf $1}'| /usr/bin/tr -d ' '`/smp_affinity
/bin/echo 200 > /proc/irq/`/bin/cat /proc/interrupts | /bin/grep 'eth1-TxRx-3' | /usr/bin/awk -F \: '{printf $1}'| /usr/bin/tr -d ' '`/smp_affinity
/bin/echo 400 > /proc/irq/`/bin/cat /proc/interrupts | /bin/grep 'eth1-TxRx-4' | /usr/bin/awk -F \: '{printf $1}'| /usr/bin/tr -d ' '`/smp_affinity
/bin/echo 800 > /proc/irq/`/bin/cat /proc/interrupts | /bin/grep 'eth1-TxRx-5' | /usr/bin/awk -F \: '{printf $1}'| /usr/bin/tr -d ' '`/smp_affinity
/sbin/ifconfig eth2 up
/bin/echo 1   > /proc/irq/`/bin/cat /proc/interrupts | /bin/grep 'eth2-TxRx-5' | /usr/bin/awk -F \: '{printf $1}'| /usr/bin/tr -d ' '`/smp_affinity
/bin/echo 2   > /proc/irq/`/bin/cat /proc/interrupts | /bin/grep 'eth2-TxRx-4' | /usr/bin/awk -F \: '{printf $1}'| /usr/bin/tr -d ' '`/smp_affinity
/bin/echo 4   > /proc/irq/`/bin/cat /proc/interrupts | /bin/grep 'eth2-TxRx-3' | /usr/bin/awk -F \: '{printf $1}'| /usr/bin/tr -d ' '`/smp_affinity
/bin/echo 8   > /proc/irq/`/bin/cat /proc/interrupts | /bin/grep 'eth2-TxRx-2' | /usr/bin/awk -F \: '{printf $1}'| /usr/bin/tr -d ' '`/smp_affinity
/bin/echo 10  > /proc/irq/`/bin/cat /proc/interrupts | /bin/grep 'eth2-TxRx-1' | /usr/bin/awk -F \: '{printf $1}'| /usr/bin/tr -d ' '`/smp_affinity
/bin/echo 20  > /proc/irq/`/bin/cat /proc/interrupts | /bin/grep 'eth2-TxRx-0' | /usr/bin/awk -F \: '{printf $1}'| /usr/bin/tr -d ' '`/smp_affinity
/sbin/ifconfig eth3 up
/bin/echo 40  > /proc/irq/`/bin/cat /proc/interrupts | /bin/grep 'eth3-TxRx-5' | /usr/bin/awk -F \: '{printf $1}'| /usr/bin/tr -d ' '`/smp_affinity
/bin/echo 80  > /proc/irq/`/bin/cat /proc/interrupts | /bin/grep 'eth3-TxRx-4' | /usr/bin/awk -F \: '{printf $1}'| /usr/bin/tr -d ' '`/smp_affinity
/bin/echo 100 > /proc/irq/`/bin/cat /proc/interrupts | /bin/grep 'eth3-TxRx-3' | /usr/bin/awk -F \: '{printf $1}'| /usr/bin/tr -d ' '`/smp_affinity
/bin/echo 200 > /proc/irq/`/bin/cat /proc/interrupts | /bin/grep 'eth3-TxRx-2' | /usr/bin/awk -F \: '{printf $1}'| /usr/bin/tr -d ' '`/smp_affinity
/bin/echo 400 > /proc/irq/`/bin/cat /proc/interrupts | /bin/grep 'eth3-TxRx-1' | /usr/bin/awk -F \: '{printf $1}'| /usr/bin/tr -d ' '`/smp_affinity
/bin/echo 800 > /proc/irq/`/bin/cat /proc/interrupts | /bin/grep 'eth3-TxRx-0' | /usr/bin/awk -F \: '{printf $1}'| /usr/bin/tr -d ' '`/smp_affinity
......
# Для 10GB сетевухи
/sbin/ifconfig eth9 up
/bin/echo 1   > /proc/irq/`/bin/cat /proc/interrupts | /bin/grep 'eth9-TxRx-5' | /usr/bin/awk -F \: '{printf $1}'| /usr/bin/tr -d ' '`/smp_affinity
/bin/echo 2   > /proc/irq/`/bin/cat /proc/interrupts | /bin/grep 'eth9-TxRx-4' | /usr/bin/awk -F \: '{printf $1}'| /usr/bin/tr -d ' '`/smp_affinity
/bin/echo 4   > /proc/irq/`/bin/cat /proc/interrupts | /bin/grep 'eth9-TxRx-3' | /usr/bin/awk -F \: '{printf $1}'| /usr/bin/tr -d ' '`/smp_affinity
/bin/echo 8   > /proc/irq/`/bin/cat /proc/interrupts | /bin/grep 'eth9-TxRx-2' | /usr/bin/awk -F \: '{printf $1}'| /usr/bin/tr -d ' '`/smp_affinity
/bin/echo 10  > /proc/irq/`/bin/cat /proc/interrupts | /bin/grep 'eth9-TxRx-1' | /usr/bin/awk -F \: '{printf $1}'| /usr/bin/tr -d ' '`/smp_affinity
/bin/echo 20  > /proc/irq/`/bin/cat /proc/interrupts | /bin/grep 'eth9-TxRx-0' | /usr/bin/awk -F \: '{printf $1}'| /usr/bin/tr -d ' '`/smp_affinity

/etc/sysctl.conf

# Controls IP packet forwarding
net.ipv4.ip_forward = 1
# Controls source route verification
net.ipv4.conf.default.rp_filter = 1
# 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 maximum size of a message, in bytes
kernel.msgmnb = 65536
# Controls the default maxmimum size of a mesage queue
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
#Увеличиваем максимальный размер памяти отводимой для TCP буферов
net.core.wmem_max = 16777216
net.core.rmem_max = 16777216
#Тюнинг буферов для TCP и UDP соединений (min, default, max bytes)
net.ipv4.tcp_rmem = 8192 8388608 16777216
net.ipv4.tcp_wmem = 8192 4194394 16777216
#Запрещаем кеширование статуса ssthresh
net.ipv4.tcp_no_metrics_save = 1
#размер backlog
net.core.netdev_max_backlog = 1000
#Увеличиваем число входящих соединений, которые могут стоять в очереди, прежде чем будут отброшены
net.core.somaxconn = 262144
#Размер буферов по умолчанию для приема и отправки данных через сокеты
net.core.wmem_default = 4194394
net.core.rmem_default = 8388608
net.ipv4.tcp_max_tw_buckets = 1440000

Изменено пользователем nicol@s

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Разобрались сами.

Были невнимательны. В sysctl.conf сделали:

net.ipv4.conf.default.rp_filter=0
net.ipv4.conf.all.rp_filter=0

и все заработало

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Гость
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Вставить в виде обычного текста

  Разрешено не более 75 смайлов.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.