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

Несимметричное распределение прерываний по очередям

Доброго времени суток, господа и дамы.

 

Столкнулся с непонятной проблемой.

 

Прочесть 44 страницы в теме "Linux softrouter" за разумный период времени невозможно, а быстрый поиск в ней ничего не дал - поэтому решил задать вопрос в отдельной теме.

 

Имеем 4-хядерный Intel Xeon E3-1220, имеем 10G сетевушку Intel 82599ES, имеем Gentoo на ядре 3.10.17. В системе есть и другие сетевушки, но трафик там несущественный, поэтому (как показала практика) тем трафиком можно пренебречь.

 

Сетевушка позволяет распределять прерывания (совмещенные - Tx и Rx) по 64 очередям. В нашем случае очереди распределяются по 4-м прерываниям, каждое из которых "прибито" к своему ядру: 1-я очередь - к CPU0, 2-я - к CPU1, и т.д.

 

Сначала картинка была идеальной - графики загрузки всех 4-х CPU шли практически "точка в точку". Но в один не очень прекрасный момент времени загрузка CPU0 стала превышать загрузку каждого из остальных процессоров примерно в 3 раза. Это произошло довольно давно, поэтому связать произошедшее с какими-либо нашими действиями не представляется возможным. А обратили внимание на это недавно, когда загрузка CPU0 в пиках стала достигать 100% - в эти периоды нагрузка на остальные процы резко падает, и общая пропускная способность сервера заметно снижается.

 

Сначала я грешил на остальные сетевушки (4 Intel 82576, собранные в bond), т.к. на них распределение по очередям практически не сказывается - почти все прерывания попадают в первую очередь, на остальные очереди приходится менее 0.1%.

 

Чтобы разгрузить CPU0, который, как мне казалось, перегружен из-за 82576, я перенастроил 82599ES на 3 очереди вместо четырех, и привязал каждую из 3-х очередей к процессорам от 1 до 3, исключив таким образом CPU0 из обработки прерываний от этой сетевушки.

 

Но, как показала практика, я ошибался. Загрузка CPU0 была вызвана именно обработкой прерываний от 10G сетевушки (точнее, прерываний 1-й очереди), т.к. теперь CPU0 загружен на 1%, а CPU1 (обрабатывающий 1-ю очередь) загружен в 3 с лишним раза больше, чем CPU2 и CPU3.

 

И вот теперь, собственно, вопрос: можно ли что-то сделать, чтобы равномерно распределить прерывания по очередям? Или единственный выход в нашей ситуации - замена 4-хядерного проца на 8-миядерный?

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


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

Какой тип трафика у вас? Есть ли q-in-q, pppoe?

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


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

В системе есть и другие сетевушки, но трафик там несущественный, поэтому (как показала практика) тем трафиком можно пренебречь.

 

Нельзя пренебречь. Для сетевушек разные маршруты? На всех сетевухах висят айпишники из одной подсети или из разных (с необходимостью создания n числа "дефолтных" маршрутов для каждой сетевухи)?

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


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

Какой тип трафика у вас? Есть ли q-in-q, pppoe?

Сервер - софт-роутер (пограничный маршрутизатор). Q-in-Q есть, PPPoE нету.

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


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

Сервер - софт-роутер. Q-in-Q есть, PPPoE нету.

RSS не работает для PPPoE (и не будет). Для Q-in-Q в чипе заложено пару функций, но в текущем драйвере ixgbe разрабы это не добавили и поэтому RSS тоже не работает.

Нужно включить биты IXGBE_DMATXCTL_GDV и IXGBE_CTRL_EXT_EXTENDED_VLAN в регистрах согласно даташиту.

Тут http://sourceforge.net/p/e1000/mailman/message/31896025/ Steve O'Brien писал, что у него вроде заработало.

У меня тоже такая проблема возникла, в бою пока не тестировал, в ближайшее время скорее всего будет возможность проверить.

 

А разрабы очень ленивые какие-то - много чего не добавили в драйвер, хотя может очень тщательно все тестируют, но в документации по драйверу все равно нету информации по этим вопросам.

Изменено пользователем alexmern

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


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

В системе есть и другие сетевушки, но трафик там несущественный, поэтому (как показала практика) тем трафиком можно пренебречь.

 

Нельзя пренебречь. Для сетевушек разные маршруты? На всех сетевухах висят айпишники из одной подсети или из разных (с необходимостью создания n числа "дефолтных" маршрутов для каждой сетевухи)?

Сами сетевушки адресов не имеют. net1-net4 (гигабитные) объединены в bond. На bond и на net5 (10 гиг) висят vlan'ы. Бриджей нет (т.е. на разных интерфейсах - разные vlan'ы). У всех vlan'ов - разные подсети, соответственно, разные IP адреса и разные маршруты.

 

Прерываниями с остальных сетевушек можно пренебречь, т.к. после освобождения CPU0 от обработки прерываний с net5, его загрузка упала почти до нуля. И при наступлении "времени Ч" (т.е. "полка" на одном из CPU) загрузка на CPU0 так и осталась около нуля. Т.е. проблема только в обработке прерываний именно с net5.

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


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

Сервер - софт-роутер. Q-in-Q есть, PPPoE нету.

RSS не работает для PPPoE (и не будет). Для Q-in-Q в чипе заложено пару функций, но в текущем драйвере ixgbe разрабы это не добавили и поэтому RSS тоже не работает.

Нужно включить биты IXGBE_DMATXCTL_GDV и IXGBE_CTRL_EXT_EXTENDED_VLAN в регистрах согласно даташиту.

Тут http://sourceforge.n...ssage/31896025/ Steve O'Brien писал, что у него вроде заработало.

У меня тоже такая проблема возникла, в бою пока не тестировал, в ближайшее время скорее всего будет возможность проверить.

 

А разрабы очень ленивые какие-то - много чего не добавили в драйвер, хотя может очень тщательно все тестируют, но в документации по драйверу все равно нету информации по этим вопросам.

Порылся в даташите, но так и не нашел, как это сделать. Даже в исходники драйвера заглянул! IXGBE_DMATXCTL_GDV только определяется (через #define), но нигде в коде не используется. А IXGBE_CTRL_EXT_EXTENDED_VLAN даже нигде не определяется.

 

Наверное, мне будет проще избавиться от Q-in-Q на этом сервере...

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


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

Как у себя проверю - пришлю патч на драйвер. Разработчики Double VLAN там вообще не делали.

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


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

Как у себя проверю - пришлю патч на драйвер. Разработчики Double VLAN там вообще не делали.

Буду весьма признателен!

 

Убрал QinQ - загрузка всех процессоров выровнялась.

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


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

diff -rupN ixgbe-3.22.3//src/ixgbe_main.c ixgbe-3.22.3-qinq//src/ixgbe_main.c
--- ixgbe-3.22.3//src/ixgbe_main.c      2014-08-15 04:17:42.000000000 +0500
+++ ixgbe-3.22.3-qinq//src/ixgbe_main.c 2014-11-18 19:07:49.000000000 +0500
@@ -3629,6 +3629,11 @@ static void ixgbe_configure_tx(struct ix
               dmatxctl |= IXGBE_DMATXCTL_TE;
               IXGBE_WRITE_REG(hw, IXGBE_DMATXCTL, dmatxctl);
       }
+       
+       /* Enable Global Double VLAN */
+       dmatxctl = IXGBE_READ_REG(hw, IXGBE_DMATXCTL);
+       dmatxctl |= IXGBE_DMATXCTL_GDV;
+       IXGBE_WRITE_REG(hw, IXGBE_DMATXCTL, dmatxctl);

       /* Setup the HW Tx Head and Tail descriptor pointers */
       for (i = 0; i < adapter->num_tx_queues; i++)
@@ -5719,6 +5724,12 @@ static void ixgbe_up_complete(struct ixg
       mod_timer(&adapter->service_timer, jiffies);

       ixgbe_clear_vf_stats_counters(adapter);
+
+       /* Set Extended VLAN bit */
+       ctrl_ext = IXGBE_READ_REG(hw, IXGBE_CTRL_EXT);
+       ctrl_ext |= IXGBE_CTRL_EXT_EXTENDED_VLAN;
+       IXGBE_WRITE_REG(hw, IXGBE_CTRL_EXT, ctrl_ext);
+
       /* Set PF Reset Done bit so PF/VF Mail Ops can work */
       ctrl_ext = IXGBE_READ_REG(hw, IXGBE_CTRL_EXT);
       ctrl_ext |= IXGBE_CTRL_EXT_PFRSTD;
diff -rupN ixgbe-3.22.3//src/ixgbe_type.h ixgbe-3.22.3-qinq//src/ixgbe_type.h
--- ixgbe-3.22.3//src/ixgbe_type.h      2014-08-15 04:17:42.000000000 +0500
+++ ixgbe-3.22.3-qinq//src/ixgbe_type.h 2014-11-18 19:08:04.000000000 +0500
@@ -1119,6 +1119,7 @@ struct ixgbe_thermal_sensor_data {
#define IXGBE_CTRL_EXT_NS_DIS  0x00010000 /* No Snoop disable */
#define IXGBE_CTRL_EXT_RO_DIS  0x00020000 /* Relaxed Ordering disable */
#define IXGBE_CTRL_EXT_DRV_LOAD        0x10000000 /* Driver loaded bit for FW */
+#define IXGBE_CTRL_EXT_EXTENDED_VLAN   0x04000000 /* Extended VLAN bit */

/* Direct Cache Access (DCA) definitions */
#define IXGBE_DCA_CTRL_DCA_ENABLE      0x00000000 /* DCA Enable */

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


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

Включить то это всё не проблема!

Намного интереснее теперь всё это выключить.

После включения данного функционала vlan-mon от Accel перестал создавать QinQ интерфейсы.

Ну я не долго думая откатил драйвер назад, только это не помогает, кто может помочь и подсказать как вернуть всё назад и выключить данный функционал в сетевой?

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


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

diff -rupN ixgbe-3.22.3//src/ixgbe_main.c ixgbe-3.22.3-qinq//src/ixgbe_main.c
--- ixgbe-3.22.3//src/ixgbe_main.c      2014-08-15 04:17:42.000000000 +0500
+++ ixgbe-3.22.3-qinq//src/ixgbe_main.c 2014-11-18 19:07:49.000000000 +0500
@@ -3629,6 +3629,11 @@ static void ixgbe_configure_tx(struct ix
               dmatxctl |= IXGBE_DMATXCTL_TE;
               IXGBE_WRITE_REG(hw, IXGBE_DMATXCTL, dmatxctl);
       }
+       
+       /* Enable Global Double VLAN */
+       dmatxctl = IXGBE_READ_REG(hw, IXGBE_DMATXCTL);
+       dmatxctl |= IXGBE_DMATXCTL_GDV;
+       IXGBE_WRITE_REG(hw, IXGBE_DMATXCTL, dmatxctl);

       /* Setup the HW Tx Head and Tail descriptor pointers */
       for (i = 0; i < adapter->num_tx_queues; i++)
@@ -5719,6 +5724,12 @@ static void ixgbe_up_complete(struct ixg
       mod_timer(&adapter->service_timer, jiffies);

       ixgbe_clear_vf_stats_counters(adapter);
+
+       /* Set Extended VLAN bit */
+       ctrl_ext = IXGBE_READ_REG(hw, IXGBE_CTRL_EXT);
+       ctrl_ext |= IXGBE_CTRL_EXT_EXTENDED_VLAN;
+       IXGBE_WRITE_REG(hw, IXGBE_CTRL_EXT, ctrl_ext);
+
       /* Set PF Reset Done bit so PF/VF Mail Ops can work */
       ctrl_ext = IXGBE_READ_REG(hw, IXGBE_CTRL_EXT);
       ctrl_ext |= IXGBE_CTRL_EXT_PFRSTD;
diff -rupN ixgbe-3.22.3//src/ixgbe_type.h ixgbe-3.22.3-qinq//src/ixgbe_type.h
--- ixgbe-3.22.3//src/ixgbe_type.h      2014-08-15 04:17:42.000000000 +0500
+++ ixgbe-3.22.3-qinq//src/ixgbe_type.h 2014-11-18 19:08:04.000000000 +0500
@@ -1119,6 +1119,7 @@ struct ixgbe_thermal_sensor_data {
#define IXGBE_CTRL_EXT_NS_DIS  0x00010000 /* No Snoop disable */
#define IXGBE_CTRL_EXT_RO_DIS  0x00020000 /* Relaxed Ordering disable */
#define IXGBE_CTRL_EXT_DRV_LOAD        0x10000000 /* Driver loaded bit for FW */
+#define IXGBE_CTRL_EXT_EXTENDED_VLAN   0x04000000 /* Extended VLAN bit */

/* Direct Cache Access (DCA) definitions */
#define IXGBE_DCA_CTRL_DCA_ENABLE      0x00000000 /* DCA Enable */

 

Крутяк! А может добавите патч в апстримный ixgbe?

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


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

diff -rupN ixgbe-3.22.3//src/ixgbe_main.c ixgbe-3.22.3-qinq//src/ixgbe_main.c
--- ixgbe-3.22.3//src/ixgbe_main.c      2014-08-15 04:17:42.000000000 +0500
+++ ixgbe-3.22.3-qinq//src/ixgbe_main.c 2014-11-18 19:07:49.000000000 +0500
@@ -3629,6 +3629,11 @@ static void ixgbe_configure_tx(struct ix
               dmatxctl |= IXGBE_DMATXCTL_TE;
               IXGBE_WRITE_REG(hw, IXGBE_DMATXCTL, dmatxctl);
       }
+       
+       /* Enable Global Double VLAN */
+       dmatxctl = IXGBE_READ_REG(hw, IXGBE_DMATXCTL);
+       dmatxctl |= IXGBE_DMATXCTL_GDV;
+       IXGBE_WRITE_REG(hw, IXGBE_DMATXCTL, dmatxctl);

       /* Setup the HW Tx Head and Tail descriptor pointers */
       for (i = 0; i < adapter->num_tx_queues; i++)
@@ -5719,6 +5724,12 @@ static void ixgbe_up_complete(struct ixg
       mod_timer(&adapter->service_timer, jiffies);

       ixgbe_clear_vf_stats_counters(adapter);
+
+       /* Set Extended VLAN bit */
+       ctrl_ext = IXGBE_READ_REG(hw, IXGBE_CTRL_EXT);
+       ctrl_ext |= IXGBE_CTRL_EXT_EXTENDED_VLAN;
+       IXGBE_WRITE_REG(hw, IXGBE_CTRL_EXT, ctrl_ext);
+
       /* Set PF Reset Done bit so PF/VF Mail Ops can work */
       ctrl_ext = IXGBE_READ_REG(hw, IXGBE_CTRL_EXT);
       ctrl_ext |= IXGBE_CTRL_EXT_PFRSTD;
diff -rupN ixgbe-3.22.3//src/ixgbe_type.h ixgbe-3.22.3-qinq//src/ixgbe_type.h
--- ixgbe-3.22.3//src/ixgbe_type.h      2014-08-15 04:17:42.000000000 +0500
+++ ixgbe-3.22.3-qinq//src/ixgbe_type.h 2014-11-18 19:08:04.000000000 +0500
@@ -1119,6 +1119,7 @@ struct ixgbe_thermal_sensor_data {
#define IXGBE_CTRL_EXT_NS_DIS  0x00010000 /* No Snoop disable */
#define IXGBE_CTRL_EXT_RO_DIS  0x00020000 /* Relaxed Ordering disable */
#define IXGBE_CTRL_EXT_DRV_LOAD        0x10000000 /* Driver loaded bit for FW */
+#define IXGBE_CTRL_EXT_EXTENDED_VLAN   0x04000000 /* Extended VLAN bit */

/* Direct Cache Access (DCA) definitions */
#define IXGBE_DCA_CTRL_DCA_ENABLE      0x00000000 /* DCA Enable */

 

Крутяк! А может добавите патч в апстримный ixgbe?

 

Это работает кстати на любой версии драйверов! И на 3.X.X и на 4.X.X.

Изменено пользователем walertos

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


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

После включения данного функционала vlan-mon от Accel перестал создавать QinQ интерфейсы. Ну я не долго думая откатил драйвер назад, только это не помогает, кто может помочь и подсказать как вернуть всё назад и выключить данный функционал в сетевой?

Мон не должен был сломаться.

Здесь просто указывается сетевухе что в эзернете двойной тэг.

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

 

Если тебе отката мало то:

1. выключи питание совсем минут на 5.

2. если не помогло то пропатч патч:

dmatxctl &= ~IXGBE_DMATXCTL_GDV;

...

ctrl_ext &= ~IXGBE_CTRL_EXT_EXTENDED_VLAN;

и пересобери дрова, так гарантированно QinQ отключится.

 

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


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

может попробовать отключить vlan offload через ethtool? :)

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


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

может попробовать отключить vlan offload через ethtool? :)

 

Уже отключено и было отключено.

 

 

ethtool -k eth5
rx-vlan-filter: on [fixed]

 

Вот может это мешает!?

 

Скоро соберём тестовый сервак и будем пробовать!

 

После включения данного функционала vlan-mon от Accel перестал создавать QinQ интерфейсы. Ну я не долго думая откатил драйвер назад, только это не помогает, кто может помочь и подсказать как вернуть всё назад и выключить данный функционал в сетевой?

Мон не должен был сломаться.

Здесь просто указывается сетевухе что в эзернете двойной тэг.

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

 

Если тебе отката мало то:

1. выключи питание совсем минут на 5.

2. если не помогло то пропатч патч:

dmatxctl &= ~IXGBE_DMATXCTL_GDV;

...

ctrl_ext &= ~IXGBE_CTRL_EXT_EXTENDED_VLAN;

и пересобери дрова, так гарантированно QinQ отключится.

 

А можно немного подробнее, как именно добавить это в патч?

Между каких строк или вместо какой из строк?

Изменено пользователем walertos

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


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

Вместо:

dmatxctl |= IXGBE_DMATXCTL_GDV;

и

ctrl_ext |= IXGBE_CTRL_EXT_EXTENDED_VLAN;

 

 

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


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

Последняя на данный момент версия драйвера ixgbe c опцией qinq для rss.

https://github.com/intersvyaz/ixgbe/tree/4.3.13-netmap

На netmap можно не обращать внимания, т.к. он будет пропущен если сборка выполняется не для него.

Изменено пользователем gureedo

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


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

gureedo похоже, мы делаем одинаковую работу https://github.com/pavel-odintsov/ixgbe-linux-netmap/commits/master :)

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


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

gureedo похоже, мы делаем одинаковую работу https://github.com/pavel-odintsov/ixgbe-linux-netmap/commits/master :)

netmap наше всё)

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


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

netmap наше всё)

Только DPDK, только хардкор =)

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


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

netmap наше всё)

Только DPDK, только хардкор =)

 

