diff mbox series

[SMB3,client] allow deferred close timeout to be configurable

Message ID CAH2r5msJ6=LfoyGWyi94o+Z1FcJFdxpcLyPRz9K9gK5SpvPCUQ@mail.gmail.com (mailing list archive)
State New, archived
Headers show
Series [SMB3,client] allow deferred close timeout to be configurable | expand

Commit Message

Steve French Aug. 11, 2022, 6:02 a.m. UTC
Deferred close can be a very useful feature for very safely
allowing caching data for read, and for minimizing the number
of reopens needed for a file that is repeatedly opened and
close but there are workloads where its default (1 second,
similar to actimeo/acregmax) is too small.

Allow the user to configure the amount of time we can
defer sending the final smb3 close when we have a
handle lease on the file (rather than forcing it to depend
on 1 second or actimeo which is often unrelated).

Adds new mount parameter "closetime=" which is the maximum
number of seconds we can wait before sending an SMB3
close when we have a handle lease for it.  Default value
is unchanged at 1 second.

Comments

Steve French Aug. 11, 2022, 4:11 p.m. UTC | #1
Will fix the typos thanks.

There are a couple of minor differences from Bharath's earlier patch e.g.

"closetimeo" rather than "dclosetimeo" (I am ok if you prefer the longer name),
and also this mount option is printed in list of mount options if set.


