Re: [PATCH net-next] net/smc: introduce shadow sockets for fallback connections

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 





On 3/23/23 1:09 AM, Wenjia Zhang wrote:


On 21.03.23 08:19, Kai Shen wrote:
SMC-R performs not so well on fallback situations right now,
especially on short link server fallback occasions. We are planning
to make SMC-R widely used and handling this fallback performance
issue is really crucial to us. Here we introduce a shadow socket
method to try to relief this problem.

Could you please elaborate the problem?

Here is the background. We are using SMC-R to accelerate server-client applications by using SMC-R on server side, but not all clients use SMC-R. So in these occasions we hope that the clients using SMC-R get acceleration while the clients that fallback to TCP will get the performance no worse than TCP.
What's more, in short link scenario we may use fallback on purpose for
SMC-R perform badly with its highly cost connection establishing path.
So it is very important that SMC-R perform similarly as TCP on fallback occasions since we use SMC-R as a acceleration method and performance compromising should not happen when user use TCP client to connect a SMC-R server. In our tests, fallback SMC-R accepting path on server-side contribute to the performance gap compared to TCP a lot as mentioned in the patch and we are trying to solve this problem.


Generally, I don't have a good feeling about the two non-listenning sockets, and I can not see why it is necessary to introduce the socket actsock instead of using the clcsock itself. Maybe you can convince me with a good reason.

First let me explain why we use two sockets here.
We want the fallback accept path to be similar as TCP so all the fallback connection requests should go to the fallback sock(accept queue) and go a shorter path (bypass tcp_listen_work) while clcsock contains both requests with syn_smc and fallback requests. So we pick requests with syn_smc to actsock and fallback requests to fbsock. I think it is the right strategy that we have two queues for two types of incoming requests (which will lead to good performance too).
On the other hand, the implementation of this strategy is worth discussing.
As Paolo said, in this implementation only the shadow socket's receive queue is needed. I use this two non-listenning sockets for these following reasons. 1. If we implement a custom accept, some of the symbols are not accessible since they are not exported(like mem_cgroup_charge_skmem).
2. Here we reuse the accept path of TCP so that the future update of TCP
may not lead to problems caused by the difference between the custom accept and future TCP accept. 3. SMC-R is trying to behave like TCP and if we implement custom accept, there may be repeated code and looks not cool.

Well, i think two queues is the right strategy but I am not so sure about which implement is better and we really want to solve this problem. Please give advice.

+static inline bool tcp_reqsk_queue_empty(struct sock *sk)
+{
+    struct inet_connection_sock *icsk = inet_csk(sk);
+    struct request_sock_queue *queue = &icsk->icsk_accept_queue;
+
+    return reqsk_queue_empty(queue);
+}
+
Since this is only used by smc, I'd like to suggest to use smc_tcp_reqsk_queue_empty instead of tcp_reqsk_queue_empty.

Will do.

Thanks

Kai



[Index of Archives]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Photo]     [Yosemite News]     [Yosemite Photos]     [Linux Kernel]     [Linux SCSI]     [XFree86]

  Powered by Linux