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

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

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

 

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

 

Прочесть 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-миядерный?

Share this post


Link to post
Share on other sites

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

Share this post


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

 

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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

Сервер - софт-роутер. 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 писал, что у него вроде заработало.

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

 

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

Edited by alexmern

Share this post


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

 

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

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

 

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

Share this post


Link to post
Share on other sites

Сервер - софт-роутер. 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 на этом сервере...

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

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

 

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

Share this post


Link to post
Share on other sites
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 */

Share this post


Link to post
Share on other sites

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

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

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

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

Share this post


Link to post
Share on other sites

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?

Share this post


Link to post
Share on other sites

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.

Edited by walertos

Share this post


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

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

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

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

 

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

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

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

dmatxctl &= ~IXGBE_DMATXCTL_GDV;

...

ctrl_ext &= ~IXGBE_CTRL_EXT_EXTENDED_VLAN;

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

 

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

может попробовать отключить 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 отключится.

 

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

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

Edited by walertos

Share this post


Link to post
Share on other sites

Вместо:

dmatxctl |= IXGBE_DMATXCTL_GDV;

и

ctrl_ext |= IXGBE_CTRL_EXT_EXTENDED_VLAN;

 

 

Share this post


Link to post
Share on other sites

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

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

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

Edited by gureedo

Share this post


Link to post
Share on other sites

netmap наше всё)

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

 

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

Share this post


Link to post
Share on other sites

netmap наше всё)

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

 

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

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

Share this post


Link to post
Share on other sites

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

Edited by alexmern

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