diff options
| author | Aleksandr Nogikh <nogikh@google.com> | 2021-11-08 14:27:27 +0000 |
|---|---|---|
| committer | Aleksandr Nogikh <wp32pw@gmail.com> | 2021-11-12 16:33:43 +0100 |
| commit | ff9c21207933c156af783fb8be0e27aad415c4b5 (patch) | |
| tree | 0c5ef494933d3393abb5c6a4626ac2f4bf664f2e | |
| parent | 563abfc7520395a8e71e91df1cbdb401ffad77e0 (diff) | |
docs: update the information about syz-testbed
| -rw-r--r-- | docs/syz_testbed.md | 104 |
1 files changed, 65 insertions, 39 deletions
diff --git a/docs/syz_testbed.md b/docs/syz_testbed.md index 9020effff..e900e48d5 100644 --- a/docs/syz_testbed.md +++ b/docs/syz_testbed.md @@ -1,34 +1,34 @@ # syz-testbed -`syz-testbed` is the tool that simplifies the process of evaluating the effect -the performance of different syzkaller versions (or configurations) against each +`syz-testbed` is the tool that simplifies the process of evaluating the +performance of different syzkaller versions (or configurations) against each other. The tool automates checking out syzkaller repos, building them, running `syz-manager`s and collecting/summarizing their results. ## Configuring syz-testbed -`syz-testbed` takes a JSON config file as its input. An example of such a file: +`syz-testbed` requires a JSON config file. An example of such a file: ```json { "workdir": "/tmp/syz-testbed-workdir/", "corpus": "/tmp/corpus.db", + "max_instances": 5, + "run_time": "24h", + "http": "0.0.0.0:50000", "checkouts": [ { "name": "first", "repo": "https://github.com/google/syzkaller.git", - "count": 2 }, { "name": "second", "repo": "https://github.com/google/syzkaller.git", "branch": "some-dev-branch", - "count": 2 } ], "manager_config": { "target": "linux/amd64", - "http": "0.0.0.0:50000", "kernel_obj": "/tmp/linux-stable", "image": "/tmp/kernel-image/stretch.img", "sshkey": "/tmp/kernel-image/stretch.id_rsa", @@ -44,60 +44,86 @@ other. The tool automates checking out syzkaller repos, building them, running } ``` -When run with such a configuration file, `syz-testbed` will do the following: +Given such a configuration file, `syz-testbed` will do the following: 1. Check out the `master` branch of `https://github.com/google/syzkaller.git` - into `/tmp/workdir/checkouts/first/`. - 2. Generate two independent config files for that syzkaller. They will have - separate `workdir`'s (`/tmp/syz-testbed-workdir/checkouts/first/workdir_1/` - and ``/tmp/syz-testbed-workdir/checkouts/first/workdir_2`), separate names - (`first-1` and `first-2`) and separate ports (50000 and - 50001). `/tmp/corpus.db` is copied into each of the work directories and will - be used by `syz-manager`s as the initial corpus. -3. Build syzkaller at `/tmp/syz-testbed-workdir/first/`. -4. Check out the `some-dev-branch` of - `https://github.com/google/syzkaller.git` into - `/tmp/syz-testbed-workdir/second/`. -5. Do the same as was done in the steps 2 and 3, but for the `second` folder. -6. The resulting directory structure looks as follows + into `/tmp/syz-testbed-workdir/checkouts/first/` and build it. +2. Check out the `some-dev-branch` of `https://github.com/google/syzkaller.git` + into `/tmp/syz-testbed-workdir/checkouts/second/` and build it. +3. Set up and run 3 instances of `first` and 2 instances of `second` +(`max_instances = 5`). +The directory structure looks as follows: ``` /tmp/syz-testbed-workdir/ └── checkouts ├── first <...> + │ ├── syz_0.cnf │ ├── syz_1.cnf - │ ├── syz_2.cnf + │ ├── syz_4.cnf <...> + │ ├── workdir_0 │ ├── workdir_1 - │ └── workdir_2 + │ └── workdir_4 └── second <...> - ├── syz_1.cnf ├── syz_2.cnf + ├── syz_3.cnf <...> - ├── workdir_1 - └── workdir_2 + ├── workdir_2 + └── workdir_3 ``` +4. After 24 hours (as `run_hours` is 24), stop those 5 instances. +5. Create and run 2 instances of `first` and 3 instances of `second`. +6. <Repeat those steps over and over> -7. Finally `syz-testbed` runs all the `syz-manager` instances it has - prepared. The config file above results in 4 instances: 2 belonging the - `first` checkout and 2 belonging to the `second` one. +The tool stops after receiving a SIGINT (e.g. after Ctrl+C) or a SIGTERM +signal. Also, if one of the instances has exited due to some error, this also +stops the whole experiment. -Right after the 7th step `syz-testbed` begins to collect and aggregate the data -from the running syzkaller instances. +## Web interface + +The tool has a simple web interface that displays the current information about +the experiment (the number of active and finished instances, the time until +instances are stopped, etc.) and the latest statistics collected from the +`syz-manager`s. + +If the `benchmp` parameter points to the `syz-benchcmp` executable, then the web +interface can also generate graphs of various parameters over time or the number +of executions. + +In order to enable the interface, set the `http` parameter to the IP address and +port to which `syz-testbed` should bind. E.g. `"http": "0.0.0.0:50000"`. + +## Statistics + +`syz-testbed` provides two "views" of the statistics: +1. `complete` - only includes data from the finished instances (i.e. those that + have been running for `run_hours`). +2. `all` - also includes the data from the currently active instances. The + statistics from the finished instances is winded back to match the current + uptime of the active instances. + +Therefore, the statistics is laid out the following way. ```bash $ tree -L 2 /tmp/syz-testbed-workdir/ /tmp/syz-testbed-workdir/ -├── benches -│ ├── avg_first.txt -│ └── avg_second.txt -├── bugs.csv -├── checkouts -│ ├── first -│ └── second -├── checkout_stats.csv -└── instance_stats.csv +├── stats_all +│ ├── benches +│ │ ├── avg_first.txt +│ │ ├── avg_second.txt +│ ├── bugs.csv +│ ├── checkout_stats.csv +│ └── instance_stats.csv +├── stats_completed +│ ├── benches +│ │ ├── avg_first.txt +│ │ ├── avg_second.txt +│ ├── bugs.csv +│ ├── checkout_stats.csv +│ └── instance_stats.csv +└── testbed.csv ``` 1. `bugs.csv` contains all the bugs found by the running instances. If a single |
