You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

118 lines
3.3 KiB

# lws detailed latency
![lws detailed latency example plot](../doc-assets/lws-detailed-latency-example.png)
## Introduction
lws has the capability to make detailed latency measurements and
report them in realtime to a specified callback.
A default callback is provided that renders the data as text in
space-separated format suitable for gnuplot, to a specified file.
## Configuring
Enable `LWS_WITH_DETAILED_LATENCY` at cmake.
Create your context with something similar to this
```
#if defined(LWS_WITH_DETAILED_LATENCY)
info.detailed_latency_cb = lws_det_lat_plot_cb;
info.detailed_latency_filepath = "/tmp/lws-latency-results";
#endif
```
`lws_det_lat_plot_cb` is provided by lws as a convenience to convert
the stuct data provided at the callback interface to space-separated
text data that is easy to process with shell commands and gnuplot.
## `lws_det_lat_plot_cb` format
```
728239173547 N 23062 0 0 23062 0 0 0
728239192554 C 18879 0 0 18879 0 0 0
728239217894 T 25309 0 0 25309 0 0 0
728239234998 r 0 0 0 0 271 172 256
728239250611 r 0 0 0 0 69 934 4096
728239255679 w 19 122 18 159 20 80 80
728239275718 w 20 117 15 152 18 80 80
728239295578 w 10 73 7 90 7 80 80
728239315567 w 9 67 5 81 7 80 80
728239335745 w 23 133 9 165 14 80 80
...
```
Each event is shown in 9 columns
- unix time in us
- event type
- N = Name resolution
- C = TCP Connection
- T = TLS negotiation server
- t = TLS negotiation client
- r = Read
- w = Write
- us duration, for w time client spent waiting to write
- us duration, for w time data spent in transit to proxy
- us duration, for w time proxy waited to send data
- as a convenience, sum of last 3 columns above
- us duration, time spent in callback
- last 2 are actual / requested size in bytes
## Processing captured data with ministat
Eg, to summarize overall latencies on all captured writes
```
$ cat /tmp/lws-latency-results | grep " w " | cut -d' ' -f6 | ministat
...
N Min Max Median Avg Stddev
x 1000 43 273 141 132.672 32.471693
```
## Processing captured data with gnuplot
### Gnuplot plotting script
Create a gnuplot script, eg myscript.gp
```
reset
set term pngcairo enhanced nocrop font "OpenSans, 12" size 800,600#output terminal and file
set output "lws-latency.png"
#set yrange [0:10000]
#to put an empty boundary around the
#data inside an autoscaled graph.
set offset graph 0.05,0.05,0.05,0.0
set style fill transparent solid 0.5 #fillstyle
set tics out nomirror
set xlabel "event"
set ylabel "latency (us)"
set format x ""
set title "Write latency"
set key invert reverse Right inside nobox
set key autotitle columnheader
set style data histogram
set style histogram rowstacked
set style fill solid border -1
set boxwidth 0.75
set style fill solid 1.00 noborder
set tic scale 0
set grid ytics lc rgb "#505050"
unset border
unset xtics
plot '/tmp/1' \
using ($3 + $4 + $5):xtic(1) w boxes lt rgbcolor "blue" title 'prox wr wait', \
'' using ($3 + $4):xtic(1) w boxes lt rgbcolor "green" title 'txfr to prox', \
'' using 3:xtic(1) w boxes lt rgbcolor "red" title 'cli wri wait'
```
### gnuplot invocation
```
$ cat /tmp/lws-latency-results | grep " w " \>/tmp/1 ; gnuplot myscript.gp && eog lws-latency.png
```