Re: BSD 6.1 & polling

From
Eugene Grosbein (2:5006/1)
To
Oleg Gawriloff
Date
2007-01-05T03:37:34Z
Area
RU.UNIX.BSD
Reply-To: eugen@grosbein.pp.ru

31 дек 2006, воскресенье, в 19:52 KRAST, Oleg Gawriloff написал(а):

 VG>> Да, это дохрена. На моём роутере поток 11-12 тысяч в секунду в одну
 VG>> сторону, полные 100 мегабит (качают-с). Неудивительно, что твоё железо
 VG>> даёт не более 35.
 OG> Тогда перефразируем вопрос: Как смаршрутизировать 36000 пакетов (туда и 
 OG> обратно. Суммарно 72000) (дающих суммарный трафик в 80Мбит (туда и
 OG> обратно, 
 OG> суммарно 160Мбит)? Т.е. железо не справляется, понятно. Какое железо 
 OG> необходимо то? Циска 7600 уже заказана, но она будет только в мае, до
 OG> этого 
 OG> времени еще дожить нужно.

Потестировал чуток. Вот есть рядом две машинки, одна двухъядерный Pentium-D
2.4Ghz с Intel 82557 Pro/100 Ethernet, другая Celeron-900
с Intel 82559 Pro/100 Ethernet, соединены кроссовером. Обе 6.2-PRERELEASE,
из одних и тех же сорцов собраны. iperf из сегодняшних портов в режиме UDP,
Celeron - сервер, Pentium - клиент. ifconfig fxp0 link0 на обоих концах
включено.

На клиенте запускаю iperf -f m -l 64 -u -t 10 -b 10000K, получаю
10Mbit трафика, потерь меньше 0.05%. На клиенте 165 прерываний в секунду
на fxp0, на сервере 19500 прерываний. При повышении скрости - сервер
проседает, 25500 прерываний в секунду и 23% потерь, те же 10Mbit/s.
Это все без поллинга и на неоптимизированном ядре сервера.

При включении оптимизации (CPUTYPE=pentium3) и выкидывании IPSEC из ядра
(что дает mpsafe), получаем 14Mbit/s (27800 прерываний в секунду)
без потерь и потери 2.5% на 15Mbit/s (29400 прерываний в секунду).
В последнем случае на сервере имеем 245 прерываний в секунду на fxp0,
а на клиенте 66% CPU тратилось на прерывания, почти 30% на system time,
остальное user time (запущенный systat), idle 0%.

При включении поллинга на клиенте получаем 25Mbit/s без потерь,
при это systat показывает 0 прерываний по fxp, а idle становится 40%,
на прерывания уходит около 35%, также уменьшается system time.

При увеличении потока до 40Mbit/s потери плавно и пропорционально растут
до 3.5%, при этом загрузка клиента повысилась до 50%, то есть одно
ядро полностью загружено (почти только на system time). На сервере
при этом около 5% CPU свободно.

Почему-то ifconfig fxp0 polling на клиенте возвращает Invalid argument
(возвращает это на самом деле ioctl(SIOCSIFCAP), хотя polling в ядре есть).

Все это, напомню, при размере UDP payload в 64 байта.
Для 25mbit/s iperf говорит: Sent 499723 datagrams, это за 10 секунд,
получаем 49.9kpps, причем с отдачей на userland на Celeron-900 и 40% Idle
CPU. 

Для 40Mbit/s это уже 82.7kpps при 3.5% потерь и почти полностью занятом CPU.

Дальше тестировать не стал, поздно уже :-)

Eugene
-- 
И знатную леди от Джуди О'Греди
Не сможет никто отличить.
--- slrn/0.9.8.0 (FreeBSD)
 * Origin: Svyaz Service JSC (2:5006/1@fidonet)
SEEN-BY: 50/12 400/814 450/159 1024 461/43 132 640 469/999 4616/3 4625/8
SEEN-BY: 4641/444 5000/76 5000 5006/1 8 9 10 14 16 17 5007/1 5010/70 5011/13
SEEN-BY: 5012/46 5015/28 5019/26 5020/18 175 194 400 545 982 1057 1909 1922
SEEN-BY: 5020/2238 2395 2871 4441 5021/29 5025/3 5026/14 45 5027/12 5030/1080
SEEN-BY: 5030/1957 5034/10 13 5035/38 5036/1 5045/7 5049/1 5051/15 5054/1 4 8
SEEN-BY: 5054/9 11 28 35 36 37 45 66 67 70 75 84 85 5059/9 5060/88 5061/15
SEEN-BY: 5062/10 5063/3 5064/7 5066/18 5075/5 5076/1 5077/70 5084/9 5085/13
SEEN-BY: 5095/20 5096/18 6001/10
PATH: 5006/1 5020/400 545 5054/1 37