| 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 avarage 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 | |