mirror of
https://git.haproxy.org/git/haproxy.git/
synced 2026-02-28 20:51:14 +01:00
Tests with forced wakeups on a 24c/48t machine showed that we're caping at 7.3M loops/s, which means 6.6 microseconds of loop delay without having anything to do. This is caused by two factors: - the load and update of the now_offset variable - the update of the global_now variable What is happening is that threads are not running within the one- microsecond time precision provided by gettimeofday(), so each thread waking up sees a slightly different date and causes undesired updates to global_now. But worse, these undesired updates mean that we then have to adjust the now_offset to match that, and adds significant noise to this variable, which then needs to be updated upon each call. By only allowing sightly less precision we can completely eliminate that contention. Here we're ignoring the 5 lowest bits of the usec part, meaning that the global_now variable may be off by up to 31 us (16 on avg). The variable is only used to correct the time drift some threads might be observing in environments where CPU clocks are not synchronized, and it's used by freq counters. In both cases we don't need that level of precision and even one millisecond would be pretty fine. We're just 30 times better at almost no cost since the global_now and now_offset variables now only need to be updated 30000 times a second in the worst case, which is unnoticeable. After this change, the wakeup rate jumped from 7.3M/s to 66M/s, meaning that the loop delay went from 6.6us to 0.73us, that's a 9x improvement when under load! With real tasks we're seeing a boost from 28M to 52M wakeups/s. The clock_update_global_date() function now only takes 1.6%, it's good enough so that we don't need to go further.
The HAProxy documentation has been split into a number of different files for ease of use. Please refer to the following files depending on what you're looking for : - INSTALL for instructions on how to build and install HAProxy - BRANCHES to understand the project's life cycle and what version to use - LICENSE for the project's license - CONTRIBUTING for the process to follow to submit contributions The more detailed documentation is located into the doc/ directory : - doc/intro.txt for a quick introduction on HAProxy - doc/configuration.txt for the configuration's reference manual - doc/lua.txt for the Lua's reference manual - doc/SPOE.txt for how to use the SPOE engine - doc/network-namespaces.txt for how to use network namespaces under Linux - doc/management.txt for the management guide - doc/regression-testing.txt for how to use the regression testing suite - doc/peers.txt for the peers protocol reference - doc/coding-style.txt for how to adopt HAProxy's coding style - doc/internals for developer-specific documentation (not all up to date)
Description
Languages
C
98.1%
Shell
0.9%
Makefile
0.5%
Lua
0.2%
Python
0.1%