• Stars
    star
    1,293
  • Rank 36,391 (Top 0.8 %)
  • Language
    JavaScript
  • License
    MIT License
  • Created over 11 years ago
  • Updated about 4 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

The WebSocket god of thunder

Thor

Thor is WebSocket benchmarking/load generator. There are a lot of benchmarking tools for HTTP servers. You've got ab, siege, wrk and more. But all these tools only work with plain ol HTTP and have no support for WebSockets - even if they did they wouldn't be suitable, as they would be testing short running HTTP requests instead of long running HTTP requests with a lot of messaging traffic. Thor fixes all of this.

Dependencies

Thor requires Node.js to be installed on your system. If you don't have Node.js installed you can download it from http://nodejs.org or build it from the github source repository: http://github.com/joyent/node.

Once you have Node.js installed, you can use the bundled package manager npm to install this module:

npm install -g thor

The -g command flag tells npm to install the module globally on your system.

Usage

thor [options] <urls>

Thor can hit multiple URL's at once; this is useful if you are testing your reverse proxies, load balancers or just simply multiple applications. The url that you supply to thor should be written in a WebSocket compatible format using the ws or wss protocols:

thor --amount 5000 ws://localhost:8080 wss://localhost:8081

The snippet above will open up 5000 connections against the regular ws://localhost:8080 and also 5000 connections against the secured wss://localhost:8081 server, so a total of 10000 connections will be made.

One thing to keep in mind is you probably need to bump the amount of file descriptors on your local machine if you start testing WebSockets. Set the ulimit -n on machine as high as possible. If you do not know how to do this, Google it.

Options

  Usage: thor [options] ws://localhost

  Options:

    -h, --help                      output usage information
    -A, --amount <connections>      the amount of persistent connections to generate
    -C, --concurrent <connections>  how many concurrent-connections per second
    -M, --messages <messages>       messages to be send per connection
    -P, --protocol <protocol>       WebSocket protocol version
    -B, --buffer <size>             size of the messages that are send
    -W, --workers <cpus>            workers to be spawned
    -G, --generator <file>          custom message generators
    -M, --masked                    send the messaged with a mask
    -b, --binary                    send binary messages instead of utf-8
    -V, --version                   output the version number

Some small notes about the options:

  • --protocol is the protocol version number. If you want to use the HyBi drafts 07-12 use 8 as argument or if you want to use the HyBi drafts 13-17 drafts which are the default version use 13.
  • --buffer should be size of the message in bytes.
  • --workers as Node.js is single threaded this sets the amount of sub processes to handle all the heavy lifting.

Custom messages

Some WebSocket servers have their own custom messaging protocol. In order to work with those servers we introduced a concept called generators a generator is a small JavaScript file that can output utf8 and binary messages. It uses a really simple generator by default.

Checkout https://github.com/observing/thor/blob/master/generator.js for an example of a generator.

thor --amount 1000 --generator <file.js> ws://localhost:8080

Example

thor --amount 1000 --messages 100 ws://localhost:8080

This will hit the WebSocket server that runs on localhost:8080 with 1000 connections and sends 100 messages over each established connection. Once thor is done with smashing your connections it will generate a detailed report:

Thor:                                                  version: 1.0.0

God of Thunder, son of Odin and smasher of WebSockets!

Thou shall:
- Spawn 4 workers.
- Create all the concurrent/parallel connections.
- Smash 1000 connections with the mighty Mjölnir.

The answers you seek shall be yours, once I claim what is mine.

Connecting to ws://localhost:8080

  Opened 100 connections
  Opened 200 connections
  Opened 300 connections
  Opened 400 connections
  Opened 500 connections
  Opened 600 connections
  Opened 700 connections
  Opened 800 connections
  Opened 900 connections
  Opened 1000 connections


Online               15000 milliseconds
Time taken           31775 milliseconds
Connected            1000
Disconnected         0
Failed               0
Total transferred    120.46MB
Total received       120.43MB

Durations (ms):

                     min     mean     stddev  median max
Handshaking          217     5036       4094    3902 14451
Latency              0       215         104     205 701

Percentile (ms):

                      50%     66%     75%     80%     90%     95%     98%     98%    100%
Handshaking          3902    6425    8273    9141    11409   12904   13382   13945   14451
Latency              205     246     266     288     371     413     437     443     701

License

MIT

More Repositories

1

pre-commit

Automatically installs a git pre-commit script in your git repository which runs your `npm test` on pre-commit
JavaScript
1,879
star
2

balancerbattle

WebSocket loadbalancer battle
JavaScript
857
star
3

haproxy

HAProxy management and orchestration
JavaScript
198
star
4

square

The last build system you would ever want to use
JavaScript
56
star
5

fullcontact

FullContact API bindings for Node.js
JavaScript
42
star
6

devnull

dev/null, a powerful logging module for Node.js.. Because logging to dev/null is fast! <3
JavaScript
41
star
7

tolkien

Passwords are obsolete - Send one time tokens for authentication instead.
JavaScript
35
star
8

eventreactor

EventEmitters on a syntax suger rush
JavaScript
35
star
9

exception

Better error's for people who run node in production
JavaScript
18
star
10

leverage

Leverage provides awesome (lua) enhancements on top of the regular redis client for Nodejs
JavaScript
16
star
11

kju

fault tolerant queue system for bulk insert management
JavaScript
16
star
12

red

RED a realtime system built upon Node.js and Redis
JavaScript
16
star
13

node-geoip2-api

Node.js API for MaxMind GeoIP2 databases
JavaScript
11
star
14

gatekeeper

gatekeeper
JavaScript
8
star
15

finn

Finn: Helps you explore the dangerous worlds of CSS using pre-processing.
JavaScript
8
star
16

refuse

A set of Components that can be shared between React and React-Native
JavaScript
6
star
17

moduleloadlist

A list of all internal and user defined modules that are loaded/required
JavaScript
5
star
18

fossa

Backbone powered model interface to MongoDB, thin wrapper around MongoJS
JavaScript
5
star
19

initialise

Lazy initialisation / require wrapper. Makes sure you only load the modules once when you need them
JavaScript
4
star
20

mongo-query-filter

Filter operators from MongoDB queries
JavaScript
3
star
21

underverse

Underverse is a small backlog/queue manager that detects when items in your backlog are out of sync
JavaScript
3
star
22

node-geoip2-client

Node.js client for its Restify server counterpart: node-geoip2-api
JavaScript
3
star
23

emeeuw

Sending emeeuws using mandrill has never been easier.
JavaScript
2
star
24

white

whitespace css pre-processor for finn
JavaScript
2
star
25

s.h.i.e.l.d.

Stategic Host Inspection, Extermination, List-Enforcement Division
JavaScript
2
star
26

docker-link

Parser for reading environment variables set by docker link
JavaScript
2
star
27

diffset

Progressively calculate and store the differences between the previous added values.
JavaScript
1
star