Performance harness
Introduction
Purpose:
Introduce the harness.
What is the harness?
It's a tool that allows running test scenarios against an rchain network.
So, what is the harness?
A grpc client extracted from the rchain project and bridged to gatling (gatling.io).
Where can it be found?
https://github.com/lukasz-golebiewski-org/rchain-perf-harness in the folder templater
It should become part of rchain soon.
How can I use it?
Prerequisite: an rchain network running (e.g. one standalone node).
Three approaches to running the harness:
run it as a test
run it as a standalone application
bypass gatling and run it directly
Ad. 1)
coop.rchain.perf.DeployProposeSimulationThis simulation is configured in templater/runner/test/reources/appliaction.conf
rnodes=["localhost:40401", "127.0.0.1:40401"]sbt runner/gatling:test
Ad. 2)
coop.rchain.perf.ContinuousRunner
This is a typical Main style app. behaves similar to the above simulation but can be run instead of tested.
The params are as follows:
#!/bin/bash
set -axe
java -Dhosts="$1" -Dpath=$2 -Dsessions=$3 -Dratio=$4 -Dloops=$5 -jar ./runner.jar
Ad. 3)
coop.rchain.perf.Runner
object Propose {
def propose(session: Session)(
client: ClientWithDetails): (Session, DeployServiceResponse) = {
(session.remove("client"), client.client.createBlock(Empty()))
}
}
object Deploy {
def deploy(session: Session)(
client: ClientWithDetails): (Session, DeployServiceResponse) = {
val (_, contract): (String, String) = session("contract")
.as[(String, String)]
val d = DeployData()
.withTimestamp(System.currentTimeMillis())
.withTerm(contract)
.withFrom("0x1")
.withPhloLimit(0)
.withPhloPrice(0)
.withNonce(0)
(session.set("client", client), client.client.doDeploy(d))
}
}You can use these in any way.
But I don't have a network!
There a myriad ways of setting up a network:
p2p tool (RNode Integration Testing Tool )
./scripts/p2p-test-tool.py -b -p 5 -i rchain/rnode:devassembly jar
java -jar rnode-assembly-0.6.1.jar run -s --validator-private-key f7a9f1...9 --host localhosta templating tool https://github.com/lukasz-golebiewski-org/rchain-perf-harness/blob/master/init.sh
run
Main(https://github.com/rchain/rchain/blob/dev/node/src/main/scala/coop/rchain/node/Main.scala)use the binary from (https://repo.pyr8.io/rchain/downloads/)
Problems
Dupe Contract
We encountered an issue with the contract:
contract @"dupe"(@depth) = {
if (depth <= 0) { Nil } else { @"dupe"!(depth-1) | @"dupe"!(depth-1) | @"dupe"!(depth-1) | @"dupe"!(depth-1) | @"dupe"!(depth-1) | @"dupe"!(depth-1) | @"dupe"!(depth-1) | @"dupe"!(depth-1) | @"dupe"!(depth-1) | @"dupe"!(depth-1) }
} |
@"dupe"!(5)The scenario was as follows:
10 deploys, 1 propose, 10 threads running "at once", 100 loops. A network of 5 rnodes.
The problem observed was Kamon Http client throwing exceptions. This was most likely due to node running out of memory and becoming unstable.
A good starting point would be to reproduce, make sure it's the heap running out and getting heap dumps.