xref: /openbmc/linux/tools/power/cpupower/bench/README-BENCH (revision f26e8817b235d8764363bffcc9cbfc61867371f2)
17fe2f639SDominik BrodowskiThis is cpufreq-bench, a microbenchmark for the cpufreq framework.
27fe2f639SDominik Brodowski
37fe2f639SDominik BrodowskiPurpose
47fe2f639SDominik Brodowski=======
57fe2f639SDominik Brodowski
67fe2f639SDominik BrodowskiWhat is this benchmark for:
77fe2f639SDominik Brodowski  - Identify worst case performance loss when doing dynamic frequency
87fe2f639SDominik Brodowski    scaling using Linux kernel governors
97fe2f639SDominik Brodowski  - Identify average reaction time of a governor to CPU load changes
107fe2f639SDominik Brodowski  - (Stress) Testing whether a cpufreq low level driver or governor works
117fe2f639SDominik Brodowski    as expected
127fe2f639SDominik Brodowski  - Identify cpufreq related performance regressions between kernels
137fe2f639SDominik Brodowski  - Possibly Real time priority testing? -> what happens if there are
147fe2f639SDominik Brodowski    processes with a higher prio than the governor's kernel thread
157fe2f639SDominik Brodowski  - ...
167fe2f639SDominik Brodowski
177fe2f639SDominik BrodowskiWhat this benchmark does *not* cover:
187fe2f639SDominik Brodowski  - Power saving related regressions (In fact as better the performance
197fe2f639SDominik Brodowski    throughput is, the worse the power savings will be, but the first should
207fe2f639SDominik Brodowski    mostly count more...)
217fe2f639SDominik Brodowski  - Real world (workloads)
227fe2f639SDominik Brodowski
237fe2f639SDominik Brodowski
247fe2f639SDominik BrodowskiDescription
257fe2f639SDominik Brodowski===========
267fe2f639SDominik Brodowski
277fe2f639SDominik Brodowskicpufreq-bench helps to test the condition of a given cpufreq governor.
287fe2f639SDominik BrodowskiFor that purpose, it compares the performance governor to a configured
297fe2f639SDominik Brodowskipowersave module.
307fe2f639SDominik Brodowski
317fe2f639SDominik Brodowski
327fe2f639SDominik BrodowskiHow it works
337fe2f639SDominik Brodowski============
347fe2f639SDominik BrodowskiYou can specify load (100% CPU load) and sleep (0% CPU load) times in us which
357fe2f639SDominik Brodowskiwill be run X time in a row (cycles):
367fe2f639SDominik Brodowski
377fe2f639SDominik Brodowski         sleep=25000
387fe2f639SDominik Brodowski         load=25000
397fe2f639SDominik Brodowski         cycles=20
407fe2f639SDominik Brodowski
417fe2f639SDominik BrodowskiThis part of the configuration file will create 25ms load/sleep turns,
427fe2f639SDominik Brodowskirepeated 20 times.
437fe2f639SDominik Brodowski
447fe2f639SDominik BrodowskiAdding this:
457fe2f639SDominik Brodowski         sleep_step=25000
467fe2f639SDominik Brodowski         load_step=25000
477fe2f639SDominik Brodowski         rounds=5
487fe2f639SDominik BrodowskiWill increase load and sleep time by 25ms 5 times.
497fe2f639SDominik BrodowskiTogether you get following test:
507fe2f639SDominik Brodowski25ms  load/sleep time repeated 20 times (cycles).
517fe2f639SDominik Brodowski50ms  load/sleep time repeated 20 times (cycles).
527fe2f639SDominik Brodowski..
537fe2f639SDominik Brodowski100ms load/sleep time repeated 20 times (cycles).
547fe2f639SDominik Brodowski
557fe2f639SDominik BrodowskiFirst it is calibrated how long a specific CPU intensive calculation
567fe2f639SDominik Brodowskitakes on this machine and needs to be run in a loop using the performance
577fe2f639SDominik Brodowskigovernor.
587fe2f639SDominik BrodowskiThen the above test runs are processed using the performance governor
597fe2f639SDominik Brodowskiand the governor to test. The time the calculation really needed
607fe2f639SDominik Brodowskiwith the dynamic freq scaling governor is compared with the time needed
617fe2f639SDominik Brodowskion full performance and you get the overall performance loss.
627fe2f639SDominik Brodowski
637fe2f639SDominik Brodowski
647fe2f639SDominik BrodowskiExample of expected results with ondemand governor:
657fe2f639SDominik Brodowski
667fe2f639SDominik BrodowskiThis shows expected results of the first two test run rounds from
677fe2f639SDominik Brodowskiabove config, you there have:
687fe2f639SDominik Brodowski
697fe2f639SDominik Brodowski100% CPU load (load) | 0 % CPU load (sleep)  | round
707fe2f639SDominik Brodowski   25 ms             |    25 ms              |   1
717fe2f639SDominik Brodowski   50 ms             |    50 ms              |   2
727fe2f639SDominik Brodowski
737fe2f639SDominik BrodowskiFor example if ondemand governor is configured to have a 50ms
747fe2f639SDominik Brodowskisampling rate you get:
757fe2f639SDominik Brodowski
767fe2f639SDominik BrodowskiIn round 1, ondemand should have rather static 50% load and probably
777fe2f639SDominik Brodowskiwon't ever switch up (as long as up_threshold is above).
787fe2f639SDominik Brodowski
797fe2f639SDominik BrodowskiIn round 2, if the ondemand sampling times exactly match the load/sleep
807fe2f639SDominik Brodowskitrigger of the cpufreq-bench, you will see no performance loss (compare with
817fe2f639SDominik Brodowskibelow possible ondemand sample kick ins (1)):
827fe2f639SDominik Brodowski
837fe2f639SDominik BrodowskiBut if ondemand always kicks in in the middle of the load sleep cycles, it
847fe2f639SDominik Brodowskiwill always see 50% loads and you get worst performance impact never
857fe2f639SDominik Brodowskiswitching up (compare with below possible ondemand sample kick ins (2))::
867fe2f639SDominik Brodowski
877fe2f639SDominik Brodowski      50     50   50   50ms ->time
887fe2f639SDominik Brodowskiload -----|     |-----|     |-----|     |-----|
897fe2f639SDominik Brodowski          |     |     |     |     |     |     |
907fe2f639SDominik Brodowskisleep     |-----|     |-----|     |-----|     |----
917fe2f639SDominik Brodowski    |-----|-----|-----|-----|-----|-----|-----|----  ondemand sampling (1)
927fe2f639SDominik Brodowski         100    0    100    0    100    0    100     load seen by ondemand(%)
937fe2f639SDominik Brodowski       |-----|-----|-----|-----|-----|-----|-----|--   ondemand sampling (2)
947fe2f639SDominik Brodowski      50     50    50    50    50    50    50        load seen by ondemand(%)
957fe2f639SDominik Brodowski
967fe2f639SDominik BrodowskiYou can easily test all kind of load/sleep times and check whether your
977fe2f639SDominik Brodowskigovernor in average behaves as expected.
987fe2f639SDominik Brodowski
997fe2f639SDominik Brodowski
1007fe2f639SDominik BrodowskiToDo
1017fe2f639SDominik Brodowski====
1027fe2f639SDominik Brodowski
1037fe2f639SDominik BrodowskiProvide a gnuplot utility script for easy generation of plots to present
1047fe2f639SDominik Brodowskithe outcome nicely.
1057fe2f639SDominik Brodowski
1067fe2f639SDominik Brodowski
1077fe2f639SDominik Brodowskicpufreq-bench Command Usage
1087fe2f639SDominik Brodowski===========================
1097fe2f639SDominik Brodowski-l, --load=<long int>           initial load time in us
1107fe2f639SDominik Brodowski-s, --sleep=<long int>          initial sleep time in us
1117fe2f639SDominik Brodowski-x, --load-step=<long int>      time to be added to load time, in us
1127fe2f639SDominik Brodowski-y, --sleep-step=<long int>     time to be added to sleep time, in us
1137fe2f639SDominik Brodowski-c, --cpu=<unsigned int>        CPU Number to use, starting at 0
1147fe2f639SDominik Brodowski-p, --prio=<priority>           scheduler priority, HIGH, LOW or DEFAULT
1157fe2f639SDominik Brodowski-g, --governor=<governor>       cpufreq governor to test
116*fe7656a8SColin Ian King-n, --cycles=<int>              load/sleep cycles to get an average value to compare
1177fe2f639SDominik Brodowski-r, --rounds<int>               load/sleep rounds
1187fe2f639SDominik Brodowski-f, --file=<configfile>         config file to use
1197fe2f639SDominik Brodowski-o, --output=<dir>              output dir, must exist
1207fe2f639SDominik Brodowski-v, --verbose                   verbose output on/off
1217fe2f639SDominik Brodowski
1227fe2f639SDominik BrodowskiDue to the high priority, the application may not be responsible for some time.
1237fe2f639SDominik BrodowskiAfter the benchmark, the logfile is saved in OUTPUTDIR/benchmark_TIMESTAMP.log
1247fe2f639SDominik Brodowski
125