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