The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

Решение проблемы с kernel panic на FreeBSD (dummynet, swi1:net, trap number = 12) (freebsd panic ipfw crash dummynet)


<< Предыдущая ИНДЕКС Исправить src / Печать Следующая >>
Ключевые слова: freebsd, panic, ipfw, crash, dummynet,  (найти похожие документы)
From: Александр aka Radist <alex@brovis.net.ua.> Newsgroups: email Date: Mon, 09 Feb 2009 17:02:14 +0000 (UTC) Subject: Решение проблемы с kernel panic на FreeBSD (dummynet, swi1:net, trap number = 12) Вначале немного истории и лирики - решение в самом конце. Есть у меня сервер с FreeBSD (7.0). Материнка Microstar AMD 9650 на четыре ядра. Занимается VPN (poptop) и шейпингом (dummynet). Когда резко увеличили канал в интернет (с 20 до 100 мегабит) сервер начал падать пару раз в сутки. При падении выдавал что-то похожее: Fatal trap 12: page fault while in kernel mode current process = 11 (swi1: net) (на одном ядре) и current process = dummynet (на другом) trap number = 12 panic: page fault Подозрения на железо. Поменяли все (включая корпус). Не помогло. Поменяли версию операционки. Ставили 5.4, 6.2 потом поставили 7.1-RC2. Не помагает. Причем в половине случаев даже не сам перегружается. (Заготовили пару бубнов и начили разучивать шаманские танцы:) Временно решили проблему поднятием резерва с перехватом (резервной сервак постоянно пингует основной, когда ответа нет, меняет себе маки и отвечат на ВПН сам). Но это не дело (причем иногда он на пинги отвечал, зараза, нужно что-то другое анализировать или ставить аппаратные вачдоги). В /var/log/messages перед моментом падения появлелись сообщения ipfw: ouch!, skip past end of rules, denying packet. Интернет по этому поводу молчит. Все решения сводятся к манипуляцием с ядром и sysctl и заменой железа. Как правило замена железа помагала. (Как потом выснелось, в большинстве случаев ставилось более новое железо и просто падала общая нагрузка и глюки исчезали.) Раскопали, что в ряде прочессоров AMD 9550-9650 есть глюки с кешем. Попробывали на относительно стором двухядерном - то-же самое. Попутно опеределили, что версия 7.1-RC2 имеет в том числе два прекрасных усовершенствования. 1. При максимальной загрузке по процесу dummynet (более 90%) на предыдущих версиях резко повышался пинг (с 5 до 300 милисекунд) и держался таким пока загрузка не спадала. В новой версии при загрузке 100% пинги не повышаютя и шейпинг остается на приемлемом уровне (правда не понятно за счет чего это достигается, но все равно приятно) 2. Появилось пару новых ключей в sysctl которые снизили нагрузку на процессы dummynet и sw1: net что благоприятно отобразилось на загрузке всей машины и общей latency системы. Потом обратили внимание, что сервер пару раз падал на галзах при операциях с фаерволом. Добавление, удаление правил. Стали копать дальше. У нас в середине фаервола для каждого юзверя создается три правила которые отправляют пакеты на шейпинг. Одно для входящешго и два для исходящего (так надо). При изменении параметров тарифных пакетов клиента правила дропались, менялись параметры пайпов и новые правила создавались. Также аналогично правила создавались и для клиентов, которые вышли за лимит и т.д. Два раза в сутки все правила пересоздавались (в 12 и 8 - ночью скорости для клиентов в два раза выше). Падения сервера были примерно в 18-19 (час пик) и в 12 часов (как правило) . Значит проблема в манипуляциями с фаерволлом. Стали перед удалением правил и пайп делать команду ipfw add XXX skipto YYY all from any to any и давать задержку до 300 секунд перед удалением, чтобы явно все пакеты из пайп ушли. Стало лучше, но падения остались. Думали про altq. Подходит с большим скрипом. Во первых не шейпит входящие пакеты. Да можно их шейпить на исходящем интерфесе, но исходящие в моем случае - это динамически сосздаваемые и так-же динамически умирающие tun интерфейсы числом до 500. И как их обллуживать красиво и помощью altq - это тот еще вопрос. Да конечно, можно поставить еще одну машину, только для altq. (но это не решение проблемы - это борьба с последствиями). Второй скользкий вопрос - это поведение altq пр изагрузке процессора до 100%. Интернет говорит, что это поведение не очень, по крайней мере хуже dummynet. (не проверяли на практике, но dummynet на 7.2 при 100% загрузки себя ведет себя прекрасно) Накопали в инете переписку с коммитерами еще по 4 версии FreeBSD. (сейчас не смог найти что-бы дать ссылку) Речь шла о появлении сообщений ipfw: "ouch!, skip past end of rules, denying packet". Это сообщение появляется когда правило с которого ушли пакеты на dummynet удалено в то время пока в dummynet еще есть пакеты. По умолчанию такие пакеты дропаются (или разрешаются в зависимости от параметров ядра.) Как для меня представлялась система dummynet. Что-то вроде natd. Существуют трубы (pipe) и queue со своими параметрами. Правилом фаэрвола на них пересылается пакеты. После должной обработки пакеты возвращаются на фаэрвол (если другое поведение не определено настройками - пакет может просто разрешатся). Причем пакет возвращается не на правило с номером большим чем правило отправившее пакет на dummynet как это есть в natd, а пакет возвращается на СЛЕДУЮЩЕЕ правило. И в переписке сказано, что пайпа ДОЛЖНА иметь номер правила фаэрвола (очевидно последнего используемого, т.к. правил может быть много) с которого ушел пакет. Иначе там толи нул толи хз. И как оказалось, СИСТЕМА ПАДАЕТ КОГДА УДАЛЯЕТСЯ ПРАВИЛО КОТОРОЕ ОТПРАВЛЯЕТ ПАКЕТЫ НА DUMMYNET, причем без разницы, есть ли в данный момент пакеты на обработке dummynet. Причем, когда загрузка меньше 1 (в еденицах из top), то все нормально, а когда загрузка превышает 1 - вероятность падежа повышается прямо пропорционально загрузке. Решение: Никогда не удалять правила фаервола, которые отправляют пакеты в DUMMYNET. Создать при старте или при необходимости, определить пайпы или queue и не торгать их больше. Надо запретить пакеты - или deny раньше по фаерволу или дать пользователю пару бит в сек. Надо отменить шейпинг - говорим "bw 0" или сказать skipto. Да, есть мнение, что наличее ненужных pipe (так как скорость на них не лимитируется) только уменьшает производительность (занимают память и dummynet с частотой Hz (из параметров ядра) их обходит), но лучше так, чем kernel panic. После замены логики - сервер без перезагрузок более недели. P.S. Не пробывали только менять правила фаэрвола через сеты (ipfw set см. man ipfw) - быть может там другая ситуация

