1
0
Fork 0
mirror of https://github.com/warmcat/libwebsockets.git synced 2025-03-09 00:00:04 +01:00
libwebsockets/READMEs/README.detailed-latency.md
Andy Green d808748cd6 detailed latency stats
Remove LWS_LATENCY.

Add the option LWS_WITH_DETAILED_LATENCY, allowing lws to collect very detailed
information on every read and write, and allow the user code to provide
a callback to process events.
2019-09-22 03:06:59 -07:00

3.3 KiB

lws detailed latency

lws detailed latency example plot

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