On Thu, Aug 11, 2022 at 11:03 AM Paulo Alcantara <pc@cjr.nz> wrote:
>
> Steve French <smfrench@gmail.com> writes:
>
> > Deferred close can be a very useful feature for very safely
> > allowing caching data for read, and for minimizing the number
> > of reopens needed for a file that is repeatedly opened and
> > close but there are workloads where its default (1 second,
> > similar to actimeo/acregmax) is too small.
> >
> > Allow the user to configure the amount of time we can
> > defer sending the final smb3 close when we have a
> > handle lease on the file (rather than forcing it to depend
> > on 1 second or actimeo which is often unrelated).
> >
> > Adds new mount parameter "closetime=" which is the maximum
>                             ^^^^^^^^^ should be closetimeo
>
> > diff --git a/fs/cifs/cifsfs.c b/fs/cifs/cifsfs.c
> > index 945fb083cea7..af6114e17fb5 100644
> > --- a/fs/cifs/cifsfs.c
> > +++ b/fs/cifs/cifsfs.c
> > @@ -693,6 +693,8 @@ cifs_show_options(struct seq_file *s, struct dentry *root)
> >               seq_printf(s, ",acdirmax=%lu", cifs_sb->ctx->acdirmax / HZ);
> >               seq_printf(s, ",acregmax=%lu", cifs_sb->ctx->acregmax / HZ);
> >       }
> > +     if (cifs_sb->ctx->closetimeo != cifs_sb->ctx->acregmax)
> > +             seq_printf(s, ",closetimeo=%lu", cifs_sb->ctx->closetimeo / HZ);
>
> Hrm - I think you can rid of this check.  I'd rather print it out
> unconditionally.
>
> > diff --git a/fs/cifs/fs_context.h b/fs/cifs/fs_context.h
> > index 5f093cb7e9b9..927a5f2f9919 100644
> > --- a/fs/cifs/fs_context.h
> > +++ b/fs/cifs/fs_context.h
> > @@ -125,6 +125,7 @@ enum cifs_param {
> >       Opt_actimeo,
> >       Opt_acdirmax,
> >       Opt_acregmax,
> > +     Opt_closetimeo,
> >       Opt_echo_interval,
> >       Opt_max_credits,
> >       Opt_snapshot,
> > @@ -247,6 +248,8 @@ struct smb3_fs_context {
> >       /* attribute cache timemout for files and directories in jiffies */
> >       unsigned long acregmax;
> >       unsigned long acdirmax;
> > +     /* timeout for deferred close of files in jiffies */
>                                                   ^^^^^^^ seconds
>
> Otherwise, looks good to me.
>
> Reviewed-by: Paulo Alcantara (SUSE) <pc@cjr.nz>



--
Thanks,

Steve
Paulo Alcantara Aug. 11, 2022, 4:16 p.m. UTC | #2
Steve French <smfrench@gmail.com> writes:

> Will fix the typos thanks.

Thanks.

> There are a couple of minor differences from Bharath's earlier patch e.g.
>
> "closetimeo" rather than "dclosetimeo" (I am ok if you prefer the longer name),
> and also this mount option is printed in list of mount options if set.

Both look good to me.  I personally don't care much about naming,
though.
Steve French Aug. 11, 2022, 4:48 p.m. UTC | #3
The "jiffies vs. seconds" in comment was the only suggestion I didn't include.
See updated patch v2 (attached), I made minor updates.  Added the
Suggested-by from Bharath. Moved the defines for default/max to
different name with SMB3 (and in fs_context.h) since it is an smb3
feature (so not confused with cifs).  I increased the default to 5
seconds (although that is still lower than some other clients - it
should help perf.  As you suggested, unconditionally print the value
used on the mount.
for some workloads).

On Thu, Aug 11, 2022 at 11:16 AM Paulo Alcantara <pc@cjr.nz> wrote:
>
> Steve French <smfrench@gmail.com> writes:
>
> > Will fix the typos thanks.
>
> Thanks.
>
> > There are a couple of minor differences from Bharath's earlier patch e.g.
> >
> > "closetimeo" rather than "dclosetimeo" (I am ok if you prefer the longer name),
> > and also this mount option is printed in list of mount options if set.
>
> Both look good to me.  I personally don't care much about naming,
> though.
ronnie sahlberg Aug. 12, 2022, 1:10 a.m. UTC | #4
On Fri, 12 Aug 2022 at 03:17, Steve French <smfrench@gmail.com> wrote:
>
> The "jiffies vs. seconds" in comment was the only suggestion I didn't include.
> See updated patch v2 (attached), I made minor updates.  Added the
> Suggested-by from Bharath. Moved the defines for default/max to
> different name with SMB3 (and in fs_context.h) since it is an smb3
> feature (so not confused with cifs).  I increased the default to 5
> seconds (although that is still lower than some other clients - it
> should help perf.  As you suggested, unconditionally print the value
> used on the mount.
> for some workloads).

nack.
The problem with this is that it is a mount option that is impossible
for a sys admin to set correctly.

If we need this as a mount option we need documentation on it too.

1, How does a sys admin determine that there is an issue and that
changing this value will  fix it?
2, How does a sys admin determine what to set it to?

To me it seems this is an option that can only be used by developers
and thus it should not be
a mount option. We have too many ad-hoc mount options that end users
can not use correctly as it is.


>
> On Thu, Aug 11, 2022 at 11:16 AM Paulo Alcantara <pc@cjr.nz> wrote:
> >
> > Steve French <smfrench@gmail.com> writes:
> >
> > > Will fix the typos thanks.
> >
> > Thanks.
> >
> > > There are a couple of minor differences from Bharath's earlier patch e.g.
> > >
> > > "closetimeo" rather than "dclosetimeo" (I am ok if you prefer the longer name),
> > > and also this mount option is printed in list of mount options if set.
> >
> > Both look good to me.  I personally don't care much about naming,
> > though.
>
>
>
> --
> Thanks,
>
> Steve
Steve French Aug. 12, 2022, 1:20 a.m. UTC | #5
I am planning to document this (one reason I made the mount option
name a bit shorter, and tried to make the defaults a bit more
intuitive)

We have workloads where we need this (e.g. cases where they want to
read cache files more aggressively, but safely - but the app closes
the file)

My main short term issue is how to separate it from actimeo which is
unrelated (and somewhat unsafe).

I do plan to update the man page for mount.cifs, but we definitely
need to be able to configure this.  Remember we recently had a bug
where it would have helped investigate it.

The main example I can think of is apps that do:

open/read/close, open/read/close, repeatedly with other clients
occasionally reading or writing the file.   Currently we only cache
the file for 1 second after close. Windows for longer.  Our goal is to
allow this as a performance tuning recommendation for advanced users
until we can pick an optimum value (probably pretty long).

I am fine with documenting this.   My intent was to document it
similar to the following:
- indicate it is an advanced tuning parameter, and its default is fine for many
- indicate that if your apps open many, many files, you may want to
consider setting it smaller if your server is resource constrained, to
put less load on your server (especially if your apps do not
repeatedly reopen the same files over and over)
- indicate that if you have a workload where you want to cache files
for long periods safely, and these files are only occasionally
accessed by other clients, then consider setting it longer.  We have
some example workloads that we were asked about this e.g.


On Thu, Aug 11, 2022 at 8:10 PM ronnie sahlberg
<ronniesahlberg@gmail.com> wrote:
>
> On Fri, 12 Aug 2022 at 03:17, Steve French <smfrench@gmail.com> wrote:
> >
> > The "jiffies vs. seconds" in comment was the only suggestion I didn't include.
> > See updated patch v2 (attached), I made minor updates.  Added the
> > Suggested-by from Bharath. Moved the defines for default/max to
> > different name with SMB3 (and in fs_context.h) since it is an smb3
> > feature (so not confused with cifs).  I increased the default to 5
> > seconds (although that is still lower than some other clients - it
> > should help perf.  As you suggested, unconditionally print the value
> > used on the mount.
> > for some workloads).
>
> nack.
> The problem with this is that it is a mount option that is impossible
> for a sys admin to set correctly.
>
> If we need this as a mount option we need documentation on it too.
>
> 1, How does a sys admin determine that there is an issue and that
> changing this value will  fix it?
> 2, How does a sys admin determine what to set it to?
>
> To me it seems this is an option that can only be used by developers
> and thus it should not be
> a mount option. We have too many ad-hoc mount options that end users
> can not use correctly as it is.
>
>
> >
> > On Thu, Aug 11, 2022 at 11:16 AM Paulo Alcantara <pc@cjr.nz> wrote:
> > >
> > > Steve French <smfrench@gmail.com> writes:
> > >
> > > > Will fix the typos thanks.
> > >
> > > Thanks.
> > >
> > > > There are a couple of minor differences from Bharath's earlier patch e.g.
> > > >
> > > > "closetimeo" rather than "dclosetimeo" (I am ok if you prefer the longer name),
> > > > and also this mount option is printed in list of mount options if set.
> > >
> > > Both look good to me.  I personally don't care much about naming,
> > > though.
> >
> >
> >
> > --
> > Thanks,
> >
> > Steve
Shyam Prasad N Aug. 12, 2022, 4:06 a.m. UTC | #6
On Fri, Aug 12, 2022 at 6:50 AM Steve French <smfrench@gmail.com> wrote:
>
> I am planning to document this (one reason I made the mount option
> name a bit shorter, and tried to make the defaults a bit more
> intuitive)
>
> We have workloads where we need this (e.g. cases where they want to
> read cache files more aggressively, but safely - but the app closes
> the file)
>
> My main short term issue is how to separate it from actimeo which is
> unrelated (and somewhat unsafe).
>
> I do plan to update the man page for mount.cifs, but we definitely
> need to be able to configure this.  Remember we recently had a bug
> where it would have helped investigate it.
>
> The main example I can think of is apps that do:
>
> open/read/close, open/read/close, repeatedly with other clients
> occasionally reading or writing the file.   Currently we only cache
> the file for 1 second after close. Windows for longer.  Our goal is to
> allow this as a performance tuning recommendation for advanced users
> until we can pick an optimum value (probably pretty long).
>
> I am fine with documenting this.   My intent was to document it
> similar to the following:
> - indicate it is an advanced tuning parameter, and its default is fine for many
> - indicate that if your apps open many, many files, you may want to
> consider setting it smaller if your server is resource constrained, to
> put less load on your server (especially if your apps do not
> repeatedly reopen the same files over and over)
> - indicate that if you have a workload where you want to cache files
> for long periods safely, and these files are only occasionally
> accessed by other clients, then consider setting it longer.  We have
> some example workloads that we were asked about this e.g.
>
>
> On Thu, Aug 11, 2022 at 8:10 PM ronnie sahlberg
> <ronniesahlberg@gmail.com> wrote:
> >
> > On Fri, 12 Aug 2022 at 03:17, Steve French <smfrench@gmail.com> wrote:
> > >
> > > The "jiffies vs. seconds" in comment was the only suggestion I didn't include.
> > > See updated patch v2 (attached), I made minor updates.  Added the
> > > Suggested-by from Bharath. Moved the defines for default/max to
> > > different name with SMB3 (and in fs_context.h) since it is an smb3
> > > feature (so not confused with cifs).  I increased the default to 5
> > > seconds (although that is still lower than some other clients - it
> > > should help perf.  As you suggested, unconditionally print the value
> > > used on the mount.
> > > for some workloads).
> >
> > nack.
> > The problem with this is that it is a mount option that is impossible
> > for a sys admin to set correctly.
> >
> > If we need this as a mount option we need documentation on it too.
> >
> > 1, How does a sys admin determine that there is an issue and that
> > changing this value will  fix it?
> > 2, How does a sys admin determine what to set it to?
> >
> > To me it seems this is an option that can only be used by developers
> > and thus it should not be
> > a mount option. We have too many ad-hoc mount options that end users
> > can not use correctly as it is.
> >
> >
> > >
> > > On Thu, Aug 11, 2022 at 11:16 AM Paulo Alcantara <pc@cjr.nz> wrote:
> > > >
> > > > Steve French <smfrench@gmail.com> writes:
> > > >
> > > > > Will fix the typos thanks.
> > > >
> > > > Thanks.
> > > >
> > > > > There are a couple of minor differences from Bharath's earlier patch e.g.
> > > > >
> > > > > "closetimeo" rather than "dclosetimeo" (I am ok if you prefer the longer name),
> > > > > and also this mount option is printed in list of mount options if set.
> > > >
> > > > Both look good to me.  I personally don't care much about naming,
> > > > though.
> > >
> > >
> > >
> > > --
> > > Thanks,
> > >
> > > Steve
>
>
>
> --
> Thanks,
>
> Steve

While I understand the concern that having too many options can be
confusing for users, these are the most fine grained tuning knobs
available to us.
Anything else today (procfs entry, module parameter etc) are not at
the level of each mounted filesystem.
As Steve said, this could be configured by advanced users, based on
the workload. The default should be good enough for regular users.
The patch looks good to me.

For the number of mount options the user has at his/her disposal, I
feel that we should work on a profile=X mount option.
Based on the value of X, which describes the user workload, we could
internally decide on the values of multiple fine tunable mount
options.
We should have a smaller set of values for X, based on different type
of workloads, and the default values of other mount options based on
this value.
Thoughts?
diff mbox series

Patch

From 464efd4fec1eed5d34a0953c23dea951b9f528b1 Mon Sep 17 00:00:00 2001
From: Steve French <stfrench@microsoft.com>
Date: Thu, 11 Aug 2022 00:53:00 -0500
Subject: [PATCH] smb3: allow deferred close timeout to be configurable

Deferred close can be a very useful feature for allowing
caching data for read, and for minimizing the number of
reopens needed for a file that is repeatedly opened and
close but there are workloads where its default (1 second,
similar to actimeo/acregmax) is too small.

Allow the user to configure the amount of time we can
defer sending the final smb3 close when we have a
handle lease on the file (rather than forcing it to depend
on 1 second or actimeo which is often unrelated).

Adds new mount parameter "closetime=" which is the maximum
number of seconds we can wait before sending an SMB3
close when we have a handle lease for it.  Default value
is unchanged at 1 second.

Signed-off-by: Steve French <stfrench@microsoft.com>
---
 fs/cifs/cifsfs.c     | 2 ++
 fs/cifs/connect.c    | 2 ++
 fs/cifs/file.c       | 4 ++--
 fs/cifs/fs_context.c | 9 +++++++++
 fs/cifs/fs_context.h | 3 +++
 5 files changed, 18 insertions(+), 2 deletions(-)

diff --git a/fs/cifs/cifsfs.c b/fs/cifs/cifsfs.c
index 945fb083cea7..af6114e17fb5 100644
--- a/fs/cifs/cifsfs.c
+++ b/fs/cifs/cifsfs.c
@@ -693,6 +693,8 @@  cifs_show_options(struct seq_file *s, struct dentry *root)
 		seq_printf(s, ",acdirmax=%lu", cifs_sb->ctx->acdirmax / HZ);
 		seq_printf(s, ",acregmax=%lu", cifs_sb->ctx->acregmax / HZ);
 	}
+	if (cifs_sb->ctx->closetimeo != cifs_sb->ctx->acregmax)
+		seq_printf(s, ",closetimeo=%lu", cifs_sb->ctx->closetimeo / HZ);
 
 	if (tcon->ses->chan_max > 1)
 		seq_printf(s, ",multichannel,max_channels=%zu",
diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c
index 7f205a9a2de4..9111c025bcb8 100644
--- a/fs/cifs/connect.c
+++ b/fs/cifs/connect.c
@@ -2681,6 +2681,8 @@  compare_mount_options(struct super_block *sb, struct cifs_mnt_data *mnt_data)
 		return 0;
 	if (old->ctx->acdirmax != new->ctx->acdirmax)
 		return 0;
+	if (old->ctx->closetimeo != new->ctx->closetimeo)
+		return 0;
 
 	return 1;
 }
diff --git a/fs/cifs/file.c b/fs/cifs/file.c
index 42f2639a1a66..2c5eae7d31f4 100644
--- a/fs/cifs/file.c
+++ b/fs/cifs/file.c
@@ -964,12 +964,12 @@  int cifs_close(struct inode *inode, struct file *file)
 				 * So, Increase the ref count to avoid use-after-free.
 				 */
 				if (!mod_delayed_work(deferredclose_wq,
-						&cfile->deferred, cifs_sb->ctx->acregmax))
+						&cfile->deferred, cifs_sb->ctx->closetimeo))
 					cifsFileInfo_get(cfile);
 			} else {
 				/* Deferred close for files */
 				queue_delayed_work(deferredclose_wq,
-						&cfile->deferred, cifs_sb->ctx->acregmax);
+						&cfile->deferred, cifs_sb->ctx->closetimeo);
 				cfile->deferred_close_scheduled = true;
 				spin_unlock(&cinode->deferred_lock);
 				return 0;
diff --git a/fs/cifs/fs_context.c b/fs/cifs/fs_context.c
index 8dc0d923ef6a..28a339c57beb 100644
--- a/fs/cifs/fs_context.c
+++ b/fs/cifs/fs_context.c
@@ -147,6 +147,7 @@  const struct fs_parameter_spec smb3_fs_parameters[] = {
 	fsparam_u32("actimeo", Opt_actimeo),
 	fsparam_u32("acdirmax", Opt_acdirmax),
 	fsparam_u32("acregmax", Opt_acregmax),
+	fsparam_u32("closetimeo", Opt_closetimeo),
 	fsparam_u32("echo_interval", Opt_echo_interval),
 	fsparam_u32("max_credits", Opt_max_credits),
 	fsparam_u32("handletimeout", Opt_handletimeout),
@@ -1074,6 +1075,13 @@  static int smb3_fs_context_parse_param(struct fs_context *fc,
 		}
 		ctx->acdirmax = ctx->acregmax = HZ * result.uint_32;
 		break;
+	case Opt_closetimeo:
+		ctx->closetimeo = HZ * result.uint_32;
+		if (ctx->closetimeo > CIFS_MAX_ACTIMEO) {
+			cifs_errorf(fc, "closetimeo too large\n");
+			goto cifs_parse_mount_err;
+		}
+		break;
 	case Opt_echo_interval:
 		ctx->echo_interval = result.uint_32;
 		break;
@@ -1521,6 +1529,7 @@  int smb3_init_fs_context(struct fs_context *fc)
 
 	ctx->acregmax = CIFS_DEF_ACTIMEO;
 	ctx->acdirmax = CIFS_DEF_ACTIMEO;
+	ctx->closetimeo = CIFS_DEF_ACTIMEO;
 
 	/* Most clients set timeout to 0, allows server to use its default */
 	ctx->handle_timeout = 0; /* See MS-SMB2 spec section 2.2.14.2.12 */
diff --git a/fs/cifs/fs_context.h b/fs/cifs/fs_context.h
index 5f093cb7e9b9..927a5f2f9919 100644
--- a/fs/cifs/fs_context.h
+++ b/fs/cifs/fs_context.h
@@ -125,6 +125,7 @@  enum cifs_param {
 	Opt_actimeo,
 	Opt_acdirmax,
 	Opt_acregmax,
+	Opt_closetimeo,
 	Opt_echo_interval,
 	Opt_max_credits,
 	Opt_snapshot,
@@ -247,6 +248,8 @@  struct smb3_fs_context {
 	/* attribute cache timemout for files and directories in jiffies */
 	unsigned long acregmax;
 	unsigned long acdirmax;
+	/* timeout for deferred close of files in jiffies */
+	unsigned long closetimeo;
 	struct smb_version_operations *ops;
 	struct smb_version_values *vals;
 	char *prepath;
-- 
2.34.1