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