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