A powerful & high-performance http load tester
Switch branches/tags
Nothing to show
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Failed to load latest commit information.
.gitattributes
.gitignore
.sniperc
README.md
README_CN.md
config.go
const.go
dygraph.js.go
global.go
http.go
manage.go
sniper.go
socket.go
work.go

README.md

Sniper

Sniper is a powerful and high-performance http load tester writing in Golang. Basing on advantage of goroutine,achieving high concurrency,low memory,rich graphics display.

Notice: This project is on pre-alpha stage !

Try it

Pre-compiled executables

Features

  • GET / POST
  • Keep-alive
  • Https
  • Graphics display result
  • Multi-target
  • Large file support
  • Cross-platform——Linux,FreeBSD,Darwin

Compare

tool language keep-alive https multi-target result-show proxy
ab c NO YES NO html,standard output YES
siege c YES YES YES csv,standard output YES
http_load c NO YES YES standard output YES
webbench c NO YES NO standard output YES
sniper go YES YES YES js+html5,standard output NO

Performance

  • Memory usage less than Apache Benchmark(ab)
  • Execution speed close to ab
  • Large file support

Alt text

Graphics display

  • Analyse each request and record it
  • Output http connect time
  • Output server processing time
  • Output total time

Basing on dygraphs and html5,show the detail of server's performance. Get 1000 samples from whole result,show the details of connect,processing,and server's response.

The chart below show the total time and connect time. Wait,how can golang get the connect time ? In a word,Sniper implements part of HTTP protocol stack, discard net/http package to get the details. Also improve the performance.

Alt text

Usage manual

1. install Golang

Please reference Go install chapter of open-source Golang book "build-web-application-with-golang".

2. install Sniper

$ go get github.com/lubia/sniper
$ go install github.com/lubia/sniper
$ cp src/github.com/lubia/sniper/.sniperc ~

3. Parameter declaration

Example

GET

$sniper -c 10 -n 100 http://www.google.com

POST

$sniper -c 10 -n 100 -p postData.txt http://www.google.com

Parameter

Command line parameter
Usage:
   sniper [options] http[s]://hostname[:port][/path]                 http or https,ip or domain support
   sniper [options] -f urls.txt                                      multi-target,format:each url per line
Options:
   -c, --concurrent     concurrent users, default is 1.              
   -n, --requests       number of requests to perform.               
   -r, --repetitions    number of times to run the test.             
   -t, --time           testing time, 30 mean 30 seconds.            
   -R, --sniperc        specify an sniperc file to get config        
                        (default is $HOME/.sniperc).               
   -f, --urlfile        select a specific URLS file.                 
   -p, --post           select a specific file to POST.              
   -T, --content-type   set Content-Type in request                  
                        (default is text/plain).
   -V, --Version        print the version number.                    
   -h, --help           print this section.                          
   -C, --config         show the current config.                     
   -s, --plot           plot detail transactions' info               
                        (true | false,default set true,              
                        notice: set -t will not plot anyhow).

Config file parameter
Notice:default get config file from $HOME/.sniperc,config file and command line parameter complement each other. CMD -R to specified config file, CMD -C to get default configuration.  
[protocol]
version = HTTP/1.1                            
#connection = keep-alive                      # to comment
connection = close
accept-encoding = gzip                        
user-agent = golang & sniper                  

[header]
#cookie = SSID=Abh_TYcDc6YSQh-GB              user-defined header

[process]
timeout = 30                                  socket timeout
failures = 64                                 max failure,socket failure over it then application break

[Authenticate]
login = jeff:supersecret                      HTTP Authenticate

[ssl]
ssl-cert = /root/cert.pem                     ssl-cert file
ssl-key = /root/key.pem                       ssl-key file
ssl-timeout = 30                              https timeout
Output

chart output to current directory "plot.html"

Transactions:                   1000 hits           total requests
Availability:                   100.00 %            percentage completion    
Elapsed time:                   0.15 secs           sniper elapsed time
Document length:               1162 Bytes           single response length
TotalTransfer:                  1.11 MB             total data transfer
Transaction rate:            6625.60 trans/sec      transactions per second
Throughput:                     7.34 MB/sec         throughput
Successful:                     1000 hits           result code not 200 also successful
Failed:                           0 hits            socket errors
TransactionTime:               1.495 ms(mean)       each request total time (average)
ConnectionTime:                0.596 ms(mean)       connect time(average,tcp handshake)
ProcessTime:                   0.900 ms(mean)       TransactionTime = ConnectionTime + ProcessTime
StateCode:                    1000(code 200)        the number of result code is 200

About

Twin projects

Author

Blog:Programer

Contact:yanyuan2046 at 126.com

Licence

Apache License, Version 2.0.

中文文档