e1000e периодические подвисания
x86_64. Обновил ядро годовалой давности 3.0.6 до 3.5.7. Столкнулся с проблемой, что при нагрузке в 600pps и 1Mbit/s пару раз в минуту по 3-4 секунды сервер переставал принимать/отправлять пакеты. При этом работа системы не тормозилась - весь софт продолжал работать, физическая консоль не замирала (в сравнении с ssh).
В результате выяснил, что дело в драйвере сетевой карты - e1000e
:
01:00.0 Ethernet controller: Intel Corporation 82574L Gigabit Network Connection 02:00.0 Ethernet controller: Intel Corporation 82574L Gigabit Network Connection
Параметр InterruptThrottleRate
по умолчанию стоит в режиме dynamic conservative
. Временно решил проблему выставив фиксированное количество прерываний - 3000. Днем нагрузка выросла до 8000pps, а load average
поднялся до 0,60 - 1,00. До обновления ядра при аналогичной нагрузке load average
был не выше 0,10-0,20.
Сравнил дефолтные параметры драйвера от ядра 3.0.6 с 3.5.7 - идетнично.
dmesg до:
e1000e: Intel(R) PRO/1000 Network Driver - 1.3.10-k2 e1000e: Copyright(c) 1999 - 2011 Intel Corporation. e1000e 0000:01:00.0: Disabling ASPM L0s e1000e 0000:01:00.0: PCI INT A -> GSI 16 (level, low) -> IRQ 16 e1000e 0000:01:00.0: setting latency timer to 64 e1000e 0000:01:00.0: irq 48 for MSI/MSI-X e1000e 0000:01:00.0: irq 49 for MSI/MSI-X e1000e 0000:01:00.0: irq 50 for MSI/MSI-X e1000e 0000:01:00.0: eth0: (PCI Express:2.5GT/s:Width x1) 00:30:48:f9:62:96 e1000e 0000:01:00.0: eth0: Intel(R) PRO/1000 Network Connection e1000e 0000:01:00.0: eth0: MAC: 3, PHY: 8, PBA No: 0101FF-0FF e1000e 0000:02:00.0: Disabling ASPM L0s e1000e 0000:02:00.0: PCI INT A -> GSI 16 (level, low) -> IRQ 16 e1000e 0000:02:00.0: setting latency timer to 64 e1000e 0000:02:00.0: irq 51 for MSI/MSI-X e1000e 0000:02:00.0: irq 52 for MSI/MSI-X e1000e 0000:02:00.0: irq 53 for MSI/MSI-X e1000e 0000:02:00.0: eth1: (PCI Express:2.5GT/s:Width x1) 00:30:48:f9:62:97 e1000e 0000:02:00.0: eth1: Intel(R) PRO/1000 Network Connection e1000e 0000:02:00.0: eth1: MAC: 3, PHY: 8, PBA No: 0101FF-0FF
dmesg после:
e1000e: Intel(R) PRO/1000 Network Driver - 2.0.0-k e1000e: Copyright(c) 1999 - 2012 Intel Corporation. e1000e 0000:01:00.0: Disabling ASPM L0s L1 e1000e 0000:01:00.0: (unregistered net_device): Interrupt Throttling Rate (ints/sec) set to dynamic conservative mode e1000e 0000:01:00.0: irq 48 for MSI/MSI-X e1000e 0000:01:00.0: irq 49 for MSI/MSI-X e1000e 0000:01:00.0: irq 50 for MSI/MSI-X e1000e 0000:01:00.0: eth0: (PCI Express:2.5GT/s:Width x1) 00:30:48:f9:62:96 e1000e 0000:01:00.0: eth0: Intel(R) PRO/1000 Network Connection e1000e 0000:01:00.0: eth0: MAC: 3, PHY: 8, PBA No: 0101FF-0FF e1000e 0000:02:00.0: Disabling ASPM L0s L1 e1000e 0000:02:00.0: (unregistered net_device): Interrupt Throttling Rate (ints/sec) set to dynamic conservative mode e1000e 0000:02:00.0: irq 51 for MSI/MSI-X e1000e 0000:02:00.0: irq 52 for MSI/MSI-X e1000e 0000:02:00.0: irq 53 for MSI/MSI-X e1000e 0000:02:00.0: eth1: (PCI Express:2.5GT/s:Width x1) 00:30:48:f9:62:97 e1000e 0000:02:00.0: eth1: Intel(R) PRO/1000 Network Connection e1000e 0000:02:00.0: eth1: MAC: 3, PHY: 8, PBA No: 0101FF-0FF
Если кто-то сталкивался с этой проблемой, подскажите, как ее решить?
Судя по форумам с проблема не очень популярна, конкретных решений или объяснений найти не удалось.
- Для комментирования войдите или зарегистрируйтесь
Проверьте ваш ли это
Проверьте ваш ли это случай:
http://sourceforge.net/projects/e1000/files/e1000e%20stable/eeprom_fix_82574_or_82583/
Кроме того можно попробовать использовать не ядренный модуль, а какой-то из этих:
http://sourceforge.net/projects/e1000/files/e1000e%20stable/
Нащяльника, мая сервира паставиль, фрибизьдя инсталя сделаль, апачи сабраль, пыхапе патключиль, сапускаю, а ано - ажамбех пашамбе эшельбе шайтанама!
Возможно, что случай мой
EEPROM на моей карте требовал фикса. Проверил под тестом на 40Мбит/с и 7000pps - проблема не проявилась, la поднялся только до 0,20. Посмотрим, что будет завтра под рабочей нагрузкой.
Огромное спасибо!
EEPROM не помог
Жаль, но дело не в EEPROM или не только в нем. Ночью попробую поставить новую версию драйвера. Удивительно, что искуственная нагрузка не вызвала проблему, которая проявилась при более низкой рабочей нагрузке. Разница в размерах пакетов и в том, что в рабочем варианте они приходят с разных IP на разные порты. В обоих случаях - это 99% UDP пакеты.
Есть еще один сервер со старым ядром и аналогичной сетевой картой - работает с такой же нагрузкой и практически ее не замечает. Будет возможность сравнивать настройки.
Нашел интересную информацию: http://rajven.ru/articles/optimizacija_nastroek_drajverov_dlja_kart_intel/index.html. Вдруг, кому-то будет полезно.
У меня такие карты лопатят по
У меня такие карты лопатят по 500-700М, в пиках до 800М. Очереди прибиты к ядрам процессора, подобран размер кольцевого буфера и работает себе. Проблем нет.
Относительно ссылки по I/OAT DMA - давно включено, и т.к. конфиг ядра давно уже определен, то об этом я уже успел забыть.
Нащяльника, мая сервира паставиль, фрибизьдя инсталя сделаль, апачи сабраль, пыхапе патключиль, сапускаю, а ано - ажамбех пашамбе эшельбе шайтанама!
Не надо обобщать
Верю. Имеется еще четыре сервера, которые прекрасно работают с такими же сетевыми картами под не меньшей нагрузкой, и этот прекрасно работал до обновления ядра.
Прошлой ночью пробовал обновить драйвер e1000e до 2.1.4. Не помогло. Решил откатиться до последнего ядра ветки 3.0 - 3.0.35. Проблема стала немного другой - сеть работает без потери пакетов, но la может подпрыгивать до 3.00 без изменений в нагрузке и потом сразу опускаться до 0.50.
Следующей ночью попробую вернуться на прежнее собранное ядро, когда система летала и нагрузка не ощущалась.
Кстати, на других серверах все IRQ, включая от сетевой карты, распределяются по всем ядрам процессора, а на этом сервере они отрабатываются только каким-то одним ядром. При этом smp_affinity разрешает использовать все ядра. Если указать конкретное ядро, то оно выбирается, если указать несколько ядер, то все равно используется одно из разрешенных. Я не помню, как это работало на старом ядре, но что-то мне кажется, что это тоже играет свою роль в проблеме.
С помощью smp_affinity таки
С помощью smp_affinity таки стоит прибить очереди к ядрам конкретным. Определенно не лишнее и полезное.
Покажите вывод профайлера и top'а. Уж больно интересно что там у вас творится.
Нащяльника, мая сервира паставиль, фрибизьдя инсталя сделаль, апачи сабраль, пыхапе патключиль, сапускаю, а ано - ажамбех пашамбе эшельбе шайтанама!
при таких нагрузках - это
при таких нагрузках - это бесполезное занятие. Я бы поигрался с ethtool, потом бы собрал модулем свежий драйвер, потом бы поменял сетевухи.
Штиль на 3.0.6
Ночью откатился до ранее собранного ядра 3.0.6. Нагрузка есть, но при этом ни единого намека, что сервер напрягается - la: 0.01-0.05. При этом картина с IRQ не изменилась. Каждое из устройств осблуживается только каким-то одним ядром
Понятно, что сейчас в top'е все по нолям. Буду на следующей неделе продолжать эксперименты (на выходных нет нагрузки). Подскажите, что за профайлер? Никогда ранее не сталкивался с его использованием.
Мысли вслух.
Есть предположение, что нагрузка вызвана нестыковкой софта и версии ядра, так как при тестировании iperf'ом la не сильно поднималась, а при рабочей нагрузке - гораздо выше.
Прошелся по бОльшему количеству серверов. Выявил закономерность - если процессор из семейства Xeon'ов, то IRQ висят на одном из ядер; если процессор Core2 Duo / Core i, то прерывания (soft/hard) распределяются по всем ядрам для каждого из устройств.
Xeon:
Core i3:
Ваши мысли не особо
Ваши мысли не особо подтверждаются практикой: имею на хозяйстве кучу Xeon X3440, E5420, E5507, E3-1220 и правда, только один i5. На всех ксеонах по-умолчанию прерывания от устройств размазываются по всем ядрам.
P.S. oprofile - установите и проследите, что у вас создает такую нагрузку.
Нащяльника, мая сервира паставиль, фрибизьдя инсталя сделаль, апачи сабраль, пыхапе патключиль, сапускаю, а ано - ажамбех пашамбе эшельбе шайтанама!
oprofile попробую
Что тогда может мешать прерываниям размазываться по ядрам? На второй машине с Core i3 работает ядро с точь-в-точь таким же конфигом и прерывания размазываются. Это как бы факультативный вопрос, ибо на старом ядре сервер прекрасно работает, хотя прерывания не размазываются.
С oprofile разберусь, что к чему.
Флудить не буду, как разберусь или появятся вопросы - отпишусь.
Результаты
Результаты не впечатляют. Перечитал много форумов и статей. Определенно успешного рецепта не нашел - кому-то, что-то помогает путем проб и ошибок. Мой путь привел к следующим выводам:
1. IRQ не распределяются по ядрам в соответствии с алгоритмом round-robin, так как это платформенно-зависимая "фича". И если материнская плата или BIOS не желают того делать в конкретной комплектации, то хоть тресни - оно не заработает. Вместо этого и придуман smp_affinity, чтобы хоть как-то распределить нагрузку по ядрам. В этом плане хорошо описано в книге "Understanding the Linux Kernel" на стр. 159 "IRQ distribution in multiprocessor systems":
Кроме того это подтверждается практикой братьев по несчастью. На форумах описывались случаи, когда из n-серверов одинаковой конфигурации (железо и софт), на некоторых IRQ распределялись равномерно по ядрам, а на некоторых прилипали только к одному из ядер.
2. OProfile - 60% vmlinux, 20% сами приложения, 9% glibc, 7% e1000e, остальное размазано по частям менее 1%.
3. Непосредственно по проблеме сетевой карты. Выявлено, что в моем случае проблема возникает при изменении нагрузки, как в сторону повышения, так и в сторону понижения. В эти периоды наблюдается всплеск la и использование CPU %system. Путем экспериментов удалось собрать ядро, когда эти всплески происходят в пределах разумного и "условно" не мешают работе сервера.
Во время экспериментов попадались конфигурации ядра, когда la не давал всплесков, но постоянно наблюдались замирания работы сетевой карты до 2 сек. Причем снифер на этом же сервере показывал, что в этот момент пакеты не передавались, а после задержки выплевывались все накопленные. В это время сервер не подвисал, и консоль (KVM) продолжала отвечать, часы тикали.
Так же на результаты тестов влияли настройки BIOS. Например, отключение "Hardware Prefetcher" приводило к снижению la, но при этом возникали потери пакетов. Отключение управления питанием в BIOS приводило к первоначальной ситуации. Как я понимаю, в этом случае ОС не знала о том, что питанием устройств и процессора можно управлять, а BIOS продолжал это делать сам.
Попытки выключить IPMI через BIOS ни к чему не приводили, а сам IPMI продолжал работать, словно ему наплевать на настройки BIOS.
Всякие советы на форумах по поводу отключения acpi считаю бредовыми, ибо в этом случае система лишается многопроцессорности - остается одно ядро, прерывания обрабатываются по-старинке через PIC, а не APIC. Надо отметить, что народ с неистовым энтузиазмом копипастит этот совет по форумам.
* * *
Итог - возвращаюсь на ядро 3.0.6. Запланирую переход на другое железо, потом продолжу тесты с этим сервером, чтобы не вредить качеству услуг.
Цитата: OProfile - 60%
Как бы наводит на размышления что не факт что это драйвер ядра так шалит.
Во-вторых, при вашей нагрузке настройкой сетевух можно вообще не заморачиваться. А сравнить конфиг ядра разных версий.
Нащяльника, мая сервира паставиль, фрибизьдя инсталя сделаль, апачи сабраль, пыхапе патключиль, сапускаю, а ано - ажамбех пашамбе эшельбе шайтанама!
Вид сбоку
boroda, у меня та-же проблема!
Читал ваш пост, как будто я сам его писал. Давече в инете потратил несколько дней на огугливание проблемы и результат - 0. Могу сказать вам точно, что ядро 3.2.34 у меня таких проблем не вызвало, а всё что выше просто беда с подвисаниями. Сетевушка внешняя INTEL EXPI9301CT с чипом 82574L. И фикс с EEPROM я наложил, и с настройками BIOS игрался, результат отрицательный. Проблема появляется при определённых условиях: мелкие пакеты UDP и больше 16 IP юзеров. При этом гигабайты фильмов передаёт без запинки! Карта стоит в 100 Мбит/с фулл дуплекс через свитч. А вот тут я нагуглил то, что эти карты могут не дружить с дешёвыми свичами. Может в этом проблема? Потерял неделю на поиски решения, уже пожалел что взял именно эту карту, но на старом ядре 3.2.34 она работает идеально, значит проблема софтовая. И почему весь инет молчит? Разве мало серверов на чипах 82574L или мы особенные? Однозначно не пожалею денег и куплю гигабитный свитч Cisco, а потом отпишу.
Кстати, сетевой контроллер Realtek® 8111E даже с новейшими драйверами r8168 от производителя выделывает то-же самое на новых ядрах в той-же системе. Это снимает подозрения с глючности именно Intel'овских чипов.
Что то есть ядрёное в новых ядрах, но почему везде тишина?
Спасибо вам за содержательную тему! Я уже подумал, что я один столкнулся с подобным.
Решено!
Проблема решена с помощью форума http://unixforum.org/index.php?showtopic=133681.
Особая и личная благодарность тов. Bizdelnick!
Мне было подсказано использовать патч для исправления багов: https://git.kernel.org/?p=linux/kernel/git/stable/linux-stable.git;a=commitdiff;h=f5e37c549d200e3b899b66d6a84e99c8e2cf5e59
После этого я скомпилировал последний драйвер Intel e1000e 2.1.4 с указанными выше исправлениями и поставил на ранее проблемное ядро linux-3.6.9.
После перезагрузки, сеть на Intel 82574L заработала без проблем! Уже два часа работает как вкопанная, ни одного прерывания!
Небольшое дополнение:
Хорошая новость: вышло новое ядро 3.6.10, так вот в нём уже этот патч учтён (я скачал исходники и проверил файлы). Сейчас скомпилирую и проверю работу чистого ядра 3.6.10. Уверен, что мои проблемы больше не повторятся и канут в небытие после фикса в новых ядрах...
Я бы сказал мыльницы,
Извиняюсь за оффтоп, но я бы сказал, что мыльницы, особенно подгоревшие, не дружат с чем Ктулху угодно.
Нащяльника, мая сервира паставиль, фрибизьдя инсталя сделаль, апачи сабраль, пыхапе патключиль, сапускаю, а ано - ажамбех пашамбе эшельбе шайтанама!