From: "J. Bruce Fields" <bfields@fieldses.org>
To: Sachin Prabhu <sprabhu@redhat.com>
Cc: linux-nfs <linux-nfs@vger.kernel.org>
Subject: Re: Should we be aggressively invalidating cache when using -onolock?
Date: Fri, 17 Sep 2010 13:46:44 -0400 [thread overview]
Message-ID: <20100917174644.GD25515@fieldses.org> (raw)
In-Reply-To: <29790688.25.1284726394683.JavaMail.sprabhu@dhcp-1-233.fab.redhat.com>
On Fri, Sep 17, 2010 at 08:26:39AM -0400, Sachin Prabhu wrote:
> We came across an issue where the performance of an application using flocks on RHEL 4(2.6.9 kernel) was far better when compared to the performance of the same application on RHEL 5(2.6.18 kernel). The nfs client behavior when performing flocks on RHEL 4 and RHEL 5 differ. To ensure we had a level playing field, we repeated the tests using the mount option -o nolock.
>
> The performance on RHEL 5 improved slightly but was still pretty bad when compared to performance on RHEL 4. On closer observation, it was seen that there are a large number of READ requests on RHEL 5 while on RHEL 4 there were hardly any. This difference in behavior was caused by the code which invalidates the cache in the do_setlk() function and results in the RHEL 5 client performing a large number of READ requests.
>
> In this case, the files were only being accessed by one client. This is why the nolock mount option was used. When running such workloads, the aggressive invalidation of the cache is unnecessary. This patch improves the performance in such a scenario.
Makes sense to me.
(Is it possible that somebody might depend on lock/unlock to keep their
meaning of "invalidate cache/flush changes" even when they don't care
bout checking for inter-client lock conflicts? That sounds like an odd
use case to me.)
--b.
>
> Is this a good idea?
>
> The patch will need to be respinned to accomodate Suresh Jayaraman's patch introducing '-olocal_lock'.
>
> Sachin Prabhu
> nfs: Skip zapping caches when using -o nolock
>
> When using -onolock, it is assumed that the file will not be accessed/modified from multiple sources. In such cases, aggressive invalidation of cache is not required.
>
> Signed-off-by: Sachin S. Prabhu <sprabhu@redhat.com>
>
> diff --git a/fs/nfs/file.c b/fs/nfs/file.c
> index eb51bd6..bfd9c1a 100644
> --- a/fs/nfs/file.c
> +++ b/fs/nfs/file.c
> @@ -733,24 +733,22 @@ static int do_vfs_lock(struct file *file, struct file_lock *fl)
> static int do_unlk(struct file *filp, int cmd, struct file_lock *fl)
> {
> struct inode *inode = filp->f_mapping->host;
> - int status;
> +
> + /* NOTE: special case
> + * If we're signalled while cleaning up locks on process exit, we
> + * still need to complete the unlock.
> + */
> +
> + /* Use local locking if mounted with "-onolock" */
> + if (NFS_SERVER(inode)->flags & NFS_MOUNT_NONLM)
> + return do_vfs_lock(filp, fl);
>
> /*
> * Flush all pending writes before doing anything
> * with locks..
> */
> nfs_sync_mapping(filp->f_mapping);
> -
> - /* NOTE: special case
> - * If we're signalled while cleaning up locks on process exit, we
> - * still need to complete the unlock.
> - */
> - /* Use local locking if mounted with "-onolock" */
> - if (!(NFS_SERVER(inode)->flags & NFS_MOUNT_NONLM))
> - status = NFS_PROTO(inode)->lock(filp, cmd, fl);
> - else
> - status = do_vfs_lock(filp, fl);
> - return status;
> + return NFS_PROTO(inode)->lock(filp, cmd, fl);
> }
>
> static int do_setlk(struct file *filp, int cmd, struct file_lock *fl)
> @@ -759,6 +757,15 @@ static int do_setlk(struct file *filp, int cmd, struct file_lock *fl)
> int status;
>
> /*
> + * Use local locking and skip cache writeback or invalidation
> + * if mounted with "-onolock"
> + */
> + if (NFS_SERVER(inode)->flags & NFS_MOUNT_NONLM) {
> + status = do_vfs_lock(filp, fl);
> + goto out;
> + }
> +
> + /*
> * Flush all pending writes before doing anything
> * with locks..
> */
> @@ -766,11 +773,7 @@ static int do_setlk(struct file *filp, int cmd, struct file_lock *fl)
> if (status != 0)
> goto out;
>
> - /* Use local locking if mounted with "-onolock" */
> - if (!(NFS_SERVER(inode)->flags & NFS_MOUNT_NONLM))
> - status = NFS_PROTO(inode)->lock(filp, cmd, fl);
> - else
> - status = do_vfs_lock(filp, fl);
> + status = NFS_PROTO(inode)->lock(filp, cmd, fl);
> if (status < 0)
> goto out;
> /*
next prev parent reply other threads:[~2010-09-17 17:47 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <1103741.22.1284726314119.JavaMail.sprabhu@dhcp-1-233.fab.redhat.com>
2010-09-17 12:26 ` Should we be aggressively invalidating cache when using -onolock? Sachin Prabhu
2010-09-17 17:46 ` J. Bruce Fields [this message]
2010-09-18 11:09 ` Jeff Layton
2010-09-19 18:53 ` J. Bruce Fields
2010-09-20 14:41 ` Chuck Lever
2010-09-20 18:25 ` J. Bruce Fields
2010-10-05 14:27 ` Jeff Layton
2010-10-05 15:19 ` Suresh Jayaraman
[not found] ` <20101005102752.67b75416-9yPaYZwiELC+kQycOl6kW4xkIHaj4LzF@public.gmane.org>
2010-10-20 10:42 ` Sachin Prabhu
[not found] <14128115.54.1284995685991.JavaMail.sprabhu@dhcp-1-233.fab.redhat.com>
2010-09-20 15:15 ` Sachin Prabhu
2010-09-20 15:19 ` Chuck Lever
2010-09-20 15:34 ` Sachin Prabhu
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20100917174644.GD25515@fieldses.org \
--to=bfields@fieldses.org \
--cc=linux-nfs@vger.kernel.org \
--cc=sprabhu@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.