- experimental support of HTTP/3 using quic-go ( see HTTP/3 section )
- internal optimization to buffer sizes and http/2 issues (tracking various Go HTTP/2 performance issue being addressed by the Go team)
- using Go 1.19.
nspeed -version
now also displays the Go version used to build the binary as well as OS/Arch informations - new
-pre duration
option: waitduration
before starting command(s) (duration
uses Go syntax: "2s" for 2 seconds for instance) - new
-post duration
option: waitduration
after all commands have ended - new
-info
flag to display some os/hardware informations. - new
-text filename
flag: report the results to a text file (use-
for stdout which is the default) - new
-html filename
flag: record the results to an interactive html file (this flag triggers-pre t*2
and-post t*2
flagst
is the-tick
progress interval (default is 1 second)) - new
-trace
flag: display lot of debug/trace informations (wip - mainly used for quic/http3 tracing) - switch to psutil v3
- fix global timeout
- new endpoints:
/stats/info
and/stats/mem
, see API.md - new flags:
-stats
,-statsonly
and-statsdebug
: enable real time web UI stats view at/rl
url path.statsonly
disable all other api routes.statsdebug
adds Go runtime specifics stats at url path:/debug/statsviz
- new option
-http3
to enable HTTP/3. Implies-self
if no TLS cert & key files are provided.
- breaking change: HTTP client can now do
PUT
orPOST
with corresponding matching command names. A newpost
command was added to do the POST HTTP method and the previouslyput
command does now a 'PUT' method instead of a POST - new option
-http3
to enable HTTP/3 (this will force HTTP/3 if the server support it and fallback to HTTP/2 or HTTP/1.1 if not). Implies-self
if no TLS cert & key files are provided. - console ouput displays news information per job: final target IP, latency and protocol
- default to
https://
if no scheme provided (nspeed get google.com
is the same asnspeed get https://google.com
)
- updated for Go 1.17+ internal changes
- this command can no longer be called with other commands even with itself because of a global side-effect/trick. This command is not available thru the API.
- displays AES hardware support
The implementation used is https://github.com/lucas-clemente/quic-go . In trace mode (-trace
) qlog trace files are generated in the current directory. They can be analized with https://qvis.quictools.info/
- lots of internal refactoring (for the api/ui and a new internal scheduling/cancellation system)
- command names can be shortened as long as it is not ambiguous. For instance
ge
or justg
can be used instead ofget
. - added
l[atency]
andt[raceroute]
command names (placeholder, these commands are not yet implemented) - added
api
command (see below and API.md)
- a new
api
command allowing NSpeed to be controlled by a simple HTTP request (REST). Theapi
command create a new API endpoint with default value (localhost,7333). Theserver
command can also be an API endpoint with the new-api
flag. See API.md for more information about the API. - for now the
api
only return text strings. Later the a standard metrics format will be used.
get
andput
mandatory arguments (-url
and-url
and-size
respectivly) can now be prefixed with a flag keyword allowing to change their order. for instancenspeed get -4 http://google.com
is equivalent tonspeed get -url http://google.com -4
- IP version displayed in text results
api
flag: see theapi
command-dir path
,serve static files from path. path is a local directory to serve content from (from/dir
url ). The max duration parameter applies (-t
) but not the max size parameter (-s
).
- "cypher" spelling replaced with "cipher" everywhere including the
ciphers
command ("cypher" is a minority spelling so less prone to be known or searched for)
- a few typos fixes
- added
-h2c
mode to client & server to allow HTTP/2 Cleartext (H2C)
-http11
flag to force HTTP 1.1 when connecting to HTTP/2 server
- new command
cyphers
to list supported cyphers with that server (will test only TLS 1.2 and 1.3)
- global flags:
-self
: activate self-signed certificate for all clients (get & put)-color
: use colors in output (by default there will be no color at all)-cpu
: display cpu usage (every second).-debug
&-verbose
don't display cpu usage anymore
- news debug metrics:
ReadCount
,WriteCount
(how many OS level Read & Write calls were performed) andAverageReadSize
,AverageWriteSize
(total volume/count) - fix some usage messages
-self
flag: listen in https mode using a self-signed certificate- bigger buffer when sending
- paths in url for upload (
/p
) & download (/g
) removed. just use the root path/
for both (see the updated README.md examples) - download paths can now have an extension. For instance
/10G.iso
. The Content-Type header will be set accordingly to https://golang.org/pkg/mime/#TypeByExtension. - query parameters:
ct
query parameter added: set the returned content-type header, for instance: http://localhost:7333/1k.jpg?ct=text/plain will return a content-type oftext/plain
instead ofimage/jpeg
("ct" has precedence oever the extension. With no precedence orct
parameter, the default content-type isapplication/octet-stream
).chunk_size
query parameter limited to 1 MiB (it's allocated once, this will be tuned later)seed
query parameter removed (this will return later)
- disable compression
- dns report is back in -verbose mode
-self
: same as global '-self' flag
- the self-signed cert only work for 'localhost, 127.0.0.1,::1'. Next vesion will allow test https over a LAN between trusted machines, meanwhile use
-k
flag with nspeed or curl.
#v0.6
- '-a' flag now always prefers IPv6 first
- major overhaul of displayed messages (zerolog package)
- display usage if no argument
- all commands can now be mixed together (*)
- by default now nspeed outputs less messages. "-verbose" displays these messages.new option "-debug" acts like v0.5 "-verbose" option.
- new '-log filename' flag to write result to a structured file (not finalized)
- colorized cpu with the -verbose option
-"-d duration" duration after which the server shutdown (duration must have a unit: s,m or h and or combinaison : 5h20m for instance) -"-n value" number of requests after which the server shutdown
- "-w duration" wait delay before starting the command
(*) The new flags allow to test with a single nspeed command, for instance:
nspeed server -n 2 get -w 1 -n 2 http://localhost:7333/g/1g
This will launch a server and it will answer to 2 requests then stop and a "get" client that will wait 1 second and perform 2 requests to the server.
- better usage help text
- better formatting in verbose mode (-verbose)
- parsed units allow now decimal precision ("2.2g")
- "-h" host option changed to "-a" (since "-h" is standard for help)
- default host is now "localhost"
- "-4" and "-6" options to use IPv4 or IPv6 only (must be consistent with "-a")
- the "-s" option can now parse units of bytes like the client (for instance: "-s 1g" for 1GB, "-s 1G" for 1GiB)
- the "-t" now parse seconds only instead of requiring a unit (consistent with client)
- route '/p' is also accepted instead of redirecting to '/p/'
- added name & version in a http response header
- "-4" and "-6" options are now working
- "-k" option to ignore certificate validation
- "-a host|interface|ip" option
- server: the default host is now 'localhost' which leads to bind only to IPv4 (Go bug: golang/go#9334). A temporary workaround is to launch a second server instance with the -6 flag:
nspeed server server -6
will listen to localhost on IPv4 and IPv6. A fix will be implemented soon. Some OS can fail to resolve 'localhost' to ::1 even if they have IPv6 configured. In that case use "-a ::1" explicitly (nspeed server server -a ::1
) - put: redirect(s) happen after the upload which normal behavior for a HTTP POST.
- performance inconsistencies on Windows
- '-a "" ' doesn't parse on Windows, workaround: use '-a=""'
- server: '-a interface_name' bind to the first candidate address (ipv6/ipv4/link-local) found for that interface. It's not the same behavior as a bind with SO_BINDTODEVICE (which is platform specific).
- client: '-a interface_name' use the first candidate address (ipv6/ipv4/link-local) found for that interface. It doesn't perfom a source address selection depending on the destination.
first alpha
technical preview
technical preview
technical preview