netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH net-next 0/3] tcp: add rx/tx cache to reduce lock contention
@ 2019-03-21 22:17 Eric Dumazet
  2019-03-21 22:17 ` [PATCH net-next 1/3] net: convert rps_needed and rfs_needed to new static branch api Eric Dumazet
                   ` (3 more replies)
  0 siblings, 4 replies; 8+ messages in thread
From: Eric Dumazet @ 2019-03-21 22:17 UTC (permalink / raw)
  To: David S . Miller
  Cc: netdev, Eric Dumazet, Soheil Hassas Yeganeh, Willem de Bruijn,
	Florian Westphal, Tom Herbert, Eric Dumazet

On hosts with many cpus we can observe a very verious contention
on spinlocks used in mm slab layer.

The following can happen quite often :

1) TX path
  sendmsg() allocates one (fclone) skb on CPU A, sends a clone.
  ACK is received on CPU B, and consumes the skb that was in the retransmit
  queue.

2) RX path
  network driver alocates skb on CPU C
  recvmsg() happens on CPU D, freeing the skb after it has been delivered
  to user space.

In both cases, we are hitting the asymetric alloc/free pattern
for which slab has to drain alien caches. At 8 Mpps per second,
this represents 16 Mpps alloc/free per second and has a huge penalty.

In an interesting experiment, I tried to use a single kmem_cache for all the skbs
(in skb_init() : skbuff_fclone_cache = skbuff_head_cache =
                  kmem_cache_create("skbuff_fclone_cache", sizeof(struct sk_buff_fclones),);
qnd most of the contention disappeared, since cpus could better use
their local slab per-cpu cache.

But we can do actually better, in the following patches.

TX : at ACK time, no longer free the skb but put it back in a tcp socket cache,
     so that next sendmsg() can reuse it immediately.

RX : at recvmsg() time, do not free the skb but put it in a tcp socket cache
   so that it can be freed by the cpu feeding the incoming packets in BH.

This increased the performance of small RPC benchmark by about 10 % on a host
with 112 hyperthreads.

Eric Dumazet (3):
  net: convert rps_needed and rfs_needed to new static branch api
  tcp: add one skb cache for tx
  tcp: add one skb cache for rx

 include/linux/netdevice.h  |  4 ++--
 include/net/sock.h         | 13 +++++++++-
 net/core/dev.c             | 10 ++++----
 net/core/net-sysfs.c       |  4 ++--
 net/core/sysctl_net_core.c |  8 +++----
 net/ipv4/af_inet.c         |  4 ++++
 net/ipv4/tcp.c             | 49 +++++++++++++++++---------------------
 net/ipv4/tcp_ipv4.c        | 11 +++++++--
 net/ipv6/tcp_ipv6.c        | 12 +++++++---
 9 files changed, 69 insertions(+), 46 deletions(-)

-- 
2.21.0.225.g810b269d1ac-goog


^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2019-03-22 19:15 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2019-03-21 22:17 [PATCH net-next 0/3] tcp: add rx/tx cache to reduce lock contention Eric Dumazet
2019-03-21 22:17 ` [PATCH net-next 1/3] net: convert rps_needed and rfs_needed to new static branch api Eric Dumazet
2019-03-22 16:01   ` kbuild test robot
2019-03-21 22:17 ` [PATCH net-next 2/3] tcp: add one skb cache for tx Eric Dumazet
2019-03-22 19:07   ` kbuild test robot
2019-03-21 22:17 ` [PATCH net-next 3/3] tcp: add one skb cache for rx Eric Dumazet
2019-03-21 22:52   ` Eric Dumazet
2019-03-21 22:25 ` [PATCH net-next 0/3] tcp: add rx/tx cache to reduce lock contention Soheil Hassas Yeganeh

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).