# Benchmark gRPC-Go comes with a set of benchmarking utilities to measure performance. These utilities can be found in the `benchmark` directory within the project's root directory. The main utility, aptly named `benchmain`, supports a host of configurable parameters to simulate various environments and workloads. For example, if your server's workload is primarily streaming RPCs with large messages with compression turned on, invoking `benchmain` in the following way may closely simulate your application: ```bash $ go run google.golang.org/grpc/benchmark/benchmain/main.go \ -workloads=streaming \ -reqSizeBytes=1024 \ -respSizeBytes=1024 \ -compression=gzip ``` Pass the `-h` flag to the `benchmain` utility to see other flags and workloads that are supported. ## Varying Payload Sizes (Weighted Random Distribution) The `benchmain` utility supports two flags, `-reqPayloadCurveFiles` and `-respPayloadCurveFiles`, that can be used to specify a histograms representing a weighted random distribution of request and response payload sizes, respectively. This is useful to simulate workloads with arbitrary payload sizes. The options takes a comma-separated list of file paths as value. Each file must be a valid CSV file with three columns in each row. Each row represents a range of payload sizes (first two columns) and the weight associated with that range (third column). For example, consider the below file: ```csv 1,32,12.5 128,256,12.5 1024,2048,25.0 ``` Assume that `benchmain` is invoked like so: ```bash $ go run google.golang.org/grpc/benchmark/benchmain/main.go \ -workloads=unary \ -reqPayloadCurveFiles=/path/to/csv \ -respPayloadCurveFiles=/path/to/csv ``` This tells the `benchmain` utility to generate unary RPC requests with a 25% probability of payload sizes in the ranges 1-32 bytes, 25% probability in the 128-256 bytes range, and 50% probability in the 1024-2048 bytes range. RPC requests outside these ranges will not be generated. You may specify multiple CSV files delimited by a comma. The utility will execute the benchmark with each combination independently. That is, the following command will execute four benchmarks: ```bash $ go run google.golang.org/grpc/benchmark/benchmain/main.go \ -workloads=unary \ -reqPayloadCurveFiles=/path/to/csv1,/path/to/csv2 \ -respPayloadCurveFiles=/path/to/csv3,/path/to/csv4 ``` You may also combine `PayloadCurveFiles` with `SizeBytes` options. For example: ``` $ go run google.golang.org/grpc/benchmark/benchmain/main.go \ -workloads=unary \ -reqPayloadCurveFiles=/path/to/csv \ -respSizeBytes=1 ```