mirror of https://github.com/Qortal/Brooklyn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
124 lines
4.6 KiB
124 lines
4.6 KiB
This is cpufreq-bench, a microbenchmark for the cpufreq framework. |
|
|
|
Purpose |
|
======= |
|
|
|
What is this benchmark for: |
|
- Identify worst case performance loss when doing dynamic frequency |
|
scaling using Linux kernel governors |
|
- Identify average reaction time of a governor to CPU load changes |
|
- (Stress) Testing whether a cpufreq low level driver or governor works |
|
as expected |
|
- Identify cpufreq related performance regressions between kernels |
|
- Possibly Real time priority testing? -> what happens if there are |
|
processes with a higher prio than the governor's kernel thread |
|
- ... |
|
|
|
What this benchmark does *not* cover: |
|
- Power saving related regressions (In fact as better the performance |
|
throughput is, the worse the power savings will be, but the first should |
|
mostly count more...) |
|
- Real world (workloads) |
|
|
|
|
|
Description |
|
=========== |
|
|
|
cpufreq-bench helps to test the condition of a given cpufreq governor. |
|
For that purpose, it compares the performance governor to a configured |
|
powersave module. |
|
|
|
|
|
How it works |
|
============ |
|
You can specify load (100% CPU load) and sleep (0% CPU load) times in us which |
|
will be run X time in a row (cycles): |
|
|
|
sleep=25000 |
|
load=25000 |
|
cycles=20 |
|
|
|
This part of the configuration file will create 25ms load/sleep turns, |
|
repeated 20 times. |
|
|
|
Adding this: |
|
sleep_step=25000 |
|
load_step=25000 |
|
rounds=5 |
|
Will increase load and sleep time by 25ms 5 times. |
|
Together you get following test: |
|
25ms load/sleep time repeated 20 times (cycles). |
|
50ms load/sleep time repeated 20 times (cycles). |
|
.. |
|
100ms load/sleep time repeated 20 times (cycles). |
|
|
|
First it is calibrated how long a specific CPU intensive calculation |
|
takes on this machine and needs to be run in a loop using the performance |
|
governor. |
|
Then the above test runs are processed using the performance governor |
|
and the governor to test. The time the calculation really needed |
|
with the dynamic freq scaling governor is compared with the time needed |
|
on full performance and you get the overall performance loss. |
|
|
|
|
|
Example of expected results with ondemand governor: |
|
|
|
This shows expected results of the first two test run rounds from |
|
above config, you there have: |
|
|
|
100% CPU load (load) | 0 % CPU load (sleep) | round |
|
25 ms | 25 ms | 1 |
|
50 ms | 50 ms | 2 |
|
|
|
For example if ondemand governor is configured to have a 50ms |
|
sampling rate you get: |
|
|
|
In round 1, ondemand should have rather static 50% load and probably |
|
won't ever switch up (as long as up_threshold is above). |
|
|
|
In round 2, if the ondemand sampling times exactly match the load/sleep |
|
trigger of the cpufreq-bench, you will see no performance loss (compare with |
|
below possible ondemand sample kick ins (1)): |
|
|
|
But if ondemand always kicks in in the middle of the load sleep cycles, it |
|
will always see 50% loads and you get worst performance impact never |
|
switching up (compare with below possible ondemand sample kick ins (2)):: |
|
|
|
50 50 50 50ms ->time |
|
load -----| |-----| |-----| |-----| |
|
| | | | | | | |
|
sleep |-----| |-----| |-----| |---- |
|
|-----|-----|-----|-----|-----|-----|-----|---- ondemand sampling (1) |
|
100 0 100 0 100 0 100 load seen by ondemand(%) |
|
|-----|-----|-----|-----|-----|-----|-----|-- ondemand sampling (2) |
|
50 50 50 50 50 50 50 load seen by ondemand(%) |
|
|
|
You can easily test all kind of load/sleep times and check whether your |
|
governor in average behaves as expected. |
|
|
|
|
|
ToDo |
|
==== |
|
|
|
Provide a gnuplot utility script for easy generation of plots to present |
|
the outcome nicely. |
|
|
|
|
|
cpufreq-bench Command Usage |
|
=========================== |
|
-l, --load=<long int> initial load time in us |
|
-s, --sleep=<long int> initial sleep time in us |
|
-x, --load-step=<long int> time to be added to load time, in us |
|
-y, --sleep-step=<long int> time to be added to sleep time, in us |
|
-c, --cpu=<unsigned int> CPU Number to use, starting at 0 |
|
-p, --prio=<priority> scheduler priority, HIGH, LOW or DEFAULT |
|
-g, --governor=<governor> cpufreq governor to test |
|
-n, --cycles=<int> load/sleep cycles to get an average value to compare |
|
-r, --rounds<int> load/sleep rounds |
|
-f, --file=<configfile> config file to use |
|
-o, --output=<dir> output dir, must exist |
|
-v, --verbose verbose output on/off |
|
|
|
Due to the high priority, the application may not be responsible for some time. |
|
After the benchmark, the logfile is saved in OUTPUTDIR/benchmark_TIMESTAMP.log |
|
|
|
|