Measuring Tools and Scripts » History » Version 12
GAY, Adrien, 12/15/2014 09:05 PM
1 | 3 | Cuadro, Juan Pablo | h1. Measuring Tools |
---|---|---|---|
2 | 1 | Cuadro, Juan Pablo | |
3 | 4 | Cuadro, Juan Pablo | ----- |
4 | 4 | Cuadro, Juan Pablo | |
5 | 3 | Cuadro, Juan Pablo | h2. EL470 |
6 | 1 | Cuadro, Juan Pablo | |
7 | 12 | GAY, Adrien | The Newtec EL470 versions that Telecom Bretagne owns have no protocol testing capabilities. However, when in ACM mode, the ACM controller (the HUB) keeps a log file containing the modulation and coding schemes as well as bitrate and Es/N0 estimated . The log files are stored as .csv (Comma Separated Values). These are stored per six hours intervals and a log file history of the previous 24hours can be consulted. An example can be seen below: |
8 | 1 | Cuadro, Juan Pablo | |
9 | 1 | Cuadro, Juan Pablo | <pre> |
10 | 1 | Cuadro, Juan Pablo | Timestamp,Demod,RqModCod,EsNo,CarrierBitrate |
11 | 2 | Cuadro, Juan Pablo | 2014-12-12 15:05:19,1,16APSK-2/3,11.20,1445835 |
12 | 2 | Cuadro, Juan Pablo | 2014-12-12 15:05:24,1,16APSK-2/3,10.72,1324072 |
13 | 2 | Cuadro, Juan Pablo | 2014-12-12 15:05:28,1,16APSK-2/3,10.61,1324072 |
14 | 2 | Cuadro, Juan Pablo | 2014-12-12 15:05:31,1,16APSK-2/3,10.66,1324072 |
15 | 2 | Cuadro, Juan Pablo | 2014-12-12 15:05:34,1,8PSK-3/4,10.19,1313479 |
16 | 2 | Cuadro, Juan Pablo | 2014-12-12 15:05:37,1,8PSK-3/4,11.87,1313479 |
17 | 2 | Cuadro, Juan Pablo | 2014-12-12 15:05:41,1,8PSK-3/4,10.40,1313479 |
18 | 2 | Cuadro, Juan Pablo | 2014-12-12 15:06:47,1,QPSK-5/6,6.93,884389 |
19 | 2 | Cuadro, Juan Pablo | 2014-12-12 15:06:51,1,QPSK-5/6,8.18,884389 |
20 | 2 | Cuadro, Juan Pablo | 2014-12-12 15:06:56,1,QPSK-5/6,7.02,825503 |
21 | 1 | Cuadro, Juan Pablo | </pre> |
22 | 1 | Cuadro, Juan Pablo | |
23 | 2 | Cuadro, Juan Pablo | It is unclear though what the logging frequency is. We have determined that this rate depends on the rate at which Es/N0 estimates change. From the csv file we can extract the following information: |
24 | 1 | Cuadro, Juan Pablo | |
25 | 1 | Cuadro, Juan Pablo | * Timestamp (in seconds) |
26 | 1 | Cuadro, Juan Pablo | * Modcod parameter (modulation + coding rate) |
27 | 1 | Cuadro, Juan Pablo | * Estimate of E ~s~ / N ~0~ |
28 | 1 | Cuadro, Juan Pablo | * Information bitrate (in bps) |
29 | 1 | Cuadro, Juan Pablo | |
30 | 9 | Cuadro, Juan Pablo | This log file can be accessed through in the FlexACM controller tab. It is the button labeled Controller Log: |
31 | 9 | Cuadro, Juan Pablo | |
32 | 10 | Cuadro, Juan Pablo | p=. !{width: 70%}FlexController.png! |
33 | 9 | Cuadro, Juan Pablo | |
34 | 9 | Cuadro, Juan Pablo | A much simpler way though is to use the following link: |
35 | 9 | Cuadro, Juan Pablo | |
36 | 9 | Cuadro, Juan Pablo | @http://192.168.88.100/cgi-bin/pegui-cgi/cli/cgi+acmcdem?filename=acmcdem.csv@ |
37 | 9 | Cuadro, Juan Pablo | |
38 | 1 | Cuadro, Juan Pablo | h2. Traffic generation and capture |
39 | 1 | Cuadro, Juan Pablo | |
40 | 8 | Cuadro, Juan Pablo | In order to measure performance at the application level we will use _Iperf_. _Iperf_ is a tool to generate streams of TCP and UDP traffic as well as measuring throughput and other statistics. It has a client and server functionality, and can measure the throughput between the two ends. For more information and download links as well as documentation check Iperf3's website "here":http://software.es.net/iperf/. In order to have a finer control over the values obtained, we will capture all traffic using _tcpdump_ and perform an offline calculation of throughput using pcaptput.py. |
41 | 3 | Cuadro, Juan Pablo | |
42 | 3 | Cuadro, Juan Pablo | notice. We will generate a UDP data stream in order to test throughput. |
43 | 3 | Cuadro, Juan Pablo | |
44 | 3 | Cuadro, Juan Pablo | To setup Iperf we will have to launch it on both the HUB PC (as client) and Station PC (as server). Since the HUB PC will be the one sending packets it has to be setup as a server. Likewise, the Station PC must be setup as a server. |
45 | 3 | Cuadro, Juan Pablo | |
46 | 3 | Cuadro, Juan Pablo | <pre><code class="Terminal"> |
47 | 3 | Cuadro, Juan Pablo | # STATION PC LISTENING ON PORT 5201 |
48 | 3 | Cuadro, Juan Pablo | |
49 | 8 | Cuadro, Juan Pablo | $ iperf3 -s -u -i1 -p 5201 |
50 | 3 | Cuadro, Juan Pablo | ------------------------------------------------------------ |
51 | 3 | Cuadro, Juan Pablo | Server listening on UDP port 5201 |
52 | 3 | Cuadro, Juan Pablo | Receiving 1470 byte datagrams |
53 | 3 | Cuadro, Juan Pablo | UDP buffer size: 192 KByte (default) |
54 | 3 | Cuadro, Juan Pablo | ------------------------------------------------------------ |
55 | 3 | Cuadro, Juan Pablo | </code></pre> |
56 | 3 | Cuadro, Juan Pablo | |
57 | 3 | Cuadro, Juan Pablo | <pre><code class="Terminal"> |
58 | 3 | Cuadro, Juan Pablo | # HUB PC STARTS UDP DATA STREAM DES_PORT = 5201 |
59 | 3 | Cuadro, Juan Pablo | |
60 | 8 | Cuadro, Juan Pablo | $ iperf3 -c 10.0.0.130 -u -t <duration in secs> -b <bandwidth> -l <udp size> -p 5201 |
61 | 3 | Cuadro, Juan Pablo | ------------------------------------------------------------ |
62 | 3 | Cuadro, Juan Pablo | Client connecting to 10.0.0.130, UDP port 5201 |
63 | 3 | Cuadro, Juan Pablo | Sending <udp size> byte datagrams |
64 | 3 | Cuadro, Juan Pablo | UDP buffer size: 9.00 KByte (default) |
65 | 3 | Cuadro, Juan Pablo | ------------------------------------------------------------ |
66 | 3 | Cuadro, Juan Pablo | </code></pre> |
67 | 3 | Cuadro, Juan Pablo | |
68 | 3 | Cuadro, Juan Pablo | At the same time the Station PC must capture all incoming traffic, we will use the following command: |
69 | 1 | Cuadro, Juan Pablo | |
70 | 3 | Cuadro, Juan Pablo | <pre><code class="Terminal"> |
71 | 3 | Cuadro, Juan Pablo | # CAPTURE INCOMING TRAFFIC |
72 | 8 | Cuadro, Juan Pablo | |
73 | 3 | Cuadro, Juan Pablo | $ tcpdump -w output_file_name.pcap |
74 | 3 | Cuadro, Juan Pablo | </code></pre> |
75 | 3 | Cuadro, Juan Pablo | |
76 | 5 | Cuadro, Juan Pablo | |
77 | 5 | Cuadro, Juan Pablo | |
78 | 3 | Cuadro, Juan Pablo | h1. Scripts |
79 | 4 | Cuadro, Juan Pablo | |
80 | 4 | Cuadro, Juan Pablo | ----- |
81 | 4 | Cuadro, Juan Pablo | |
82 | 3 | Cuadro, Juan Pablo | |
83 | 7 | Cuadro, Juan Pablo | In order to process obtained data we have created multiple scripts to parse and display results. Please download attachment:measurements.zip inside you will find measurements taken in the course of this project as well as well as the following scripts: |
84 | 3 | Cuadro, Juan Pablo | |
85 | 3 | Cuadro, Juan Pablo | * *pcaptput.py* : Calculates throughput metrics from .pcap file. |
86 | 3 | Cuadro, Juan Pablo | * *bulk_pcaptput* : Bash script to run pcaptput.py on all data and generate .tput files. |
87 | 3 | Cuadro, Juan Pablo | * *ConsolidateRun.m* : MATLAB class to import and consolidate .pcap as well as .tput data. |
88 | 3 | Cuadro, Juan Pablo | * *bulk_consolidate_results.m* : MATLAB script to generate all graphs in this wiki. |
89 | 3 | Cuadro, Juan Pablo | |
90 | 3 | Cuadro, Juan Pablo | There is also README for further clarification. |
91 | 3 | Cuadro, Juan Pablo | |
92 | 3 | Cuadro, Juan Pablo | h2. pcaptput.py |
93 | 3 | Cuadro, Juan Pablo | |
94 | 3 | Cuadro, Juan Pablo | _pcaptput.py_ is a small python script we wrote in order to calculate application (UDP) throughput as well as layer 3 end-to-end throughput considering only IP packets (header + payload). It uses the "dpkt":http://code.google.com/p/dpkt/. library which is a "fast, simple packet creation / parsing, with definitions for the basic TCP/IP protocols" Python library. |
95 | 3 | Cuadro, Juan Pablo | |
96 | 3 | Cuadro, Juan Pablo | <pre><code class="Python"> |
97 | 3 | Cuadro, Juan Pablo | #!/usr/bin/python2.6 |
98 | 3 | Cuadro, Juan Pablo | |
99 | 3 | Cuadro, Juan Pablo | # pcaptput.py |
100 | 3 | Cuadro, Juan Pablo | |
101 | 3 | Cuadro, Juan Pablo | import sys, dpkt |
102 | 3 | Cuadro, Juan Pablo | if len(sys.argv) != 2: |
103 | 3 | Cuadro, Juan Pablo | raise ValueError('.pcap file needs to be specified.') |
104 | 3 | Cuadro, Juan Pablo | |
105 | 3 | Cuadro, Juan Pablo | filename = sys.argv[1]; |
106 | 3 | Cuadro, Juan Pablo | udpPort = 5201 |
107 | 3 | Cuadro, Juan Pablo | tRes = 1 |
108 | 3 | Cuadro, Juan Pablo | periodn = 0 |
109 | 3 | Cuadro, Juan Pablo | baseTimeStamp = 0 |
110 | 3 | Cuadro, Juan Pablo | iter = 0 |
111 | 3 | Cuadro, Juan Pablo | # Total IP packet counter |
112 | 3 | Cuadro, Juan Pablo | ipBitCount = 0 |
113 | 3 | Cuadro, Juan Pablo | # UDP payload counter |
114 | 3 | Cuadro, Juan Pablo | udpBitCount = 0 |
115 | 3 | Cuadro, Juan Pablo | print 'Time[s]', 'IP-Throughput[bps]', 'UDP-Throughput[bps]' |
116 | 3 | Cuadro, Juan Pablo | for timeStamp, buf in dpkt.pcap.Reader(open(filename, 'r')): |
117 | 3 | Cuadro, Juan Pablo | iter += 1 |
118 | 3 | Cuadro, Juan Pablo | if iter == 1: |
119 | 3 | Cuadro, Juan Pablo | baseTimeStamp = timeStamp |
120 | 3 | Cuadro, Juan Pablo | # Get ethernet frame |
121 | 3 | Cuadro, Juan Pablo | eth = dpkt.ethernet.Ethernet(buf) |
122 | 3 | Cuadro, Juan Pablo | # Check for pure IP traffic only (no ARP packets) |
123 | 3 | Cuadro, Juan Pablo | if type(eth.data) != dpkt.ip.IP: |
124 | 3 | Cuadro, Juan Pablo | continue |
125 | 3 | Cuadro, Juan Pablo | ip = eth.data |
126 | 3 | Cuadro, Juan Pablo | ts = timeStamp - baseTimeStamp |
127 | 3 | Cuadro, Juan Pablo | # Histogram bins |
128 | 3 | Cuadro, Juan Pablo | if ts >= periodn * tRes: |
129 | 3 | Cuadro, Juan Pablo | print periodn * tRes, ipBitCount / tRes, udpBitCount / tRes |
130 | 3 | Cuadro, Juan Pablo | periodn += 1 |
131 | 3 | Cuadro, Juan Pablo | udpBitCount = 0 |
132 | 3 | Cuadro, Juan Pablo | ipBitCount = 0 |
133 | 3 | Cuadro, Juan Pablo | # Counters |
134 | 3 | Cuadro, Juan Pablo | ipBitCount += ip.len * 8 |
135 | 3 | Cuadro, Juan Pablo | if isinstance(ip.data, dpkt.udp.UDP) and (udpPort == ip.data.dport): |
136 | 3 | Cuadro, Juan Pablo | udpBitCount += ip.data.ulen * 8 |
137 | 3 | Cuadro, Juan Pablo | </code></pre> |
138 | 3 | Cuadro, Juan Pablo | |
139 | 3 | Cuadro, Juan Pablo | Usage is as follows: |
140 | 3 | Cuadro, Juan Pablo | |
141 | 3 | Cuadro, Juan Pablo | <pre><code class="Terminal"> |
142 | 3 | Cuadro, Juan Pablo | $ ./pcaptput.py input.pcap > output.tput |
143 | 3 | Cuadro, Juan Pablo | |
144 | 3 | Cuadro, Juan Pablo | Time[s] IP-Throughput[bps] UDP-Throughput[bps] |
145 | 3 | Cuadro, Juan Pablo | 0 0 0 |
146 | 3 | Cuadro, Juan Pablo | 1 4688 0 |
147 | 3 | Cuadro, Juan Pablo | 2 3984 96 |
148 | 3 | Cuadro, Juan Pablo | 3 754720 742944 |
149 | 3 | Cuadro, Juan Pablo | 4 775552 763872 |
150 | 3 | Cuadro, Juan Pablo | 5 860544 847584 |
151 | 3 | Cuadro, Juan Pablo | 6 903040 889440 |
152 | 3 | Cuadro, Juan Pablo | 7 1019904 1004544 |
153 | 3 | Cuadro, Juan Pablo | 8 1083648 1067328 |
154 | 3 | Cuadro, Juan Pablo | 9 1221760 1203360 |
155 | 3 | Cuadro, Juan Pablo | 10 1296128 1276608 |
156 | 3 | Cuadro, Juan Pablo | 11 903040 889440 |
157 | 3 | Cuadro, Juan Pablo | 12 764928 753408 |
158 | 3 | Cuadro, Juan Pablo | 13 807424 795264 |
159 | 3 | Cuadro, Juan Pablo | 14 860544 847584 |
160 | 3 | Cuadro, Juan Pablo | 15 956160 941760 |
161 | 3 | Cuadro, Juan Pablo | 16 988032 973152 |
162 | 3 | Cuadro, Juan Pablo | </code></pre> |