mirror of
https://git.haproxy.org/git/haproxy.git/
synced 2025-09-22 06:11:32 +02:00
This function's purpose is to wake up either a local or remote task, bypassing the tree-based run queue. It is meant for fast wakeups that are supposed to be equivalent to those used with tasklets, i.e. a task had to pause some processing and can complete (typically a resource becomes available again). In all cases, it's important to keep in mind that the task must have gone through the regular scheduling path before being blocked, otherwise the task priorities would be ignored. The reason for this is that some wakeups are massively inter-thread (e.g. server queues), that these inter-thread wakeups cause a huge contention on the shared runqueue lock. A user reported 47% CPU spent in process_runnable_tasks with only 32 threads and 80k requests in queues. With this mechanism, purely one-to-one wakeups can avoid taking the lock thanks to the mt_list used for the shared tasklet queue. Right now the shared tasklet queue moves everything to the TL_URGENT queue. It's not dramatic but it would seem better to have a new shared list dedicated to tasks, and that would deliver into TL_NORMAL, for an even better fairness. This could be improved in the future.