|
Ключ
Эта строка удалена.
Это слово было удалено. Это слово было добавлено.
Эта строка добавлена.
|
Изменения (14)
просмотр истории страницыУниверсального рецепта для любой сетевой карты на процессоре с любым количеством ядер, к сожалению нет. |
Многие сетевые карты имеют несколько очередей для входящих пакетов. Каждая очередь висит на ядре/списке ядер. На многих железках из коробки, несмотря на то, что в smp_affinity_list указан список 0-$cpucount все прерывания находятся на первом ядре процессора. Обойти это можно раскидав с помощью echo все прерывания на разные ядра. |
|
Подробную информацию как правильно тюнить свою сетевую карту можно найти [в этой статье|http://docs.carbonsoft.ru/pages/viewpage.action?pageId=51380312#Потеринасетевыхкартахикакснимибороться-Распределениепрерываний]. |
Для систем с одним физическим процессором и сетевыми картами, использующими драйвера igb, ixgbe, vmxnet3 можно использовать утилиту: |
|
Пример: {code} |
/usr/local/Reductor/bin/tune_interrupts.sh eth1 {code} |
|
В остальных случаях она сделает хуже и требуется ручная настройка, рекомендации по ней: |
/usr/local/Reductor/userinfo/hooks/start.sh |
По возможности используйте разные реальные ядра, допустим, дано: - 1 процессор с гипертредингом - 4 реальных ядра - 8 виртуальных ядер - 4 очереди сетевой карты, которые составляют 95% работы сервера Раскинуть их на 0, 1, 2 и 3 ядра будет не так эффективно, как на 0, 2, 4 и 6. Пример кода (костыльный и неуниверсальный), который раскидывает 8 очередей на 8 ядер (довольно простой случай). Строка "-TxRx" - по ней можно идентифицировать очереди сетевой карты принимающей зеркало трафика, может отличаться в зависимости от модели сетевой карты и драйвера, посмотреть как она выглядит можно в файле cat /proc/interrupts |
{code} #!/bin/bash |
tune_nic() { echo "- Настраиваем прерывания $1" local nic="$1$2" local cpucount=$(grep -c 'model name' /proc/cpuinfo) grep $nic /proc/interrupts | while read irq $(eval echo cpu{1..$cpucount}) _ queue _; do irq=${irq//:} proc_entry=/proc/irq/$irq/smp_affinity_list evaled="${queue##*rx-}" echo $evaled > $proc_entry done } |
client_post_start_hook() { |
nic=eth1-TxRx- cpucount=$(grep -c 'model name' /proc/cpuinfo) grep $nic /proc/interrupts | while read irq $(eval echo cpu{1..$cpucount}) t queue t; do irq=${irq//:/} /proc/irq/$irq/smp_affinity_list |
tune_nic "eth1" "-rx" |
echo "${queue##*TxRx-}" > /proc/irq/$irq/smp_affinity_list tune_nic "eth2" "-TxRx" |
done |
} {code} |