[Click] SetCycle + CycleCountAccum
Xavier Grandmougin
xavier.grandmougin at loria.fr
Wed Jun 9 10:02:41 EDT 2004
Hello Eddie,
Thank you for your help, now I get more credible values for the latency.
Xavier
Eddie Kohler wrote:
> Xavier Grandmougin wrote:
>
>> Hi all,
>>
>> I'm running click-1.4pre1 as a kernel module of linux 2.4.21 on a
>> Pentium III 450.
>> I'm trying to measure the end to end latency of my router. I've put a
>> SetCycleCount just after each FromDevice elements.
>> It seems to work correctly if I put the CycleCountAccum anywhere
>> before the ARPQuerier : I get a latency of a few µs (about 1 µs per
>> element). But if I put it anywhere after, I get some huge values of
>> hundreds seconds !?
>> What did I miss ?
>>
>> Thanx
>> Xavier
>>
>> PS: here is my config file
>
>
> Hi Xavier,
>
> There are probably two things going on.
>
> (1) ARPQuerier generates ARP queries and emits them. Since it makes
> these packets from scratch, they have cycle count annotation = 0!
> CycleCountAccum will do the equivalent of:
>
> current_cycle_count = click_get_cycle_count(); /* huge: 10^8 or
> more*/
> _accum_difference += packet->cycle_count() - current_cycle_count;
> /* _accum_difference += 10^8 - 0 ==
> 10^8! */
>
> You can avoid this by supplying ARPQuerier with two outputs. The
> first output will be for IP-in-EThernet packets; put hte
> CycleCountAccum there. The second output is for ARP queries; don't
> put CycleCountAccum there. So for example:
>
> querier0:: ARPQuerier(...);
> querier0[0] -> CycleCountAccum -> queue0;
> querier0[1] -> queue0;
>
> (2) ARPQuerier holds on to packets for a while (like a Queue), if it
> needs to make an ARP query. So even without (1) you'll see large
> numbers (but not 00's of seconds).
>
> I'm going to change CycleCountAccum to ignore packets with cycle count
> anno == 0, so that problems like (1) will be less frequent.
>
> Thanks for the report,
> Eddie
>
>
>>
>> //----------------------------------------------------------------------/
>>
>> // Click configuration file 3 : let the perfs be evaluated !
>> // Author : Xavier GRANDMOUGIN <xavier.grandmougin at libertysurf.fr>
>> // Date of creation : 18/05/2004
>> //----------------------------------------------------------------------/
>>
>>
>>
>> //
>> // +---------+
>> // / \ /+-----------+\
>> // | | +-----------+ | |
>> // | VIDEO | ********** ************* | VIDEO |
>> // | SERVER |===* eth1 * * eth0 *=== | CLIENT |
>> // | |===*10.0.0.1* *192.168.1.1*=== |************* |
>> // |*************| ********** ************* |*eth_client * |
>> // |*eth_server *| | ROUTER | |*192.168.1.2* |
>> // |* 10.0.0.2 *| +-----------+ |************* |
>> // \************/ \+------------+/
>> // +----------+
>> //
>>
>>
>> //AddressInfo : Define names for IP and ETHERNET addresses
>> //for future use in the script since it is more easy to
>> //handle name that numeric addresses
>> // IP ADDRESS IP NETWORK ADDRESS ETHERNET ADDRESS
>> AddressInfo(
>> eth0 192.168.1.1 192.168.1.0/24 00:04:75:d4:25:c2,
>> eth1 10.0.0.1 10.0.0.0/8 00:c0:4f:32:8a:24,
>> eth_client 192.168.1.2 00:c0:4f:32:8a:46,
>> eth_server 10.0.0.2 00:c0:4f:9c:29:e7,
>> );
>>
>>
>>
>> //------------------------------//
>> // //
>> // Compound elements //
>> // //
>> //------------------------------//
>>
>>
>> // Compound element : from_device_class
>> // Abstract : Make a copy of the packets from $device for the sniffer
>> // Input : none
>> // Output : packets from $device
>> elementclass from_device_class {
>> $device |
>> // Declarations
>> from_device :: FromDevice($device);
>> copy_for_sniffing :: Tee;
>> // Connections
>> from_device -> SetCycleCount -> copy_for_sniffing;
>> copy_for_sniffing[1] -> ToHostSniffers($device);
>> copy_for_sniffing[0] -> output;
>> }
>>
>>
>> // Compound element : to_device_class
>> // Abstract : Make a copy for the sniffer, and send them to $device
>> // Input : packets
>> // Ouput : none
>> elementclass to_device_class {
>> $device |
>> // Declarations
>> to_device :: ToDevice($device);
>> copy_for_sniffing :: PullTee;
>> // Connections
>> input -> copy_for_sniffing;
>> copy_for_sniffing[1] -> ToHostSniffers($device);
>> copy_for_sniffing[0] -> to_device;
>> }
>>
>>
>> // Compound element : IP routing
>> // Abstract : Route IP packets to the correct destination
>> // Input : IP packets
>> // Ouput : IP packets for eth0 in output 0, packets for eth1 in output 1
>> elementclass ip_routing_class {
>> // Declaration
>> ip_classifier :: IPClassifier(dst host eth_client,
>> dst host eth_server,
>> dst host eth0,
>> dst host eth1,
>> -);
>> // Connections
>> input -> CheckIPHeader -> GetIPAddress(16) -> ip_classifier;
>> // IP packets for localhost
>> ip_classifier[2] -> EtherEncap(0x0800, 1:1:1:1:1:1, eth0) -> ToHost;
>> ip_classifier[3] -> EtherEncap(0x0800, 1:1:1:1:1:1, eth1) -> ToHost;
>>
>> // IP packets for graveyard
>> ip_classifier[4] -> Discard;
>>
>> // IP packets for eth0
>> ip_classifier[0] -> [0]output;
>> // IP packets for eth1
>> ip_classifier[1] -> [1]output;
>> }
>>
>>
>>
>> //----------------------//
>> // //
>> // Declarations //
>> // //
>> //----------------------//
>>
>> // Devices
>> from_client :: from_device_class(eth0);
>> from_server :: from_device_class(eth1);
>> to_client :: to_device_class(eth0);
>> to_server :: to_device_class(eth1);
>>
>> queue0 :: Queue(5000);
>> queue1 :: Queue(5000);
>>
>> classifier0 :: Classifier( 12/0806 20/0001,
>> 12/0806 20/0002,
>> 12/0800,
>> -);
>> classifier1 :: Classifier( 12/0806 20/0001,
>> 12/0806 20/0002,
>> 12/0800,
>> -);
>>
>> // ARP
>> responder0 :: ARPResponder(eth0);
>> responder1 :: ARPResponder(eth1);
>> querier0 :: ARPQuerier(eth0);
>> querier1 :: ARPQuerier(eth1);
>>
>> ip_packet :: Strip(14);
>> ip_routing :: ip_routing_class;
>>
>> tee0 :: Tee;
>> tee1 :: Tee;
>>
>>
>>
>> //----------------------//
>> // //
>> // Connections //
>> // //
>> //----------------------//
>>
>> // Head
>> from_client -> classifier0;
>> from_server -> classifier1;
>>
>> // Packet classification
>> // ARP queries
>> classifier0[0] -> responder0;
>> classifier1[0] -> responder1;
>> // ARP replies
>> classifier0[1] -> tee0;
>> tee0[0] -> [1]querier0;
>> tee0[1] -> ToHost;
>> classifier1[1] -> tee1;
>> tee1[0] -> [1]querier1;
>> tee1[1] -> ToHost;
>> // IP
>> classifier0[2] -> ip_packet;
>> classifier1[2] -> ip_packet;
>> ip_packet -> ip_routing;
>> ip_routing[0] -> [0]querier0;
>> ip_routing[1] -> [0]querier1;
>> // other
>> classifier0[3] -> Discard;
>> classifier1[3] -> Discard;
>>
>> // Tail
>> responder0 -> queue0;
>> responder1 -> queue1;
>> querier0 -> CycleCountAccum -> queue0;
>> querier1 -> queue1;
>> queue0 -> to_client;
>> queue1 -> to_server;
>>
>>
>>
>> _______________________________________________
>> click mailing list
>> click at amsterdam.lcs.mit.edu
>> https://amsterdam.lcs.mit.edu/mailman/listinfo/clic
>> k
>
>
More information about the click
mailing list