cvat/tests/perf/README.md

141 lines
3.0 KiB
Markdown
Raw Normal View History

2025-09-16 01:19:40 +00:00
## Testing Machine Preparation
### Prerequisites
- You must have **root access**.
- It's better to use **Intel** CPUs.
- Tested on Ubuntu/Pop!_OS-based distros with **systemd** and **GRUB or kernelstub**.
### Identify Physical CPU Cores
You need to identify physical **P-cores** (performance cores) and exclude E-cores (efficient) and virtual SMT threads.
To print physical cores only:
```bash
lscpu | grep 'Core(s) per socket\|Socket(s)\|Thread(s) per core'
grep ^processor /proc/cpuinfo
```
### Edit Kernel Boot Parameters
Add the following to GRUB or kernelstub to isolate testing cores and disable
interrupts on them (replace `2-15` with your cores that need to be removed from the scheduler):
```
isolcpus=2-15 nohz_full=2-15 rcu_nocbs=2-15 \
intel_pstate=disable processor.max_cstate=1 idle=poll \
nosoftlockup nmi_watchdog=0 mitigations=off
```
If using GRUB:
Edit:
`sudo nano /etc/default/grub`
Update this line:
`GRUB_CMDLINE_LINUX="isolcpus=2-15 nohz_full=2-15 rcu_nocbs=2-15 ..."`
Then:
```bash
sudo update-grub
sudo reboot
```
If using kernelstub (Pop!_OS):
```bash
sudo kernelstub -a "isolcpus=2-15 nohz_full=2-15 rcu_nocbs=2-15 \
intel_pstate=disable processor.max_cstate=1 idle=poll \
nosoftlockup nmi_watchdog=0 mitigations=off"
sudo reboot
```
After reboot, check:
### Set CPU Frequency Manually
Set governor to performance (replace 2-15 with your cores):
```bash
for cpu in $(seq 2 15); do
echo performance | sudo tee /sys/devices/system/cpu/cpu$cpu/cpufreq/scaling_governor
done
```
Or set fixed frequency:
```bash
for cpu in {2..15}; do
echo 3400000 | sudo tee /sys/devices/system/cpu/cpu$cpu/cpufreq/scaling_max_freq
echo 3400000 | sudo tee /sys/devices/system/cpu/cpu$cpu/cpufreq/scaling_min_freq
done
```
### Set IRQ Affinity (Interrupts)
#### Method 1: Use TUNA (recommended)
This script moves all irqs to 0-1 cores.
```bash
sudo apt install tuna
sudo tuna --irqs=* --cpus=0-1 --move
sudo tuna --show-irqs
```
#### Method 2: Manual IRQ binding
List IRQs:
```bash
cat /proc/interrupts
```
Set affinity (example for IRQ 35):
```bash
echo 3 | sudo tee /proc/irq/35/smp_affinity
```
3 means binary 11 = CPUs 0 and 1.
Repeat for other IRQs.
### Disable ASLR (Optional)
```bash
echo 0 | sudo tee /proc/sys/kernel/randomize_va_space
```
Persist it:
```bash
echo 'kernel.randomize_va_space = 0' | sudo tee -a /etc/sysctl.conf
```
### Disable Hyper-Threading (SMT)
```bash
echo off | sudo tee /sys/devices/system/cpu/smt/control
```
### Docker Compose cpuset Configuration
To assign specific cores to containers, add cpuset to each service in `docker-compose-perf-cpuset.yml`:
```yaml
services:
my_service:
cpuset: "2,4,6,8,10"
```
Repeat for all containers. Reserve cores 01 for the system.
## Perfkit
```bash
cd tests/perf
pip install -e .
```
Check perfkit is installed and can be used:
```bash
perfkit golden show
```
To record a baseline:
```bash
perfkit run-golden --runs 1 tests/regression/tasks.js
```
To run regression test:
```bash
perfkit run-regression --commit <commit-id> tests/regression/tasks.js
```