Re: BSD 6.1 & polling

From
Eugene Grosbein (2:5006/1)
To
Alexander Kolesnikoff
Date
2007-01-07T21:15:28Z
Area
RU.UNIX.BSD
Reply-To: eugen@grosbein.pp.ru

05 янв 2007, пятница, в 21:43 KRAST, Alexander Kolesnikoff написал(а):

 >> В случае с iperf тут тормозом, как ни странно, стал клиент -
 >> iperf после каждого write вызывает gettimeofday, что даже на UP ядре
 >> и таймере ACPI-fast выливается в громадный оверхед в system time.
 >> Дергать таймер 80 тысяч раз в секунду довольно дорого на FreeBSD
 >> Есть какой-нибудь бенчмарк, который так не делает?
 AK>   ng_source ?

Попробовал так.
При помощи 'tcpdump -s0 -n -p -c1 -i fxp0 -w packet.raw src host $myip
and udp port 5001' поймал один из тех пакетов, что шлет iperf.

Размер данных UDP в нем 64 байта, плюс 20 байт заголовок UDP,
плюс 8 байт заголовок IP, плюс 14 байт на ethernet, итого 106 байт.
При помощи tail -c 106 packet.raw >packet.cap получил файл для ng_source.

Сделал скрипт для измерения:

#!/bin/sh

ngctl mkpeer fxp0: source orphans output
nghook fxp0:orphans input < packet.cap
ngctl msg fxp0:orphans start 100000000
sleep 60
ngctl msg fxp0:orphans stop
ngctl msg fxp0:orphans getstats
ngctl shutdown fxp0:orphans

На принимающей стороне (на сервере) сказал:

ipfw add 5 allow udp from any to any in recv fxp0
(другого UDP-трафика тут все равно нет).

Запустил скрипт, он после окончания тестирования
выводит накопленную статистику и обнуляет её (гашением ng_source).
На сервере результат показывает мне ipfw show 5.

В результате на клиенте:

Rec'd response "getstats" (1) from "[69]:":
Args:   { outOctets=609393046 outFrames=5748991 queueOctets=106
queueFrames=1 startTime={ tv_sec=1168178402 tv_usec=886685 } endTime={
tv_sec=1168178462 tv_usec=896665 } elapsedTime={ tv_sec=60 tv_usec=9980 }
lastTime={ tv_sec=1168178402 tv_usec=886685 } }

На сервере:
00005  2639889  242869788 allow udp from any to any in recv fxp0

Итого получаем: 2639889/5748991=45.9% успеха, или почти 55% потерь.
В процессе тестирования буфера на выход на этой сетевой у клиента
забивались вусмерть (пинг не ходил: ping: sendto: No buffer space available),
ранее установленный ssh-коннект с сервером порвался.

Вопрос - что именно меряет ng_source? Судя по всему, потери образовались
еще до выхода в линию, на клиенте. Сам клиент при этом по процессору
был 96% idle все время.

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 5007/1 5010/70 5011/13 5012/46 5015/28
SEEN-BY: 5019/26 5020/18 175 194 400 545 982 1057 1909 1922 2238 2395 2871
SEEN-BY: 5020/4441 5021/29 5025/3 5026/14 45 5027/12 5030/1080 1957 5034/10 13
SEEN-BY: 5035/38 5036/1 5045/7 5049/1 5051/15 5054/1 4 8 9 11 28 35 36 37 45
SEEN-BY: 5054/66 67 70 75 84 85 5059/9 5060/88 5061/15 5062/10 5063/3 5064/7
SEEN-BY: 5066/18 5075/5 5076/1 5077/70 5084/9 5085/13 5095/20 5096/18 6001/10
PATH: 5006/1 5020/400 545 5054/1 37