mirror of
http://git.haproxy.org/git/haproxy.git/
synced 2024-12-16 00:14:31 +00:00
ed72d82827
The purpose is to detect if threads or processes are competing for the same CPU. This can happen when threads are incorrectly bound, or after a reload if the previous process still has an important activity. With threads this situation is problematic because a preempted thread holding a lock will block other ones waiting for this lock to be released. A first attempt consisted in measuring the cumulated lost time more precisely but the system's scheduler is smart enough to try to limit the thread preemption rate by mostly context switching during poll()'s blank periods, so most of the time lost is not seen. In essence this is good because it means a thread is not preempted with a lock held, and even regarding the rendez-vous point it cannot prevent the other ones from making progress. But still it happens tens to hundreds of times per second that a thread might be preempted, so it's still possible to detect that the situation is happening, thus it's interesting to measure and report its frequency. Each time we enter the poller, we check the CPU time spent working and see if we've lost time doing something else. To limit false positives, we're only interested in losses of 500 microseconds or more (i.e. half a clock tick on a 1 kHz system). If so, it indicates that some time was stolen by another thread or process. Note that we purposely store some sub-millisecond counters so that under heavy traffic with a 1 kHz clock, it's still possible to measure something without being subject to the risk of rounding errors (i.e. if exactly 1 ms is stolen it's possible that the time difference could often be slightly lower). This counter of lost CPU time slots time is reported in "show activity" in numbers of milliseconds of CPU lost per second, per 15s, and total over the process' life. By definition, the per-second counter cannot report values larger than 1000 per thread per second and the 15s one will be limited to 15000/s in the worst case, but it's possible that peak values exceed such thresholds after long pauses. |
||
---|---|---|
.. | ||
common | ||
import | ||
proto | ||
types |