IVB Posted November 17, 2014 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
alexmern Posted November 17, 2014 Posted November 17, 2014 Какой тип трафика у вас? Есть ли q-in-q, pppoe? Вставить ник Quote
Wheely Posted November 17, 2014 Posted November 17, 2014 В системе есть и другие сетевушки, но трафик там несущественный, поэтому (как показала практика) тем трафиком можно пренебречь. Нельзя пренебречь. Для сетевушек разные маршруты? На всех сетевухах висят айпишники из одной подсети или из разных (с необходимостью создания n числа "дефолтных" маршрутов для каждой сетевухи)? Вставить ник Quote
IVB Posted November 17, 2014 Author Posted November 17, 2014 Какой тип трафика у вас? Есть ли q-in-q, pppoe? Сервер - софт-роутер (пограничный маршрутизатор). Q-in-Q есть, PPPoE нету. Вставить ник Quote
alexmern Posted November 17, 2014 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
IVB Posted November 17, 2014 Author Posted November 17, 2014 В системе есть и другие сетевушки, но трафик там несущественный, поэтому (как показала практика) тем трафиком можно пренебречь. Нельзя пренебречь. Для сетевушек разные маршруты? На всех сетевухах висят айпишники из одной подсети или из разных (с необходимостью создания n числа "дефолтных" маршрутов для каждой сетевухи)? Сами сетевушки адресов не имеют. net1-net4 (гигабитные) объединены в bond. На bond и на net5 (10 гиг) висят vlan'ы. Бриджей нет (т.е. на разных интерфейсах - разные vlan'ы). У всех vlan'ов - разные подсети, соответственно, разные IP адреса и разные маршруты. Прерываниями с остальных сетевушек можно пренебречь, т.к. после освобождения CPU0 от обработки прерываний с net5, его загрузка упала почти до нуля. И при наступлении "времени Ч" (т.е. "полка" на одном из CPU) загрузка на CPU0 так и осталась около нуля. Т.е. проблема только в обработке прерываний именно с net5. Вставить ник Quote
IVB Posted November 17, 2014 Author 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
alexmern Posted November 17, 2014 Posted November 17, 2014 Как у себя проверю - пришлю патч на драйвер. Разработчики Double VLAN там вообще не делали. Вставить ник Quote
IVB Posted November 18, 2014 Author Posted November 18, 2014 Как у себя проверю - пришлю патч на драйвер. Разработчики Double VLAN там вообще не делали. Буду весьма признателен! Убрал QinQ - загрузка всех процессоров выровнялась. Вставить ник Quote
alexmern Posted November 18, 2014 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
walertos Posted December 23, 2015 Posted December 23, 2015 Включить то это всё не проблема! Намного интереснее теперь всё это выключить. После включения данного функционала vlan-mon от Accel перестал создавать QinQ интерфейсы. Ну я не долго думая откатил драйвер назад, только это не помогает, кто может помочь и подсказать как вернуть всё назад и выключить данный функционал в сетевой? Вставить ник Quote
pavel.odintsov Posted December 23, 2015 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
walertos Posted December 23, 2015 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
Ivan_83 Posted December 24, 2015 Posted December 24, 2015 После включения данного функционала vlan-mon от Accel перестал создавать QinQ интерфейсы. Ну я не долго думая откатил драйвер назад, только это не помогает, кто может помочь и подсказать как вернуть всё назад и выключить данный функционал в сетевой? Мон не должен был сломаться. Здесь просто указывается сетевухе что в эзернете двойной тэг. Если она его сама декапсулирует и пишет в какие то расширенные заголовки то много чего бы сломалось, но я подозреваю что она просто использует это для расчёта хэша при балансировке прерываний. Если тебе отката мало то: 1. выключи питание совсем минут на 5. 2. если не помогло то пропатч патч: dmatxctl &= ~IXGBE_DMATXCTL_GDV; ... ctrl_ext &= ~IXGBE_CTRL_EXT_EXTENDED_VLAN; и пересобери дрова, так гарантированно QinQ отключится. Вставить ник Quote
NiTr0 Posted December 24, 2015 Posted December 24, 2015 может попробовать отключить vlan offload через ethtool? :) Вставить ник Quote
walertos Posted December 26, 2015 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
Ivan_83 Posted December 27, 2015 Posted December 27, 2015 Вместо: dmatxctl |= IXGBE_DMATXCTL_GDV; и ctrl_ext |= IXGBE_CTRL_EXT_EXTENDED_VLAN; Вставить ник Quote
gureedo Posted February 13, 2016 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
myth Posted February 13, 2016 Posted February 13, 2016 А с PPPoE кроме RPS ничего не предвидится? Вставить ник Quote
pavel.odintsov Posted February 14, 2016 Posted February 14, 2016 gureedo похоже, мы делаем одинаковую работу https://github.com/pavel-odintsov/ixgbe-linux-netmap/commits/master :) Вставить ник Quote
gureedo Posted February 15, 2016 Posted February 15, 2016 gureedo похоже, мы делаем одинаковую работу https://github.com/pavel-odintsov/ixgbe-linux-netmap/commits/master :) netmap наше всё) Вставить ник Quote
medvedv Posted February 15, 2016 Posted February 15, 2016 netmap наше всё) Только DPDK, только хардкор =) Вставить ник Quote
pavel.odintsov Posted February 15, 2016 Posted February 15, 2016 netmap наше всё) Только DPDK, только хардкор =) Такие вещи надо обсуждать под пиво и в Skype :) Мой - energy_true. Вставить ник Quote
medvedv Posted February 15, 2016 Posted February 15, 2016 netmap наше всё) Только DPDK, только хардкор =) Такие вещи надо обсуждать под пиво и в Skype :) Мой - energy_true. Ну мой скайп ты знаешь ) Вставить ник Quote
alexmern Posted March 31, 2017 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
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.