|
// retoor <retoor@molodetz.nl>
|
|
|
|
import "websocket" for WebSocket
|
|
import "io" for Stdout
|
|
|
|
var host = "ws://127.0.0.1:8080"
|
|
var totalMessages = 50000
|
|
var warmupMessages = 100
|
|
|
|
System.print("=== WebSocket Extreme Load Test ===")
|
|
System.print("Target: %(host)")
|
|
System.print("Messages: %(totalMessages) (warmup: %(warmupMessages))")
|
|
System.print("")
|
|
Stdout.flush()
|
|
|
|
var ws = WebSocket.connect(host)
|
|
System.print("Connected")
|
|
Stdout.flush()
|
|
|
|
var i = 0
|
|
while (i < warmupMessages) {
|
|
ws.send("warmup%(i)")
|
|
ws.receive()
|
|
i = i + 1
|
|
}
|
|
System.print("Warmup complete")
|
|
Stdout.flush()
|
|
|
|
var errors = 0
|
|
var minTime = 999999
|
|
var maxTime = 0
|
|
var totalTime = 0
|
|
var times = []
|
|
|
|
var startTime = System.clock
|
|
|
|
i = 0
|
|
while (i < totalMessages) {
|
|
var msgStart = System.clock
|
|
ws.send("msg%(i)")
|
|
var response = ws.receive()
|
|
var msgEnd = System.clock
|
|
var elapsed = msgEnd - msgStart
|
|
|
|
if (response == null || !response.isText) {
|
|
errors = errors + 1
|
|
} else {
|
|
times.add(elapsed)
|
|
totalTime = totalTime + elapsed
|
|
if (elapsed < minTime) minTime = elapsed
|
|
if (elapsed > maxTime) maxTime = elapsed
|
|
}
|
|
|
|
if (i > 0 && i % 2000 == 0) {
|
|
var progress = (i * 100 / totalMessages).floor
|
|
var currentRate = i / (System.clock - startTime)
|
|
System.print(" Progress: %(progress) percent (%(currentRate.floor) msg/sec)")
|
|
Stdout.flush()
|
|
}
|
|
|
|
i = i + 1
|
|
}
|
|
|
|
var endTime = System.clock
|
|
var totalElapsed = endTime - startTime
|
|
|
|
ws.close()
|
|
|
|
times.sort()
|
|
var p50 = times[(times.count * 0.5).floor]
|
|
var p90 = times[(times.count * 0.9).floor]
|
|
var p95 = times[(times.count * 0.95).floor]
|
|
var p99 = times[(times.count * 0.99).floor]
|
|
var avgTime = totalTime / times.count
|
|
|
|
System.print("")
|
|
System.print("=== Results ===")
|
|
System.print("Total messages: %(totalMessages)")
|
|
System.print("Errors: %(errors)")
|
|
System.print("Total time: %(totalElapsed)s")
|
|
System.print("Throughput: %((totalMessages / totalElapsed).floor) msg/sec")
|
|
System.print("")
|
|
System.print("=== Latency (per message round-trip) ===")
|
|
System.print("Min: %((minTime * 1000000).floor) us")
|
|
System.print("Max: %((maxTime * 1000000).floor) us")
|
|
System.print("Avg: %((avgTime * 1000000).floor) us")
|
|
System.print("P50: %((p50 * 1000000).floor) us")
|
|
System.print("P90: %((p90 * 1000000).floor) us")
|
|
System.print("P95: %((p95 * 1000000).floor) us")
|
|
System.print("P99: %((p99 * 1000000).floor) us")
|
|
Stdout.flush()
|