Commits
Alexey Kuznetsov authored and Konstantin Khorenko committed 55c440bad3d
fuse: scalable queue limiting This is missing element in previous scalability patch. We removes any limits on direct io submitted to cluster there, which is not right thing to do. The problem is not trivial. Experiments show we cannot do _any_ shared spinlock in this path, even empty lock-unlock added there reduces performance twice! So, we have to come with scalable solution not using locks. Several approaches were tried, suggested one looks the best. The idea is to create hash table of counters and wait queues, sending thread mapped to a hash bucket based on its pid. We limit number of pending requests in each bucket by max_background / HASH_SIZE. It works surprizingly well, almost reaches results with unlimited queue. Flaw: in case of small number of threads and large aio queues or when cluster latency is high effective per-thread limit can be too small. If we see a problem we have to come out with some solution, yet it must be free of global locks. I used to insist on this simple axiom, but not very aggessively, because actual observed bad effect was small. Now we see the sutuation when it is really large, 50% of loss, and we cannot unsee this. https://pmc.acronis.work/browse/VSTOR-54040 Signed-off-by: Alexey Kuznetsov <kuznet@acronis.com> Feature: vStorage