inxs Posted February 8, 2008 Posted February 8, 2008 Есть железка, core2 e6750, 2г памяти, FreeBSD 7.0-RC1, SHED_ULE. В ядро добавлено: options DUMMYNET options IPFIREWALL options IPFIREWALL_DEFAULT_TO_ACCEPT options HZ=1000 device if_bridge Используется около 12к пайпов, трафик в них заворачивается двумя табличками. Сразу после загрузки пайпов в top'е появляются чудеса: last pid: 1236; load averages: 0.00, 0.00, 0.00 up 0+00:25:33 21:05:06 86 processes: 5 running, 64 sleeping, 17 waiting CPU states: 0.2% user, 0.0% nice, 24.8% system, 0.0% interrupt, 75.0% idle Mem: 12M Active, 7412K Inact, 32M Wired, 32K Cache, 12M Buf, 1902M Free Swap: 3970M Total, 3970M Free PID USERNAME THR PRI NICE SIZE RES STATE C TIME WCPU COMMAND 11 root 1 171 ki31 0K 8K RUN 1 24:55 100.00% idle: cpu1 12 root 1 171 ki31 0K 8K RUN 0 15:37 100.00% idle: cpu0 46 root 1 -68 - 0K 8K CPU0 0 9:18 0.00% dummynet При этом нагрузки на шейпер вообще нет, более того, интерфейсы, через которые может хоть что-то кроме ssh пролетать, вообще погашены. При пропускании около 200мбит idle падает до 15%, часть пакетов теряется. Основную нагрузку в этом случае создают процессы em0 taskq и em1 taskq. Вопрос: где я неправ и как это хозяйство заставить нормально работать? Вставить ник Quote
jab Posted February 8, 2008 Posted February 8, 2008 Вопрос: где я неправ и как это хозяйство заставить нормально работать? Для начала: sysctl dev.em.0.rx_int_delay: 600 dev.em.0.tx_int_delay: 600 dev.em.0.rx_abs_int_delay: 1000 dev.em.0.tx_abs_int_delay: 1000 Потом попробовать увеличить buckets в ipfw pipe Вставить ник Quote
inxs Posted February 8, 2008 Author Posted February 8, 2008 (edited) Спасибо, sysctl в понедельник попробую (сейчас нет возможности пустить трафик). buckets при добавлении в любом случае пишет 1, net.inet.ip.dummynet.hash_size: 20000 И. собственно, от чего dummynet жрёт проц при ничегонеделании? Edited February 8, 2008 by inxs Вставить ник Quote
jab Posted February 8, 2008 Posted February 8, 2008 Спасибо, sysctl в понедельник попробую (сейчас нет возможности пустить трафик).buckets при добавлении в любом случае пишет 1, net.inet.ip.dummynet.hash_size: 20000 И. собственно, от чего dummynet жрёт проц при ничегонеделании? "Уважаемые товарищи ученые, у меня в подполе уже который год происходит подземный стук, объясните пожалуйста, отчего и почему он происходит". (с) ПНвС АБС По вашему top'у я не вижу, чтобы dummynet что-то жрал. A hash_size=20000 это конечно круто, но по-моему совершенно избыточно. Покажите строку которой создаете pipes. Вставить ник Quote
inxs Posted February 8, 2008 Author Posted February 8, 2008 По вашему top'у я не вижу, чтобы dummynet что-то жрал.%% system + увеличивается cpu time у dummynet Покажите строку которой создаете pipes.Сначала скриптом генерится большой файлик со строками вида pipe 30 config bw 3000kbit/s table 1 add xx.xx.xx.12 30 table 1 add xx.xx.xx.130 30 Потом - /sbin/ipfw -q -p cat /this/file /dev/null Вставить ник Quote
jab Posted February 8, 2008 Posted February 8, 2008 Сначала скриптом генерится большой файлик со строками вида pipe 30 config bw 3000kbit/s table 1 add xx.xx.xx.12 30 table 1 add xx.xx.xx.130 30 Потом - /sbin/ipfw -q -p cat /this/file /dev/null То есть все 12 тыщ пайпов статические и queue вы не задаете ? Ну тогда hash_size и buckets не помогут. Тогда у вас нормальная нагрузка для 200 мегабит. А почему нельзя сделать по-нормальному ? Каковы условия исходной задачи ? Вставить ник Quote
inxs Posted February 8, 2008 Author Posted February 8, 2008 Есть клиент, на клиента выделяется, например, 3 мегабита (3 на вход, 3 на выход). У клиента может быть несколько ip адресов, нужно их все в эти 3 мбита вписать. Можно в принципе сделать и динамическими ("авторизовался клиент или нет"), но это крайняя мера, пока пытаемся сделать так. Вставить ник Quote
jab Posted February 8, 2008 Posted February 8, 2008 Есть клиент, на клиента выделяется, например, 3 мегабита (3 на вход, 3 на выход). У клиента может быть несколько ip адресов, нужно их все в эти 3 мбита вписать. Можно в принципе сделать и динамическими ("авторизовался клиент или нет"), но это крайняя мера, пока пытаемся сделать так. И что, все 12тысяч с несколькими ip ? Тогда делайте динамические трубы по определенной маске, и клиенту выдавайте подсеть. Или у вас еще и скорости у всех уникальные ? Например: ipfw pipe 5 config mask dst-ip 0xfffffff0 bw 3000Kbit/s queue 100 buckets 256 ipfw table 5 add x.x.x.8/29 Вставить ник Quote
inxs Posted February 8, 2008 Author Posted February 8, 2008 Ну практически у всех по нескольку адресов, + чаще всего перемешаны прямые и серые, вариант с подсетью не прокатит :( Только там не 12, а 6 - пайпов два, один на вход, один на выход. Вставить ник Quote
jab Posted February 8, 2008 Posted February 8, 2008 Ну практически у всех по нескольку адресов, + чаще всего перемешаны прямые и серые, вариант с подсетью не прокатит :(Только там не 12, а 6 - пайпов два, один на вход, один на выход. Предлагаю пристрелить проектировщика. :-) Вставить ник Quote
inxs Posted February 8, 2008 Author Posted February 8, 2008 Он против ;) Кроме уменьшение количества пайпов что-нибудь можно сделать? Вставить ник Quote
jab Posted February 8, 2008 Posted February 8, 2008 Он против ;)Кроме уменьшение количества пайпов что-нибудь можно сделать? Ну в лоб в данной схеме вряд ли. У вас же каждый пакет проходит через кучу правил. Таблички практически не работают. Я так понимаю что пакеты в трубу Вы загоняете через tablearg ? Тогда просите разработчиков, чтобы сделали mask tablearg в pipe, тогда можно будет делать динамические трубы. Вставить ник Quote
inxs Posted February 8, 2008 Author Posted February 8, 2008 Да, через tablearg. Меня всё ещё мучает вопрос - куда деваются 25% цпу в состоянии idle? Вставить ник Quote
Skylord Posted February 8, 2008 Posted February 8, 2008 С одной стороны присоединяюсь к мнению, что спроектировано странно. ;-) С другой стороны, если все адреса загнаны в одну таблицу и выбор pipe идет через tablearg, то никакого особенно большого количества правил пакет не проходит - нечего пугаться... Как я понял, что раз загрузка по tasq на em возрастает под нагрузкой, то поллинг в системе не используется? В общем, у себя в свое время я решил подобные проблемы отключением поллинга (которому на em действительно не место) и выставлением sysctl net.isr.direct="0" Появилась нагрузка по прерываниям, но суммарная по всему стала меньше и все потери и т.п. исчезли. Хотя вначале тоже на количество/качество правил для dummynet грешил... Вставить ник Quote
inxs Posted February 8, 2008 Author Posted February 8, 2008 (edited) Поллинга нет и не было.. em в семёрке вроде как сильно умное, само прерываниями рулит. Skylord, а сколько примерно у вас пайпов? Edited February 8, 2008 by inxs Вставить ник Quote
Skylord Posted February 10, 2008 Posted February 10, 2008 Поллинга нет и не было.. em в семёрке вроде как сильно умное, само прерываниями рулит.Ага... Вот и я когда на 7 перешел - отключил.... А до этого сильно помогало... Skylord, а сколько примерно у вас пайпов?Да у меня-то мало, ибо динамические они через mask (ИМХО, в этой функциональность и есть главная сила и бонусы dummynet по сравнению, допустим, с altq)... Просто мне по описанию проблемы она показалась на мою похожа. :-) У себя я сначала тоже думал на dummynet, на pf (машина еще выступает НАТом), пытался тюнинговать все что только можно, включая em, добился "космического совершенства" ;-) в виде оставления одного единственного правила в ipfw, которое делает шейпинг на все 20 тарифов (через пресловутый tablearg), и только накурившись в должной степени maillist'ов пришел к использованию вышеупомянутого параметра, отключающего netisr direct dispatch, который, видать, плохо дружит с dummynet'ом.... Хотя, возможно, это все мои домыслы и я придаю этому слишком большое зачение. :-) Вставить ник 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.