Настройка сетевого стека linux для высоконагруженных систем

Установка и настройка kdump

$ sudo apt-get install linux-crashdump kdump-tools
# kdump-tools configuration
# ---------------------------------------------------------------------------
# USE_KDUMP - controls kdump will be configured
#     0 - kdump kernel will not be loaded
#     1 - kdump kernel will be loaded and kdump is configured
# KDUMP_SYSCTL - controls when a panic occurs, using the sysctl
#     interface.  The contents of this variable should be the
#     "variable=value ..." portion of the 'sysctl -w ' command.
#     If not set, the default value "kernel.panic_on_oops=1" will
#     be used.  Disable this feature by setting KDUMP_SYSCTL=" "
#     Example - also panic on oom:
#         KDUMP_SYSCTL="kernel.panic_on_oops=1 vm.panic_on_oom=1"
#
USE_KDUMP=1
# KDUMP_SYSCTL="kernel.panic_on_oops=1"
  • KDUMP_KERNEL — полный путь к аварийному ядру;
  • KDUMP_INITRD — полный путь к initrd аварийного ядра;
  • KDUMP_CORE — указывает, где будет сохранен файл дампа ядра. По умолчанию дамп сохраняется в директории /var/crash (KDUMP_CORE=/var/crash);
  • KDUMP_FAIL_CMD — указывает, какое действие нужно совершить в случае ошибки при сохранении дампа (по умолчанию будет выполнена команда reboot -f);
  • DEBUG_KERNEL — отладочная версия работающего ядра. По умолчанию используются /usr/lib/debug/vmlinux-$. Если значение этого параметра не установлено, утилита makedumpfile создаст только дамп всех страниц памяти;
  • MAKEDUMP_ARGS — содержит дополнительные аргументы, передаваемые утилите makedumpfile. По умолчанию этот параметр имеет значение ‘-c -d 31’, указывающую, что необходимо использовать сжатие и включать в дамп только используемые страницы ядра.
$ cat/proc/cmdline

BOOT_IMAGE=/boot/vmlinuz-3.8.0-35-generic root=UUID=bb2ba5e1-48e1-4829-b565-611542b96018 ro crashkernel=384 -:128M quiet splash vt.handoff=7
$ sudo tee /etc/apt/sources.list.d/ddebs.list << EOF
deb http://ddebs.ubuntu.com/ $(lsb_release -cs)          main restricted universe multiverse
deb http://ddebs.ubuntu.com/ $(lsb_release -cs)-security main restricted universe multiverse
deb http://ddebs.ubuntu.com/ $(lsb_release -cs)-updates  main restricted universe multiverse
deb http://ddebs.ubuntu.com/ $(lsb_release -cs)-proposed main restricted universe multiverse
EOF
$ sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys ECDCAD72428D7C01
$ sudo apt-get update
$ sudo apt-get install linux-image-$(uname -r)-dbgsym
$ kdump-config status
current state: ready to kdump

Запуск приложений

Следующим этапом тюнинга ОС является настройка сети и запуск необходимых приложений в файле /etc/rc.conf.

hostname=»host.domain.com»

# Настраиваем сеть

ifconfig_em0=»inet 172.16.1.5 netmask 255.255.255.0″

ifconfig_em1=»inet 10.16.1.51 netmask 255.255.255.0″

defaultrouter=»172.16.1.1″

# Запуск SSHD при загрузки

sshd_enable=»YES»

# Запрещаем SSHD выполнять запросы к DNS

sshd_flags=»-u0″

# Отключаем использование USB

usbd_enable=»NO»

# Отключаем sendmail

sendmail_enable=NONE

# Запускаем ntpd при старте ОС

ntpd_enable=»YES»

# **Отключаем NFS**

inetd_enable=»NO»

portmap_enable=»NO»

nfs_client_enable=»NO»

nfs_reserved_port_only=»NO»

nfs_server_enable=»NO»

# **Небольшая защита от DDOSа**

tcp_drop_synfin=»YES»

icmp_drop_redirect=»YES»

icmp_log_redirect=»NO»

# Запускаем систему журналирования

syslogd_enable=»YES»

# Указываем syslog сохранять только локальные сообщений

# и не выполняет DNS запросов

syslogd_flags=»-s -n»

# Включить fsck при загрузке

fsck_y_enable=»YES»

# Выполнять во время загрузки ОС

background_fsck=»NO»

# **Сохраняем корки ядра**

dumpdir=»/home»

dumpdev=»AUTO»

# Отключить SNMPD

snmpd_enable=»NO»

# **Настройка фаервола**

firewall_enable=»YES»

firewall_script=»/etc/rc.ipfw»

И напоследок добавим в файл /etc/rc.local скрипты которые нужно выполнить при загрузке.

# по мотивам  этой статьи

/usr/local/startup/cpuset-emigb.sh

Параметры применяемые “на лету”

Для изменения параметров в уже загруженной ОС необходимо выполнить следующую команду:

## param_name – название параметра, value – значение

Также следует продублировать изменения в файл /etc/sysctl.conf, в противном случае, после перезагрузки, будет применено значение по умолчанию.

security.bsd.see_other_uids=0

# Количество сокетов

kern.ipc.maxsockets=204800

# Mbuf clusters

kern.ipc.nmbclusters=262144

# Запрещает вытеснение Wired памяти в Swap

kern.ipc.shm_use_phys=1

# Размер очереди для приема новых TCP соединений

kern.ipc.somaxconn=4096

# Определяет максимальное число дескрипторов файлов

kern.maxfiles=204800

# Максимальное число файлов на один процесс

kern.maxfilesperproc=200000

# Количество файловых дескрипторов закэшированых в памяти

kern.maxvnodes=256000

# не использовать трафик и прерывания

kern.random.sys.harvest.ethernet=0

# как источник энтропии для random’a

kern.random.sys.harvest.interrupt=0

# Попытаться синхронизировать диски при панике, для избежания

# fsck после перезагрузки

kern.sync_on_panic=1

# Для защиты от SMURF атак (ICMP echo request на broadcast адрес)

net.inet.icmp.bmcastecho=0

# Игнорировать пакеты icmp redirect

net.inet.icmp.drop_redirect=1

# Не отдавать по icmp маску своей подсети

net.inet.icmp.maskrepl=0

# Размер очереди IP-пакетов

# (Необходимо увеличивать если net.inet.ip.intr_queue_drops != 0)

net.inet.ip.intr_queue_maxlen=256

# Количество фрагментированных пакетов в очереди

net.inet.ip.maxfragpackets=1024

# Минимальный порт для исходящих соединений

net.inet.ip.portrange.first=1024

# Максимальный порт для исходящих соединений

net.inet.ip.portrange.last=65535

# Не использовать случайные порты для исх. соединений

net.inet.ip.portrange.randomized=0

# Не реагируем на ICMP редирект

net.inet.ip.redirect=0

# Отключение маршрутизации от источника

net.inet.ip.sourceroute=0

net.inet.ip.accept_sourceroute=0

# Не отвечать на все пакеты полученные на закрытый порт

net.inet.tcp.blackhole=2

# Отбрасывать пакеты с флагами SYN+FIN

net.inet.tcp.drop_synfin=1

# FIN_WAIT_2 state fast recycle

net.inet.tcp.fast_finwait2_recycle=1

# FIN_WAIT_2 таймаут

net.inet.tcp.finwait2_timeout=3000

# Время хранение hostcache

net.inet.tcp.hostcache.expire=1200

# Timeout for establishing syn

net.inet.tcp.keepinit=5000

# Максимально количество TIME_WAIT сокетов

net.inet.tcp.maxtcptw=65536

# Количество времени пребывания соединения в состоянии TIME_WAIT

# (в миллисекундах деленных на 2, 2 x 30000 MSL = 60 секунд)

net.inet.tcp.msl=5000

# Отключить автоподстройку receive буфера

net.inet.tcp.recvbuf_auto=0

# Размер receive буфера

net.inet.tcp.recvspace=65536

# Отключить автоподстройку send буфера

net.inet.tcp.sendbuf_auto=0

# Размер send буфера

net.inet.tcp.sendspace=131072

# Возможность перехода в «TCP SYN cookies» при переполнении syncache

net.inet.tcp.syncookies=1

# Отключаем использование TSO для сетевых карт

net.inet.tcp.tso=0

# Отбрасываются все UDP пакеты, адресованные закрытым портам

net.inet.udp.blackhole=1

# Размер UDP receive буфера

net.inet.udp.recvspace=32768

# Обрабатывать исходящие пакеты непосредственно при попытке отправки

net.isr.direct=1

# Размер исходящей очереди

net.route.netisr_maxqlen=1024

# При большом количестве файлов на сервере

vfs.ufs.dirhash_maxmem=100000000

Скрипты

Скрипт инициализации фаервола /etc/rc.ipfw:

WAN=»em0″

LAN=»em1″

OPEN_PORT=»80,443″

IPFW=`which ipfw`

RET=$?

if ; then

echo «IPFW not found.»

exit ${RET}

fi

${IPFW} -f flush

${IPFW} -f table 1 flush

${IPFW} add 100 allow ip from any to any via lo0

${IPFW} add 110 deny ip from any to 127.0.0.0/8

${IPFW} add 120 deny ip from 127.0.0.0/8 to any

${IPFW} add 130 allow ip from any to any via ${LAN}

${IPFW} add 140 deny all from table(1) to me

${IPFW} add 150 deny all from any to any frag

${IPFW} add 160 allow carp from any to any via ${WAN}

${IPFW} add 180 allow tcp from any to any via ${WAN} established

${IPFW} add 200 check-state

${IPFW} add 210 allow tcp from me to any via ${WAN} setup keep-state

${IPFW} add 220 allow udp from me to any via ${WAN} keep-state

${IPFW} add 230 allow tcp from any to me dst-port ${OPEN_PORT} via ${WAN}

${IPFW} add 240 allow icmp from any to any icmptypes 0,8 via ${WAN}

${IPFW} add 65530 deny ip from any to any

exit 0

Скрипт привязывания прерываний очередей сетевых карт к процессорным ядрам /usr/local/startup/cpuset-emigb.sh:

cpus=`sysctl -n kern.smp.cpus`

DRIVER=`pciconf -l | egrep ’em|igb’ | sed -E ‘s/^(+).*/1/’ | head -n 1`

case «$DRIVER» in

em)

echo $DRIVER

i=1

vmstat -ai | egrep «em:x» | sed -E ‘s/^irq(+): (em):(+).*/1 2 3/’ |

while read irq iface queue

do

cpu=$(( $i % $cpus ))

echo «Binding ${iface} queue ${queue} (irq ${irq}) -> CPU${cpu}»

cpuset -l $cpu -x $irq

i=$(( $i + 1 ))

done

;;

igb)

echo $DRIVER

vmstat -ai | sed -E ‘/^irq.*que/!d; s/^irq(+): igb(+):que (+).*/1 2 3/’ |

while read irq iface queue

do

cpu=$(( ($iface+$queue) % $cpus ))

echo «Binding igb${iface} queue ${queue} (irq ${irq}) -> CPU${cpu}»

cpuset -l $cpu -x $irq

done

;;

esac

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

Для правки настроек, которые применяются только при загрузке, нужно внести изменения в файл /boot/loader.conf, после чего выполнить перезагрузку ОС.

kern.ipc.nmbclusters=0

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

net.inet.tcp.reass.maxsegments=2048

# Для избежания лимита «PV Entry»

vm.pmap.shpgperproc=400

# Позволяет принимать за одно прерывание до 4096 пакетов

hw.em.rxd=4096

# Позволяет передавать за одно прерывание до 4096 пакетов

hw.em.txd=4096

# Минимальная задержка между генерациями прерываний в мкс для приема данных

hw.em.rx_int_delay=100

# Минимальная задержка между генерациями прерываний в мкс для передачу данных

hw.em.tx_int_delay=100

# Максимальная задержка между генерациями прерываний в мкс для приема данных

hw.em.rx_abs_int_delay=1000

# Максимальная задержка между генерациями прерываний в мкс для передачи данных

hw.em.tx_abs_int_delay=1000

dev.em.rx_processing_limit=-1

# **Настройка hostcache**

net.inet.tcp.hostcache.hashsize=4096

net.inet.tcp.hostcache.bucketlimit=100

net.inet.tcp.hostcache.cachelimit=65536

# **Настройка syncache**

net.inet.tcp.syncache.hashsize=1024

net.inet.tcp.syncache.bucketlimit=100

net.inet.tcp.syncache.cachelimit=65536

# Таблица TCP control-block

net.inet.tcp.tcbhashsize=4096

# **Настройка net.isr**

# Очередь netisr

net.isr.defaultqlimit=4096

# Каждая очередь к отдельному ядру

net.isr.bindthreads=1

# Количество потоков netist (равно количеству ядер)

net.isr.maxthreads=8

# Размер очереди исходящий пакетов

net.link.ifqmaxlen=1024

# **Модули**

# Загружаем драйвер AHCI

ahci_load=»YES»

# Асинхронное выполнение IO системных вызовов

aio_load=»YES»

Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Техноарена
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: