TCP stack lock contention with short-lived connections
John-Mark Gurney
jmg at funkthat.com
Thu Mar 6 21:57:46 UTC 2014
Julien Charbon wrote this message on Thu, Feb 27, 2014 at 11:32 +0100:
> Obviously, to mitigate this lock contention there are various solutions:
>
> - Introduce a new time-wait lock as proposed in joined patch
> - Call tcp_tw_2msl_scan() more often in case of high workload
> - Use INP_INFO_TRY_WLOCK() in tcp_tw_2msl_scan() to clean-up time-wait
> objects only when nobody else handles INP_INFO lock
> - Etc.
>
> The strategy being to prioritize packet reception over time-wait
> objects cleaned-up as:
>
> - we hate dropping packet in reception when the bandwidth is far from
> being full
> - the maximum of used time-wait objects is configurable
> (net.inet.tcp.maxtcptw)
> - in case of time-wait objects memory exhaustion, the current behavior
> is already optimal: The oldest time-wait object is recycled and
> directly reused.
>
> We picked the time-wait lock way because it suits well our long-term
> strategy to completely mitigate the INP_INFO lock contention everywhere
> in TCP stack.
>
> Any thoughts on this particular behavior?
One thing that I noticed is that you now lock/unlock the tw and inp lock a
lot... Have you thought about grabing the TW lock once, grabbing some/all
of the ones necessary to process and then process them in a second step?
If the bulk processing is still an issue, then you could process them in
blocks of 50 or so, that way the number of lock/unlock cycles is reduced...
> +/*
> + * Drop a refcount on an tw elevated using tw_pcbref(). If it is
> + * valid, we return with the tw lock held.
> + */
I assume you mean that you return with the tw lock unlocked? at least
that's what the code reads to me...
[...]
> +static int
> +tw_pcbrele(struct tcptw *tw)
> +{
> + TW_WLOCK_ASSERT(V_tw_lock);
> + KASSERT(tw->tw_refcount > 0, ("%s: refcount 0", __func__));
> +
> + if (!refcount_release(&tw->tw_refcount)) {
> + TW_WUNLOCK(V_tw_lock);
> + return (0);
> + }
> +
> + uma_zfree(V_tcptw_zone, tw);
> + TW_WUNLOCK(V_tw_lock);
> + return (1);
> +}
[...]
Otherwise looks like a good patch...
--
John-Mark Gurney Voice: +1 415 225 5579
"All that I will do, has been done, All that I have, has not."
More information about the freebsd-net
mailing list