<< Предыдущая ИНДЕКС Исправить src / Печать Следующая >>

Обсуждение [ Линейный режим | Показать все | RSS ]
  • 1.1, terminus (ok), 14:53, 09/02/2009 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Спасибо за статью! А в рассылки FreeBSD писали о данной проблеме?
     
  • 1.2, Alive (??), 15:05, 09/02/2009 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Познавательно. Спасибо.
     
  • 1.3, stasav (??), 15:10, 09/02/2009 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Люди никак не научатся юзать таблицы =) Оттеда все ваши проблемы )
     
  • 1.4, Аноним (4), 15:35, 09/02/2009 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    хм
    есть такой же сервер примерно
    фря 6.2
    канал 10 мегабит
    проблем пока таких небыло слава богу
    также ipfw + shaper

    спасибо автор, в закладки

     
  • 1.5, xor2003 (?), 15:36, 09/02/2009 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    это временное решение. правильное - багрепорт
     
     
  • 2.19, wtf (ok), 20:38, 09/02/2009 [^] [^^] [^^^] [ответить]  
  • +/
    это не баг. В списках рассылки об этом есть упоминание.
    http://lists.freebsd.org/pipermail/freebsd-ipfw/2004-May/001094.html
     
     
  • 3.21, Sem (??), 23:37, 09/02/2009 [^] [^^] [^^^] [ответить]  
  • +/
    Паника - всегда баг.
     
  • 3.30, User294 (ok), 20:32, 10/02/2009 [^] [^^] [^^^] [ответить]  
  • +/
    >это не баг.

    Наверняка это такая, гм, фича? :)

     

  • 1.6, byteplayer (?), 15:39, 09/02/2009 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    На такой тачке должен стоять FreeBSD 7.1 + mpd 5.2, который использует для нарезок на каждом туннеле ng_car, параметры которого передаются от FreeRadius, который, в свою очередь берёт их из базы данных в момент коннекта юзера. Так можно хоть 300М роутить с тыщей туннелей, а кто-то может смог и более, а на рортор в юзер-левеле много не промаршрутизируешь.
     
     
  • 2.28, Radist (?), 20:13, 10/02/2009 [^] [^^] [^^^] [ответить]  
  • +/
    >На такой тачке должен стоять FreeBSD 7.1 + mpd 5.2, который использует
    >для нарезок на каждом туннеле ng_car, параметры которого передаются от FreeRadius,
    >который, в свою очередь берёт их из базы данных в момент
    >коннекта юзера. Так можно хоть 300М роутить с тыщей туннелей, а
    >кто-то может смог и более, а на рортор в юзер-левеле много
    >не промаршрутизируешь.

    ИМХО mpd не подойдет, т.к. судя по описанию работает в один поток, а хочется использовать все четіре ядра.

    Но. Если не ошибаю, то в описании написано, что все подключения обробатіваются одним процессом mpd. Конечно єто не мешат mpd посоздавать треди для каждого подключения и использовать все ядра одновременно. Я не пробівал. Кто знает, может он так и делает.

    А poptop для каждого подключения создает отднльній процес, тоесть все ядра будут использоватся на 100%. Кстати, не знаю как там на щет юзер-левела, но у меня в топе, загрузка системі 50% а юзер - 3%.

     

  • 1.7, stasav (??), 15:48, 09/02/2009 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    ng_car не выход, в случае частичной зарезки скорости по диапазонам адресов он не подходит, так как вешается на интерфейс.

     
  • 1.8, mummy (?), 15:52, 09/02/2009 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Никогда не было проблем. Перегружал так
    1) Выключить ограничение
    /sbin/ipfw add 999 allow all from any to any
    sleep 3

    2) Генерируем файл /tmp/fw.tmp:

    disable firewall
    flush
    pipe flush
    queue flush
    add 1    allow tcp from 192.168.99.2 to me 22
    add 2    deny tcp from any to me 22
    add 1000 pipe 1 ip from 192.168.1.11 to any
    add 1001 pipe 2 ip from any to 192.168.1.11
    ...
    ...
    enable firewall

    3) Проверка правил на ошибки и перегрузка настроек
    /sbin/ipfw -qn /tmp/fw.tmp
    if [ "$?" != "0" ]; then
          echo "There was errors in rules."
          exit 1
    fi
    /sbin/ipfw -q /tmp/fw.tmp

     
     
  • 2.16, mummy (?), 20:24, 09/02/2009 [^] [^^] [^^^] [ответить]  
  • +/
    P.S. У меня sysctl net.inet.ip.fw.one_pass=1

    net.inet.ip.fw.one_pass: 1
    Forces a single pass through the firewall. If set to 0,
    packets coming out of a pipe will be reinjected into the
    firewall starting with the rule after the matching one.
    NOTE: there is always one pass for bridged packets.

     
     
  • 3.26, Radist (?), 18:50, 10/02/2009 [^] [^^] [^^^] [ответить]  
  • +/
    >P.S. У меня sysctl net.inet.ip.fw.one_pass=1
    >
    >net.inet.ip.fw.one_pass: 1

    Не проходит, т.к. шейпов у меня несколько - на юзера, на групу, на тип трафика и т.д. Кроме того иногда не хочется отправлять пакет по маршруту в таблице маршрутизации (что стлучится вданном случае), а переслать его с помощью fwd

     
  • 2.25, Radist (?), 18:47, 10/02/2009 [^] [^^] [^^^] [ответить]  
  • +/
    У меня время пересоздавания до тісячи правил на загруженой машине (сейчас в фаерволе более 3 тісяч) достигает пару минут. Бістерее будет перезагрузить сервер :) Но єто не решение.
     

  • 1.9, Buba (??), 16:13, 09/02/2009 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Тут говорилось про altq но шейпер лучше вынести на отдельную машину и использовать полноформатный altqd (в нём присутвует возможность обреза входящего трафа и динамические очереди) в NetBSD у него возможностей больше чем у dummynet и работает стабильно у меня на 100мегабитной нагрузке уже больше года.
     
  • 1.10, Samm (??), 17:07, 09/02/2009 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Спасибо за описание проблемы. Оформили ли вы PR по результатам?
     
     
  • 2.22, dansoftware (ok), 13:49, 10/02/2009 [^] [^^] [^^^] [ответить]  
  • +/
    Это старая и до сих пор нерешенная проблема: http://www.freebsd.org/cgi/query-pr.cgi?pr=kern/106316
     
     
  • 3.23, Samm (??), 13:53, 10/02/2009 [^] [^^] [^^^] [ответить]  
  • +/
    >Это старая и до сих пор нерешенная проблема: http://www.freebsd.org/cgi/query-pr.cgi?pr=kern/106316

    Тут нигде не сказано про панику.

     
     
  • 4.24, dansoftware (ok), 14:11, 10/02/2009 [^] [^^] [^^^] [ответить]  
  • +/
    >Тут нигде не сказано про панику.

    Справедливое замечание. Тем не менее, на этот PR я наткнулся, когда разбирался с описанной в статье проблемой.

     
  • 2.27, Radist (?), 18:52, 10/02/2009 [^] [^^] [^^^] [ответить]  
  • +/
    >Спасибо за описание проблемы. Оформили ли вы PR по результатам?

    Ничего не формлял. В силу различніх причин.

     

  • 1.11, Аноним (-), 17:32, 09/02/2009 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Автор, можешь расшифровать это предложение
    >Причем пакет возвращается не на правило с
    >номером большим чем правило отправившее пакет на >dummynet как это есть в
    >natd, а пакет возвращается на СЛЕДУЮЩЕЕ правило.

    Чем первое утверждение отличается от второго ?

     
     
  • 2.12, terminus (ok), 17:52, 09/02/2009 [^] [^^] [^^^] [ответить]  
  • +/
    > Автор, можешь расшифровать это предложение
    >>Причем пакет возвращается не на правило с
    >>номером большим чем правило отправившее пакет на >dummynet как это есть в
    >>natd, а пакет возвращается на СЛЕДУЮЩЕЕ правило.
    >
    >Чем первое утверждение отличается от второго ?

    цитата из:

    http://nuclight.livejournal.com/124348.html
    ...
    Подобное выведение пакета из обработки ipfw в другую подсистему - не уникально
    для divert, это общая схема работы в стеке FreeBSD. Например, действия pipe и
    queue в dummynet, передача пакета в netgraph (а также появившийся в 7.0
    ipfw nat) действуют по тому же принципу. Отличие, однако, в том, что в этих
    подсистемах пакет остается внутри ядра, никакому демону не передается.
    Поэтому, во-первых, подсистемы вместо номера правила сохраняют на него полный
    указатель, и пакет вернется непосредственно в следующее правило, даже если оно
    имеет тот же номер.
    ...

     
     
  • 3.14, Аноним (-), 18:38, 09/02/2009 [^] [^^] [^^^] [ответить]  
  • +/
    Спасибо, так понятнее.
    Могу, однако заметить, что сообщения
    >ipfw: ouch!, skip past end of rules, denying packet

    вполне безобидны и к панике не приводят. У меня на нагруженном роутере таких сообщений множество. Они означают именно то, что означают - пакет просто отбрасывается. Также на этом сервере в больших количествах постоянно создаются и удаляются пайпы и правила, направляющие трафик в них. (На сервере стояла 6.1, затем 6.4). Так что я думаю до сути проблемы вы не докопались и утверждение
    >СИСТЕМА ПАДАЕТ КОГДА УДАЛЯЕТСЯ ПРАВИЛО КОТОРОЕ ОТПРАВЛЯЕТ ПАКЕТЫ НА DUMMYNET

    неверно.

     

  • 1.13, cvsup (ok), 18:17, 09/02/2009 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    конечно, ведь проще подковать блоху, чем оповестить  мантейнера
     
  • 1.15, wtf (ok), 19:38, 09/02/2009 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Вся проблема в этом net.inet.ip.fw.one_pass если выставить в 0 то ipfw:ouch!, skip past end of rules, denying packet не будет, если эта переменная всеже необходима то я решал проблему отказом от ipfw flush.
    Да и интернет не молчит http://www.google.ru/search?q=ipfw:+ouch!,+skip+past+end+of+rules,+denying+packet.++&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:ru-RU:unofficial&client=firefox-a
     
     
  • 2.17, mummy (?), 20:26, 09/02/2009 [^] [^^] [^^^] [ответить]  
  • +/
    Может выставить в 1? По-умолчанию ведь 0.
     
     
  • 3.18, wtf (ok), 20:33, 09/02/2009 [^] [^^] [^^^] [ответить]  
  • +/
    да в 1, при этом параметры пакет проходит только через первое подходящее правило, при 0 он проходит через все правила, отсюда и ошибка - во время флуша пакет не находит следующего правила в которое он был отправлен.
     

  • 1.20, pashaumka (?), 23:36, 09/02/2009 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    не знаю как у вас с mpd, но у меня работа построена на pppoed & ppp  - 100 мбит канал и при подключении/отключении создаются и удаляются правила - серваки жужжат и не парятся...150 сессий - 10% загрузки железок. всё железо на интеловых серверных матерях
     
     
  • 2.29, Radist (?), 20:25, 10/02/2009 [^] [^^] [^^^] [ответить]  
  • +/
    У меня 600 сессий ВПН и одновременно ломятся в инет до 100.

    Сейчас прошло уже более месяца. Серваки ни разу (сплюнуть три раза через плечо) не ребутнулись

    З.І. Похожая проблема обнаружилась еще на одном серваке (АМД, два ядра, 6.5 фря, занимается НАТ в пять потоков, т.к. в один поток не справляется). Правил фаєрвола до 300, но есть пару пайп. Иногда при нагрузке близкой к 4 (в еденицах топа), когда удалял правило фаєрвола, все єто чудо просто ребуталось (даже без дампа и сообщений в логах). Исправил по образу и подобию, пока все гуд.

    З.З.І. Спользовать общие пайпі на несколько юзеров немог, т.к. используется система бонусов и у каждого юзверя своя скорость.

    Испольщовать таблиці (имеестя в виду tablearg), можно, но только если не удалять соответствующие правила, а править параметрі пайп. Тоесть все то-же самое.

     
     
  • 3.31, Аноним (-), 12:27, 12/02/2009 [^] [^^] [^^^] [ответить]  
  • +/
    >6.5 фря

    Так и знал, что машину времени уже изобрели.

     
     
  • 4.32, Radist (?), 20:28, 13/02/2009 [^] [^^] [^^^] [ответить]  
  • +/
    >>6.5 фря
    >
    >Так и знал, что машину времени уже изобрели.

    Sorry, 6.2

     

  • 1.33, Pahanivo (ok), 12:51, 08/05/2009 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    хотелось бы взглянуть на ipfw -a list у афтора ))
     
  • 1.34, ak (??), 19:17, 08/05/2009 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Наблюдаю аналогичную проблему на FreeBSD + mpd4 на больших нагрузках (сотни тунелей, десятки килобит в секунду). Причем как на AMD, так и Intel. Как с net.inet.ip.fw.one_pass: 1 так и 0. Как с net.inet.ip.dummynet.io_fast=1, так и 0. Но действительно, на системах, где правила активно удаляются, намного чаще.

    есть очень схожие багрепорты:
    http://www.freebsd.org/cgi/query-pr.cgi?pr=kern/121382
    http://www.freebsd.org/cgi/query-pr.cgi?pr=kern/118128
    оба открыты. Все собираюсь дописать, собираю информацию. Напишите плз туда свое наблюдение.

     
     
  • 2.35, ak (??), 11:50, 12/05/2009 [^] [^^] [^^^] [ответить]  
  • +/
    >десятки килобит в секунду

    *десятки мегабит в секунду, сори

     

  • 1.36, napTu (??), 22:11, 16/03/2010 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    интересная статейка, а я то думал отчего у меня паник был постоянный после пересборок ядра, обновлений фри...

    Что интересно, решилось пересборкой ядра с режимом отладки. После этого не падает.

    Правда нет mpd, работает как основной шлюз с авторизацией stargazer, но правила постоянно добавляются-удаляются в зависимости от активности абонентов(не в моменты подключения-отключения)
    Последовательность следующая:
    ipfw delete $rulenum
    ipfw pipe delete $rulenum
    ...
    ipfw pipe $rulenum config bw $speed2
    ipfw add $rulenum3 pipe $rulenum ip from...

     
  • 1.37, napTu (??), 22:16, 16/03/2010 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    а, кстати, говорят что то подправили в dummynet с месяц назад, связанное с падениями при 100% загрузке
    у меня недавно упал сервак при выключении dummynet_io_fast в 0 на ядре 7.2p3
    Знающие люди порекомендовали обновиться на последние патчи.
     
  • 1.38, napTu (ok), 10:09, 26/05/2010 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    недавно понадобилось грохнуть все правила с pipe. Упали...
    FreeBSD 7.2-RELEASE-p7
     

     Добавить комментарий
    Имя:
    E-Mail:
    Заголовок:
    Текст:




    Партнёры:
    PostgresPro
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2024 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру