125 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			125 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
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
 | 
						|
 |