On Thu, Aug 6, 2020 at 7:24 PM Richard W.M. Jones <rjones@redhat.com> wrote:
>
> On Thu, Aug 06, 2020 at 06:46:06PM +0300, Nir Soffer wrote:
> > Given the poor results, I suspect that that handles created using same
> > connection share a lock. This also makes sense if connection abstract a
> > blocking socket.
>
> Nice theory, but it didn't work. Again more handles = slower,
> broadly speaking:
>
> 16 coroutines, 16 handles:
>
> real 1m36.920s
> user 0m0.112s
> sys 0m1.641s
>
> 8 / 8:
>
> real 1m27.946s
> user 0m0.110s
> sys 0m1.652s
>
> 4 / 4:
>
> real 1m23.027s
> user 0m0.100s
> sys 0m1.600s
>
> 2 / 2:
>
> real 1m6.089s
> user 0m0.102s
> sys 0m1.658s
>
> 1 / 1:
>
> real 1m9.540s
> user 0m0.083s
> sys 0m1.669s
>
> The patch I'm using now is attached.
There are 2 issues:
1. We create the connection and handle with uninitialized memory, and later
with memory used by the previous connection/handle. This may not matter if
the library initializes all fields of the struct, but it is safer
to zero the memory.
2. We create the handlers in request threads, so most likely not in
the same thread.
This may be ok, but risky.
I moved the creation of all connections and handles to populate_pool(), called
from vddk_open(). This may create more connections and handles than needed
if the client does not use multiple inflight requests, but this is not
important now.
The code compiles but I cannot test it. Does it make any difference?
Richard, did you test this?