2023-06-22 11:54:09 +00:00
# libp2p performance benchmarking
This project includes the following components:
- `terraform/` : a Terraform scripts to provision infrastructure
- `impl/` : implementations of the [libp2p perf protocol ](https://github.com/libp2p/specs/blob/master/perf/perf.md ) running on top of e.g. go-libp2p, rust-libp2p or Go's std-library https stack
- `runner/` : a set of scripts building and running the above implementations on the above infrastructure, reporting the results in `benchmark-results.json`
2023-07-19 16:38:18 +00:00
Benchmark results can be visualized with https://observablehq.com/@libp2p-workspace/performance-dashboard.
2023-06-22 11:54:09 +00:00
2023-06-30 02:25:05 +00:00
## Running via GitHub Action
2023-06-22 11:54:09 +00:00
2023-06-30 02:25:05 +00:00
1. Create a pull request with your changes on https://github.com/libp2p/test-plans/.
2. Trigger GitHub Action for branch on https://github.com/libp2p/test-plans/actions/workflows/perf.yml (see _Run workflow_ button).
3. Wait for action run to finish and to push a commit to your branch.
4. Visualize results on https://observablehq.com/@libp2p-workspace/performance-dashboard.
2023-09-01 17:59:30 +00:00
## Running manually
2023-08-24 06:19:11 +00:00
### Prerequisites
2023-09-01 17:59:30 +00:00
- Terraform 1.5.4 or later
2023-08-24 06:19:11 +00:00
- Node.js 18 or later
- [an AWS IAM user ](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users.html )
2023-06-30 02:25:05 +00:00
### Provision infrastructure
2023-06-22 11:54:09 +00:00
1. Save your public SSH key as the file `./terraform/modules/short_lived/files/perf.pub` ; or generate a new key pair with `make ssh-keygen` and add it to your SSH agent with `make ssh-add` .
2. `cd terraform/configs/local`
3. `terraform init`
4. `terraform apply`
5. `CLIENT_IP=$(terraform output -raw client_ip)`
6. `SERVER_IP=$(terraform output -raw server_ip)`
2023-08-24 06:19:11 +00:00
**Notes**
- While running terraform you may encounter the following error:
```bash
Error: collecting instance settings: reading EC2 Launch Template versions: couldn't find resource
│
│ with module.short_lived_server[0].aws_instance.perf,
│ on ../../modules/short_lived/main.tf line 15, in resource "aws_instance" "perf":
│ 15: resource "aws_instance" "perf" {
```
2023-09-01 17:59:30 +00:00
- This implies that you haven't deployed the long-lived infrastructure on your AWS account. To do so along with each short-lived deployment, you can set *TF_VAR* [`long_lived_enabled` ](./terraform/configs/local/terraform.tf#L42 ) env variable to default to `true` . Terraform should then spin up the long-lived resources that are required for the short-lived resources to be created.
2023-08-24 06:19:11 +00:00
- It's best to destroy the infrastructure after you're done with your testing, you can do that by running `terraform destroy` .
### Build and run libp2p implementations
2023-06-22 11:54:09 +00:00
2023-08-24 06:19:11 +00:00
Given you have provisioned your infrastructure, you can now build and run the libp2p implementations on the AWS instances.
2023-06-22 11:54:09 +00:00
1. `cd runner`
2. `npm ci`
2023-09-14 16:49:46 +00:00
3. `npm run start -- --client-public-ip $CLIENT_IP --server-public-ip $SERVER_IP`
2023-08-24 06:19:11 +00:00
* Note: The default number of iterations that perf will run is 10; desired iterations can be set with the `--iterations <value>` option.
2023-06-22 11:54:09 +00:00
2023-06-30 02:25:05 +00:00
### Deprovision infrastructure
2023-06-22 11:54:09 +00:00
1. `cd terraform/configs/local`
2. `terraform destroy`
2023-07-26 16:41:49 +00:00
## Adding a new implementation or a new version
2023-06-22 11:54:09 +00:00
2023-08-24 06:19:11 +00:00
1. Add the implementation to new subdirectory in [`impl/*` ](./impl/ ).
- For a new implementation, create a folder `impl/<your-implementation-name>/` e.g. `go-libp2p`
2023-07-26 16:41:49 +00:00
- For a new version of an existing implementation, create a folder `impl/<your-implementation-name>/<your-implementation-version>` .
- In that folder include a `Makefile` that builds an executable and stores it next to the `Makefile` under the name `perf` .
- Requirements for the executable:
2023-08-24 06:19:11 +00:00
- Running as a libp2p-perf server:
- The perf server must not exit as it will be closed by the test runner.
- The executable must accept the command flag `--run-server` which indicates it's running as server.
2023-07-26 16:41:49 +00:00
- Running as a libp2p-perf client
2023-08-24 06:19:11 +00:00
- Given that perf is a client driven set of benchmarks, the performance will be measured by the client.
2023-07-26 16:41:49 +00:00
- Input via command line
2023-08-24 06:19:11 +00:00
- `--server-address`
- `--transport` (see [`runner/versions.ts` ](./runner/src/versions.ts#L7-L43 ) for possible variants)
2023-07-26 16:41:49 +00:00
- `--upload-bytes` number of bytes to upload per stream.
- `--download-bytes` number of bytes to download per stream.
- Output
2023-08-24 06:19:11 +00:00
- Logging MUST go to `stderr` .
2023-09-01 17:59:30 +00:00
- Measurement output is printed to `stdout` as JSON in the form of:
2023-07-26 16:41:49 +00:00
```json
{"latency": 0.246442851}
```
Note that the measurement includes the time to (1) establish the
connection, (2) upload the bytes and (3) download the bytes.
2023-08-24 06:19:11 +00:00
2. For a new implementation, in [`impl/Makefile` include your implementation in the `all` target. ](./impl/Makefile#L7 )
3. For a new version, reference version in [`runner/src/versions.ts` ](./runner/src/versions.ts#L7-L43 ).