IVB Posted November 17, 2014 Доброго времени суток, господа и дамы. Столкнулся с непонятной проблемой. Прочесть 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-миядерный? Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
alexmern Posted November 17, 2014 Какой тип трафика у вас? Есть ли q-in-q, pppoe? Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
Wheely Posted November 17, 2014 В системе есть и другие сетевушки, но трафик там несущественный, поэтому (как показала практика) тем трафиком можно пренебречь. Нельзя пренебречь. Для сетевушек разные маршруты? На всех сетевухах висят айпишники из одной подсети или из разных (с необходимостью создания n числа "дефолтных" маршрутов для каждой сетевухи)? Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
IVB Posted November 17, 2014 Какой тип трафика у вас? Есть ли q-in-q, pppoe? Сервер - софт-роутер (пограничный маршрутизатор). Q-in-Q есть, PPPoE нету. Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
alexmern Posted November 17, 2014 (edited) Сервер - софт-роутер. 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 November 17, 2014 by alexmern Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
IVB Posted November 17, 2014 В системе есть и другие сетевушки, но трафик там несущественный, поэтому (как показала практика) тем трафиком можно пренебречь. Нельзя пренебречь. Для сетевушек разные маршруты? На всех сетевухах висят айпишники из одной подсети или из разных (с необходимостью создания n числа "дефолтных" маршрутов для каждой сетевухи)? Сами сетевушки адресов не имеют. net1-net4 (гигабитные) объединены в bond. На bond и на net5 (10 гиг) висят vlan'ы. Бриджей нет (т.е. на разных интерфейсах - разные vlan'ы). У всех vlan'ов - разные подсети, соответственно, разные IP адреса и разные маршруты. Прерываниями с остальных сетевушек можно пренебречь, т.к. после освобождения CPU0 от обработки прерываний с net5, его загрузка упала почти до нуля. И при наступлении "времени Ч" (т.е. "полка" на одном из CPU) загрузка на CPU0 так и осталась около нуля. Т.е. проблема только в обработке прерываний именно с net5. Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
IVB Posted November 17, 2014 Сервер - софт-роутер. 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 на этом сервере... Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
alexmern Posted November 17, 2014 Как у себя проверю - пришлю патч на драйвер. Разработчики Double VLAN там вообще не делали. Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
IVB Posted November 18, 2014 Как у себя проверю - пришлю патч на драйвер. Разработчики Double VLAN там вообще не делали. Буду весьма признателен! Убрал QinQ - загрузка всех процессоров выровнялась. Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
alexmern Posted November 18, 2014 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 */ Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
walertos Posted December 23, 2015 Включить то это всё не проблема! Намного интереснее теперь всё это выключить. После включения данного функционала vlan-mon от Accel перестал создавать QinQ интерфейсы. Ну я не долго думая откатил драйвер назад, только это не помогает, кто может помочь и подсказать как вернуть всё назад и выключить данный функционал в сетевой? Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
pavel.odintsov Posted December 23, 2015 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? Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
walertos Posted December 23, 2015 (edited) 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 December 23, 2015 by walertos Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
Ivan_83 Posted December 24, 2015 После включения данного функционала vlan-mon от Accel перестал создавать QinQ интерфейсы. Ну я не долго думая откатил драйвер назад, только это не помогает, кто может помочь и подсказать как вернуть всё назад и выключить данный функционал в сетевой? Мон не должен был сломаться. Здесь просто указывается сетевухе что в эзернете двойной тэг. Если она его сама декапсулирует и пишет в какие то расширенные заголовки то много чего бы сломалось, но я подозреваю что она просто использует это для расчёта хэша при балансировке прерываний. Если тебе отката мало то: 1. выключи питание совсем минут на 5. 2. если не помогло то пропатч патч: dmatxctl &= ~IXGBE_DMATXCTL_GDV; ... ctrl_ext &= ~IXGBE_CTRL_EXT_EXTENDED_VLAN; и пересобери дрова, так гарантированно QinQ отключится. Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
NiTr0 Posted December 24, 2015 может попробовать отключить vlan offload через ethtool? :) Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
walertos Posted December 26, 2015 (edited) может попробовать отключить 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 December 26, 2015 by walertos Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
Ivan_83 Posted December 27, 2015 Вместо: dmatxctl |= IXGBE_DMATXCTL_GDV; и ctrl_ext |= IXGBE_CTRL_EXT_EXTENDED_VLAN; Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
gureedo Posted February 13, 2016 (edited) Последняя на данный момент версия драйвера ixgbe c опцией qinq для rss. https://github.com/intersvyaz/ixgbe/tree/4.3.13-netmap На netmap можно не обращать внимания, т.к. он будет пропущен если сборка выполняется не для него. Edited February 13, 2016 by gureedo Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
myth Posted February 13, 2016 А с PPPoE кроме RPS ничего не предвидится? Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
pavel.odintsov Posted February 14, 2016 gureedo похоже, мы делаем одинаковую работу https://github.com/pavel-odintsov/ixgbe-linux-netmap/commits/master :) Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
gureedo Posted February 15, 2016 gureedo похоже, мы делаем одинаковую работу https://github.com/pavel-odintsov/ixgbe-linux-netmap/commits/master :) netmap наше всё) Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
medvedv Posted February 15, 2016 netmap наше всё) Только DPDK, только хардкор =) Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
pavel.odintsov Posted February 15, 2016 netmap наше всё) Только DPDK, только хардкор =) Такие вещи надо обсуждать под пиво и в Skype :) Мой - energy_true. Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
medvedv Posted February 15, 2016 netmap наше всё) Только DPDK, только хардкор =) Такие вещи надо обсуждать под пиво и в Skype :) Мой - energy_true. Ну мой скайп ты знаешь ) Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
alexmern Posted March 31, 2017 (edited) 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 March 31, 2017 by alexmern Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...