RE: Re: [PATCH v2 4/6] Reduce server smbdirect max send/receive segment sizes

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

 




> -----Original Message-----
> From: Tom Talpey <tom@xxxxxxxxxx>
> Sent: Wednesday, 28 September 2022 16:54
> To: Bernard Metzler <BMT@xxxxxxxxxxxxxx>; Namjae Jeon
> <linkinjeon@xxxxxxxxxx>
> Cc: smfrench@xxxxxxxxx; linux-cifs@xxxxxxxxxxxxxxx;
> senozhatsky@xxxxxxxxxxxx; longli@xxxxxxxxxxxxx; dhowells@xxxxxxxxxx
> Subject: [EXTERNAL] Re: [PATCH v2 4/6] Reduce server smbdirect max
> send/receive segment sizes
> 
> On 9/27/2022 10:59 AM, Bernard Metzler wrote:
> >
> >
> >> -----Original Message-----
> >> From: Tom Talpey <tom@xxxxxxxxxx>
> >> Sent: Monday, 26 September 2022 19:25
> >> To: Namjae Jeon <linkinjeon@xxxxxxxxxx>
> >> Cc: smfrench@xxxxxxxxx; linux-cifs@xxxxxxxxxxxxxxx;
> >> senozhatsky@xxxxxxxxxxxx; Bernard Metzler <BMT@xxxxxxxxxxxxxx>;
> >> longli@xxxxxxxxxxxxx; dhowells@xxxxxxxxxx
> >> Subject: [EXTERNAL] Re: [PATCH v2 4/6] Reduce server smbdirect max
> >> send/receive segment sizes
> >>
> >> On 9/25/2022 9:13 PM, Namjae Jeon wrote:
> >>> 2022-09-26 0:41 GMT+09:00, Tom Talpey <tom@xxxxxxxxxx>:
> >>>> On 9/24/2022 11:40 PM, Namjae Jeon wrote:
> >>>>> 2022-09-24 6:53 GMT+09:00, Tom Talpey <tom@xxxxxxxxxx>:
> >>>>>> Reduce ksmbd smbdirect max segment send and receive size to 1364
> >>>>>> to match protocol norms. Larger buffers are unnecessary and add
> >>>>>> significant memory overhead.
> >>>>>>
> >>>>>> Signed-off-by: Tom Talpey <tom@xxxxxxxxxx>
> >>>>>> ---
> >>>>>>     fs/ksmbd/transport_rdma.c | 4 ++--
> >>>>>>     1 file changed, 2 insertions(+), 2 deletions(-)
> >>>>>>
> >>>>>> diff --git a/fs/ksmbd/transport_rdma.c b/fs/ksmbd/transport_rdma.c
> >>>>>> index 494b8e5af4b3..0315bca3d53b 100644
> >>>>>> --- a/fs/ksmbd/transport_rdma.c
> >>>>>> +++ b/fs/ksmbd/transport_rdma.c
> >>>>>> @@ -62,13 +62,13 @@ static int smb_direct_receive_credit_max = 255;
> >>>>>>     static int smb_direct_send_credit_target = 255;
> >>>>>>
> >>>>>>     /* The maximum single message size can be sent to remote peer */
> >>>>>> -static int smb_direct_max_send_size = 8192;
> >>>>>> +static int smb_direct_max_send_size = 1364;
> >>>>>>
> >>>>>>     /*  The maximum fragmented upper-layer payload receive size
> >> supported
> >>>>>> */
> >>>>>>     static int smb_direct_max_fragmented_recv_size = 1024 * 1024;
> >>>>>>
> >>>>>>     /*  The maximum single-message size which can be received */
> >>>>>> -static int smb_direct_max_receive_size = 8192;
> >>>>>> +static int smb_direct_max_receive_size = 1364;
> >>>>> Can I know what value windows server set to ?
> >>>>>
> >>>>> I can see the following settings for them in MS-SMBD.pdf
> >>>>> Connection.MaxSendSize is set to 1364.
> >>>>> Connection.MaxReceiveSize is set to 8192.
> >>>>
> >>>> Glad you asked, it's an interesting situation IMO.
> >>>>
> >>>> In MS-SMBD, the following are documented as behavior notes:
> >>>>
> >>>> Client-side (active connect):
> >>>>     Connection.MaxSendSize is set to 1364.
> >>>>     Connection.MaxReceiveSize is set to 8192.
> >>>>
> >>>> Server-side (passive listen):
> >>>>     Connection.MaxSendSize is set to 1364.
> >>>>     Connection.MaxReceiveSize is set to 8192.
> >>>>
> >>>> However, these are only the initial values. During SMBD
> >>>> negotiation, the two sides adjust downward to the other's
> >>>> maximum. Therefore, Windows connecting to Windows will use
> >>>> 1364 on both sides.
> >>>>
> >>>> In cifs and ksmbd, the choices were messier:
> >>>>
> >>>> Client-side smbdirect.c:
> >>>>     int smbd_max_send_size = 1364;
> >>>>     int smbd_max_receive_size = 8192;
> >>>>
> >>>> Server-side transport_rdma.c:
> >>>>     static int smb_direct_max_send_size = 8192;
> >>>>     static int smb_direct_max_receive_size = 8192;
> >>>>
> >>>> Therefore, peers connecting to ksmbd would typically end up
> >>>> negotiating 1364 for send and 8192 for receive.
> >>>>
> >>>> There is almost no good reason to use larger buffers. Because
> >>>> RDMA is highly efficient, and the smbdirect protocol trivially
> >>>> fragments longer messages, there is no significant performance
> >>>> penalty.
> >>>>
> >>>> And, because not many SMB3 messages require 8192 bytes over
> >>>> smbdirect, it's a colossal waste of virtually contiguous kernel
> >>>> memory to allocate 8192 to all receives.
> >>>>
> >>>> By setting all four to the practical reality of 1364, it's a
> >>>> consistent and efficient default, and aligns Linux smbdirect
> >>>> with Windows.
> >>> Thanks for your detailed explanation!  Agree to set both to 1364 by
> >>> default, Is there any usage to increase it? I wonder if users need any
> >>> configuration parameters to adjust them.
> >>
> >> In my opinion, probably not. I give some reasons why large fragments
> >> aren't always helpful just above. It's the same number of packets! Just
> >> a question of whether SMBDirect or Ethernet does the fragmentation, and
> >> the buffer management.
> >>
> >
> > One simple reason for larger buffers I am aware of is running
> > efficiently on software only RDMA providers like siw or rxe.
> > For siw I'd guess we cut to less than half the performance with
> > 1364 bytes buffers. But maybe that is no concern for the setups
> > you have in mind.
> 
> I'm skeptical of "less than half" the performance, and wonder why
> that might be, but...
> 
> Again, it's rather uncommon that these inline messages are ever
> large. Bulk data (r/w >=4KB) is always carried by RDMA, and does
> not appear at all in these datagrams, for example.
> 
> The code currently has a single system-wide default, which is not
> tunable per connection and requires both sides of the connection
> to do so. It's not reasonable to depend on Windows, cifs.ko and
> ksmbd.ko to all somehow magically do the same thing. So the best
> default is the most conservative, least wasteful setting.
> 

Oh, sorry, my bad. I was under the impression we talk about bulk
data, if 8k buffers are the default. So I completely agree with
your point.

Best,
Bernard.

> Tom.
> 
> 
> > Best,
> > Bernard.
> >
> >> There might conceivably be a case for *smaller*, for example on IB when
> >> it's cranked down to the minimum (256B) MTU. But it will work with this
> >> default.
> >>
> >> I'd say let's don't over-engineer it until we address the many other
> >> issues in this code. Merging the two smbdirect implementations is much
> >> more important than adding tweaky little knobs to both. MHO.
> >>
> >> Tom.
> >>
> >>>>>
> >>>>> Why does the specification describe setting it to 8192?
> >>>>>>
> >>>>>>     static int smb_direct_max_read_write_size = SMBD_DEFAULT_IOSIZE;
> >>>>>>
> >>>>>> --
> >>>>>> 2.34.1
> >>>>>>
> >>>>>>
> >>>>>
> >>>>
> >>>




[Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux