qt5base-lts/tests/benchmarks
Jason McDonald e15548d3e4 Fix sanity check of network test server
Some of Qt's autotests depend on access to a test server.  For each test
that used the test server, tests/auto/network-settings.h created a
global object to verify at startup that host lookups to the test server
will succeed (and abort the test otherwise).

There are two problems with that approach:

First, the sanity check happens before main(), and thus before the test
framework has started logging test results.  This means that if the
sanity check aborts the test, the failure message will not be visible in
the test output if logging to a file or will cause the output to be
malformed if logging to the console in XML format.

Second, since Qt 4.7, the host lookup uses a class that connects to the
QCoreApplication instance, which doesn't exist before main(), and this
caused all tests that included network-settings.h to output an error
message from QObject::connect() at the beginning of the test.

Both of these problems are solved by removing the global object from
network-settings.h and instead performing the sanity check in the
initTestCase() function of each test.

Task-number: QTBUG-22876
Change-Id: Id49c1826906327bf571686cc11527f0265e5af44
Reviewed-by: Rohan McGovern <rohan.mcgovern@nokia.com>
2011-11-28 08:13:41 +01:00
..
corelib Compile with non-C++11 compilers 2011-11-14 23:42:17 +01:00
dbus benchmarks: eliminated usage of qttest_p4.prf 2011-10-25 08:42:23 +02:00
gui Don't depend on moc to disable test functions. 2011-11-18 01:51:57 +01:00
network Fix sanity check of network test server 2011-11-28 08:13:41 +01:00
opengl benchmarks: eliminated usage of qttest_p4.prf 2011-10-25 08:42:23 +02:00
plugins/imageformats/jpeg benchmarks: eliminated usage of qttest_p4.prf 2011-10-25 08:42:23 +02:00
sql benchmarks: eliminated usage of qttest_p4.prf 2011-10-25 08:42:23 +02:00
benchmarks.pro test: Leftover for split `qsqlquery' unit and benchmark test 2011-10-25 08:42:23 +02:00
README Initial import from the monolithic Qt. 2011-04-27 12:05:43 +02:00
trusted-benchmarks.pri Initial import from the monolithic Qt. 2011-04-27 12:05:43 +02:00

The most reliable way of running benchmarks is to do it in an otherwise idle
system. On a busy system, the results will vary according to the other tasks
demanding attention in the system.

We have managed to obtain quite reliable results by doing the following on 
Linux (and you need root):

 - switching the scheduler to a Real-Time mode
 - setting the processor affinity to one single processor
 - disabling the other thread of the same core

This should work rather well for CPU-intensive tasks. A task that is in Real-
Time mode will simply not be preempted by the OS. But if you make OS syscalls, 
especially I/O ones, your task will be de-scheduled. Note that this includes 
page faults, so if you can, make sure your benchmark's warmup code paths touch 
most of the data.

To do this you need a tool called schedtool (package schedtool), from 
http://freequaos.host.sk/schedtool/

From this point on, we are using CPU0 for all tasks:

If you have a Hyperthreaded multi-core processor (Core-i5 and Core-i7), you 
have to disable the other thread of the same core as CPU0. To discover which 
one it is:

$ cat /sys/devices/system/cpu/cpu0/topology/thread_siblings_list

This will print something like 0,4, meaning that CPUs 0 and 4 are sibling 
threads on the same core. So we'll turn CPU 4 off:

(as root)
# echo 0 > /sys/devices/system/cpu/cpu4/online

To turn it back on, echo 1 into the same file.

To run a task on CPU 0 exclusively, using FIFO RT priority 10, you run the 
following:

(as root)
# schedtool -F -p 10 -a 1 -e ./taskname

For example:
# schedtool -F -p 10 -a 1 -e ./tst_bench_qstring -tickcounter

Warning: if your task livelocks or takes far too long to complete, your system 
may be unusable for a long time, especially if you don't have other cores to 
run stuff on. To prevent that, run it before schedtool and time it.

You can also limit the CPU time that the task is allowed to take. Run in the 
same shell as you'll run schedtool:

$ ulimit -s 300
To limit to 300 seconds (5 minutes)

If your task runs away, it will get a SIGXCPU after consuming 5 minutes of CPU 
time (5 minutes running at 100%).

If your app is multithreaded, you may want to give it more CPUs, like CPU0 and 
CPU1 with -a 3  (it's a bitmask).

For best results, you should disable ALL other cores and threads of the same 
processor. The new Core-i7 have one processor with 4 cores, 
each core can run 2 threads; the older Mac Pros have two processors with 4 
cores each. So on those Mac Pros, you'd disable cores 1, 2 and 3, while on the 
Core-i7, you'll need to disable all other CPUs.

However, disabling just the sibling thread seems to produce very reliable 
results for me already, with variance often below 0.5% (even though there are 
some measurable spikes).

Other things to try:

Running the benchmark with highest priority, i.e. "sudo nice -19" 
usually produces stable results on some machines. If the benchmark also 
involves displaying something on the screen (on X11), running it with 
"-sync" is a must. Though, in that case the "real" cost is not correct, 
but it is useful to discover regressions.

Also; not many people know about ionice (1)
      ionice - get/set program io scheduling class and priority