For design of the tests, see https://grpc.io/docs/guides/benchmarking.html.
In general the benchmark workers and driver build scripts expect linux_performance_worker_init.sh to have been ran already.
The run_performance_test.py top-level runner script can also be used with remote machines, but for e.g., profiling the server, it might be useful to run workers manually.
You'll need a "driver" and separate "worker" machines. For example, you might use one GCE "driver" machine and 3 other GCE "worker" machines that are in the same zone.
Connect to each worker machine and start up a benchmark worker with a "driver_port".
$ cd <grpc_repo_root> $ tools/run_tests/performance/build_performance.sh $ tools/run_tests/performance/run_worker_<language>.sh
$ cd <grpc-java-repo> $ ./gradlew -PskipCodegen=true :grpc-benchmarks:installDist $ benchmarks/build/install/grpc-benchmarks/bin/benchmark_worker --driver_port <driver_port>
$ cd <grpc-go-repo>/benchmark/worker && go install $ # if profiling, it might be helpful to turn off inlining by building with "-gcflags=-l" $ $GOPATH/bin/worker --driver_port <driver_port>
$ tools/run_tests/performance/build_performance.sh
Get the 'scenario_json' relevant for the scenario to run. Note that "scenario json" configs are generated from scenario_config.py. The driver takes a list of these configs as a json string of the form: {scenario: <json_list_of_scenarios> }
in its --scenarios_json
command argument. One quick way to get a valid json string to pass to the driver is by running the run_performance_tests.py locally and copying the logged scenario json command arg.
From the grpc repo root:
QPS_WORKERS
environment variable to a comma separated list of worker machines. Note that the driver will start the "benchmark server" on the first entry in the list, and the rest will be told to run as clients against the benchmark server.Example running and profiling of go benchmark server:
$ export QPS_WORKERS=<host1>:<10000>,<host2>,10000,<host3>:10000 $ bins/opt/qps_json_driver --scenario_json='<scenario_json_scenario_config_string>'
While running the benchmark, a profiler can be attached to the server.
Example to count syscalls in grpc-go server during a benchmark:
$ netstat -tulpn | grep <driver_port> # to get pid of worker $ perf stat -p <worker_pid> -e syscalls:sys_enter_write # stop after test complete
Example memory profile of grpc-go server, with go tools pprof
:
$ go tool pprof --text --alloc_space http://localhost:<pprof_port>/debug/heap