Такие вещи надо обсуждать под пиво и в Skype :) Мой - energy_true.

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


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

netmap наше всё)

Только DPDK, только хардкор =)

 

Такие вещи надо обсуждать под пиво и в Skype :) Мой - energy_true.

Ну мой скайп ты знаешь )

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


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

Update по теме - мой патч работает в бою упешно.

 

Для тех кто включал и у него не заработало, нужно добавить это:

ethtool -K eth0 rxvlan off txvlan off
ethtool -K eth0 rx-vlan-filter off

 

40: 3755273838          0          0          0          0          0          0          0   PCI-MSI-edge      eth0-TxRx-0
41:          7 3670363860          0          0          0          0          0          0   PCI-MSI-edge      eth0-TxRx-1
42:          7          0 3592521918          0          0          0          0          0   PCI-MSI-edge      eth0-TxRx-2
43:          7          0          0 3722244061          0          0          0          0   PCI-MSI-edge      eth0-TxRx-3
44:          7          0          0          0 3709475958          0          0          0   PCI-MSI-edge      eth0-TxRx-4
45:          7          0          0          0          0 3700686839          0          0   PCI-MSI-edge      eth0-TxRx-5
46:          7          0          0          0          0          0 3673804167          0   PCI-MSI-edge      eth0-TxRx-6
47:          7          0          0          0          0          0          0 3647398649   PCI-MSI-edge      eth0-TxRx-7

Изменено пользователем alexmern

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


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

Join the conversation

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

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

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

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

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

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

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